- 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
- 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
- {% for user in users %}
- {{ user.name }} {% endfor %}
73. Mail Header Injection