Web Security 101

download Web Security 101

If you can't read please download the document

description

My Dutch workshop for the PFZ.nl PHP Community November 19th 2011. It covers basic insights and tips for building safer websites.

Transcript of Web Security 101

  • 1. Websecurity 101 PFZ.nl workshopdag 19 november 2011 door Taco Vader

2. Wie...?

  • n-de jaars natuurkundestudent 3. Moderator op PFZ.nl 4. Self taughtPHP-er 5. Developerteam PFZ3 6. Eigenaar Crisp-e Webdevelopment

7. Wat gaan we doen?

  • Wat basis-info leren 8. HACKEN! (Penetration testing)
    • Only people who understand how attacks are carried out can be expected to be effective defenders. - SANS.org
  • Patchen 9. Random slides en vragen bespreken

10. Waarom!

  • Genoeg voorbeelden
    • Webwereld: Lektober 11. Bits of Freedom: Zwartboek datalekken 12. Tweakers, Fok, Twitter, Digid, Universiteit Utrecht, CheapTickets.nl, ...
  • Genoeg te verliezen
    • Privacygevoelige gegevens 13. Orders en refunds... geld! 14. Vertrouwen van bezoekers
  • Beveiliging is niet
    • Optioneel 15. Iets voor achteraf 16. Moeilijk

17. The Bad News

  • Zero-day exploitsworden meer gevonden en effectiever ingezet 18. Hackers scene verschuift van ethisch en naef naar professioneel crimineel 19. Per maand miljoenen aanvallen over HTTP 20. Als je een website online hebt, wordt die aangevallen. 21. Als georganiseerde professionele hackers je website neer willen halen, lukt dat vrijwel zeker

22. The Good News

  • Meeste aanvallen aspecifiek
    • Low-tech aanval 23. The Buffalo Theory
  • 99% van de hacks is simpel te voorkomen
    • Er is geen excuus voor SQL injectie
  • Experts werken dagelijks aan jouw bugs
    • Updaten, updaten, updaten!

24. Dus:

  • Wie heeft er een site gemaakt? 25. Online voor bezoekers? 26. Die privacygevoelige data bevat? 27. Die geld oplevert? 28. Wie is er wel eens gehackt? 29. Wie heeft er wel eens gehackt?

30. Tip 1 voor veiliger internet

  • Wantrouw input en output voorzichtig
    • Escape data voor het in SQL, HTML, etc wordt gezet 31. Nog beter: gebruik prepared statements en templates 32. Maak geen aannames over wat er binnenkomt of met welke waardes 33. Wil je pers de data uitvoeren of gebruiken als invoer, gebruik whitelists

34. Tip 2 voor veiliger internet

  • Wees krenterig met permissies
    • SQL-users met minimale rechten 35. php uitvoeren onder beperkte user 36. Geef users rollen en daarbij horende rechten

37. Tip 3 voor veiliger internet

  • Hou informatie voor jezelf
    • Log 404's, errors, verdachte handelingen, admin-acties 38. Laat je gebruiker een non-informatieve foutmelding zien 39. Geef geen informatie over versies, laatste updates, of achterliggende systemen

40. Tip 4 voor veiliger internet

  • Gebruik andermans kennis
    • Ga geen eigen oplossingen vinden als er standaarden voor bestaan 41. Schakel experts in waar nodig

42. Tip 5 voor veiliger internet

  • Blijf betrokken
    • Lees logs, ontdek verdachte handelingen 43. Draai updates 44. Leer nieuwe dingen en pas ze toe 45. Pas je veiligheid aan als de eisen veranderen

46. SQL injectie basics

  • Taco: 47. INSERT INTO users (name) VALUES ('Taco'); 48. Henk: 49. INSERT INTO users (name) VALUES ('Henk'); 50. Little Bobby Tables: 51. INSERT INTO users (name) VALUES ('Robert'); DROP TABLES Students;--');

$name=$_POST['name']; $result=mysql_query(INSERT INTO users (name) VALUES ('$name')); 52. SQL injectie basics

  • Taco: 53. SELECT * FROM users WHERE user_id=12; 54. Henk: 55. SELECT * FROM users WHERE user_id=34; 56. Bobby: 57. SELECT * FROM users WHERE user_id=1 OR 1;

$id=$_GET['id']; $result=mysql_query(SELECT * FROM users WHERE user_id=$id); 58. SQL injectie a short history

  • addslashes() 59. Magic quotes 60. mysql_escape_string() 61. mysql_real_escape_string()

62. vs SQLI: escapen

  • Magicquotes UIT, indien nodig stripslashes 63. Functies toepassen
    • mysql_real_escape_string() 64. sqlite_escape_string() 65. pg_escape_string()
  • Apostrofs eromheen, ook bij getallen! 66. Probleem: nooooooit vergeten...
    • In een functie of method stoppen helpt!
  • INSERT INTO users (name) VALUES ('Robert'); DROP TABLES Students;--');

67. vs SQLI:prepared statements

  • Vantevoren queryplan doorgeven
    • Extra voordeel: snelheid
  • Bijvoorbeeld met PDO:

$stf=new PDO("mysql:host=localhost;dbname=database;","root",""); $calories = 150; $colour = 'red'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->bindValue(':calories', $calories); $sth->bindValue(':colour', $colour); $sth->execute(); 68. XSS the basics

  • Cross Site Scripting
    • HTML injection 69. Bij elke echo of print
  • Bijvoorbeeld een userlist:
  • Taco V.
  • Bobby Tables
  • Layout H4x0r
  • Henk Da Man
  • Jimmy alert('Hoi!') Bob

70. vs XSS: htmlspecialchars()

  • htmlspecialchars()
    • Really. That's it. Meer hoef je niet te doen...
  • Maar let op:
    • Op ALLES: ook 'veilige' data uit de database 71. Op ALLES: nooit vergeten, lastig
  • Quotes, flags en charset moeten wel matchen

72. vs XSS: htmlspecialchars()

  • En nu met een template engine
                  • (Twig)
  • {% for user in users %}
  • {{ user.name }} {% endfor %}

73. Mail Header Injection