15. Doel van SSL
- Met wie praat ik? ( Integriteit )
- Veilig praten, encryptie ( Confidentialiteit )
16. A1. HTTPS bij formulieren
- Formulieren met gevoelige informatie over https:
- Denk aan: login, beheer webformulieren met persoonlijke data
- Hoe te checken?
18. A2. TLS
- TLS & SSL
- TLS is de nieuwe SSL maar worden in de volksmond beide SSL genoemd. SSL 3.0
is sinds juni 2015 echter deprecated en NIET veilig.
- Hoe te checken?
20. A3. Ciphers
- Een Cipher is de encryptie methode voor TLS requests
- Zorg dat deze methode ‘sterk’ is.
- >= 128 bit
- Geen bekende kwetsbaarheden
- Hoe check ik dat?
22. A4. Geldig Certificaat voor andere diensten
- Behalve de website zorg er ook voor dat andere diensten met een geldig certificaat
draaien.
23. A5. Strict-Transport-Security
- Header: Strict-Transport-Security, min max-age=3153600
- Alle huidige en toekomstige (sub)domeinen verlopen over HTTPS maximaal 1
jaar. Dit blokkeert toegang tot pagina's of subdomeinen die alleen over HTTP
kunnen worden weergegeven
31. B1. X-Frame-Options: deny
- Waarom? Om clickjacking tegen te gaan. Het is door het zetten van de header niet
meer mogelijk om de site middels een <iframe>, <frame> of <object> op een
andere site toe te voegen.
- Hoe te checken?
- Commands:
curl -k -s -D - https://localhost -o /dev/null
38. B3. Content-Type juiste charset
- Verschillende Charsets kunnen verschillend worden geïnterpreteerd.
- Content-type: text/html; charset=utf-8 . Benoem daarom de charset in een header.
curl -k https://localhost | grep -e 'meta.*charset'
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
In utf-7: +ADw-script +ADw-evil();+ADw-/script+ADw-
39. B4. Software namen / versienummers
- Specifieke versies van software kunnen exploits hebben. Een scraper kan dus
makkelijke bekijken welke servers kwetsbaar zijn en een aanval uitvoeren
- Hoe te checken?
HTTP headers: curl -k -s -D - https://localhost -o /dev/null
Meta-tags: curl -k https://localhost | grep -B99 "</head>"
40. B5. Versie nummers in metatags
- Waarom? Een bepaalde versie van software kan een exploit bevatten en deze is
makkelijk te signaleren.
Bijvoorbeeld:
- <meta name="generator" content="Drupal 7 (http://drupal.org)" />
42. B7. Outline in robots.txt
- Waarom? Het geeft mogelijke paden weer die bruikbaar kunnen zijn voor
exploits.
- Voorbeeld:
43. B7. Outline in robots.txt
- Waarom? Het geeft mogelijke paden weer die bruikbaar kunnen zijn voor
exploits.
- Paden weglaten waarop anonieme bezoekers een 403 krijgen (zoals /admin)
44. B8. HttpOnly & Secure Flag op Sessie cookies
- Waarom Secure Flag?
51. B8. HttpOnly & Secure Flag op Sessie cookies
Secure flag check in Chrome Developer tools.
52. B8. HttpOnly & Secure Flag op Sessie cookies
- HttpOnly zorgt ervoor dat Javascript niks met de cookie kan
- Hoe te checken?
- Controleren in Chrome voor HttpOnly:
Chrome: developer tools > Application > Storage > Cookies
Browser Javascript Console: document.cookie;
Of in developer tools bij response van POST /user:
Set-Cookie: SESSb6589...-...; Max-Age=2000000; path=/; HttpOnly
53. B9. HttpOnly-flag op andere cookies
- Behalve sessie cookies zijn er ook andere cookies met gevoelige informatie. Zorg
dat daar ook de HttpOnly flag op staat zodat javascript daar niet bij kan.
- Hoe te checken?
54. B10. Cache-Control: private
- Waarom? Gevoelig informatie wil je niet in de cache opslaan. (Denk aan Browser
cache en Proxy cache / CDN)
- Check de headers
Controleren in developer tools met authenticated requests
55. - TRACE is een http method die gebruikt wordt voor debugging. Het stuurt het
request precies terug zoals hij deze ontvangt.
- De HttpOnly flag zorgt ervoor dat JS niet bij de cookie kan. Maar bij een
xmlrequest met een de trace method kan je de cookie achterhalen gezien hij
letterlijk het request weer terugstuurt.
- Hoe te checken of Trace aan staat?
B11. TRACE
61. C2. Pad vatbaar voor XSS ( GET parameters )
- Is het pad of zijn get parameters vatbaar voor voor XSS?
- http:www.website.nl/search/site/<script>evil();</script>
- → Bitly.com/leukelink
- Alice -> klikt op de Bitly.com/leukelink
63. D1. Formulier velden & GET parameters
Invoer: “1 or 1=1”. Controleer output op afwijkingen.
$res = db_query(“SELECT * FROM user WHERE id = $_GET[id]”);
while ($item = db_fetch_row($res)) { .. }
// SELECT * FROM user WHERE id = 1 or 1=1
64. D2. Drupalgeddon
python drupalgeddon.py -t http://localhost -u trudy -p intruder
insert into users (status, uid, name, pass) SELECT 1, MAX(uid)+1, 'trudy',
'$S$DkIkdKLIvRK0iVHm99X7B/M8QC17E1Tp/kMOd1Ie8V/PgWjtAZld' FROM users
insert into users_roles (uid, rid) VALUES ((SELECT uid FROM users WHERE name
= 'admin'), 3)
66. CSRF
- CSRF Token zijn voor het zekerstellen dat bepaalde acties zijn uitgevoerd door
een bepaalde gebruiker vanaf het correcte formulier of link. De token is uniek
voor die gebruiker en sessie.
67. E1. Security Tokens op formulieren
- Elk formulier binnen Drupal heeft een CSRF token wanneer ingelogt
- Voorbeeld:
68. E2. Security Tokens op links
- Links die schade kunnen doen moeten ook gecontroleerd worden
- Voorbeeld:
- https://website.nl/admin/structure/block/manage/website/disable?token=nJ4PobF7
gcwZLQ5X7jkhnyts7q-R_I-WmMKtVmZvTas
70. F1. Blokkade na foute logins
- Waarom? Om bruteforce attacks te stoppen.
- Drupal zelf heeft de flood module.
71. F2. Logging aanwezig van blokkades
- Deze bruteforce attacks kunnen geanalyseerd worden en verdere stappen kunnen
ondernomen worden. Denk aan het blokkeren van IP adressen.
73. G1. Uploads van webformulieren openbaar
- www.mijngemeente.nl/sites/default/files/webforms/passpoort.pdf
- Maak “private files” de default
74. G2. Private Filepath
- Zet de private Filepath buiten de webroot.
- Private files kunnen dan nooit direct uit de webserver worden geserveerd.
75. G3. Responsible disclosure
- Maak het mogelijk om veiligheidslekken veilig te melden.
- De juiste informatie komt bij de juiste mensen terecht ipv info@bedrijf.nl.
- Voorbeeld: https://hackerone.com
78. H1. Via ander domein te benaderen
http://www.website.nl
Eve
user/password
Host: evil.nl
79. H1. Via ander domein te benaderen
http://www.website.nl
Alice
Mail
evil.nl/user/reset?token=asd...
80. H1. Via ander domein te benaderen
http://www.website.nl
Alice
Mail
evil.nl/user/reset?token=asd...
http://www.evil.nl/user/reset?token=....
.
81. H1. Via ander domein te benaderen
http://www.website.nl
Eve
user/reset?token=....
Alice
82. H1. Via ander domein te benaderen
curl -H 'Host: evil.host' -v localhost
Oplossing:
Trusted host setting (D8) of custom code in settings.php (<= D7)
If (!drupal_is_cli() && $_SERVER[‘HTTP_HOST’] != ‘example.com’)
die(‘Wrong host’);
83. H2. .php in files folder uitvoerbaar
- Maak PHP file: <?php phpinfo(); ?> in /var/www/html/sites/default/files
- Upload via forms, publieke FTP (?), tinymce browser etc.
- Vraag file op via browser
84. H3. SMTP Relay op adressen uit DNS A & SPF
- Brievenbus naar brievenbus
- Legitieme mailserver gebruiken als afzender voor niet legitieme mail
85. H3. SMTP Relay op adressen uit DNS A & SPF
/root/startmailhog.sh
telnet localhost 25
EHLO mail.localhost
MAIL FROM:<info@localhost>
RCPT TO:<test@localhost>
Verwacht antwoord: “Relay access denied”
86. H4. FTP? Zo ja SSH?
- Controleer poort 21 en 990 (ftps-implicit)
87. H5. Welke poorten staan open?
- nmap localhost (1000 meestgebruikte poorten)
- nmap -p 1-10000 localhost
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
6081/tcp open unknown
8080/tcp open http-proxy
88. H6. Slowloris
- Maximum aantal connecties bereiken door requests lang open te houden
http: telnet localhost 80
https: openssl s_client –connect localhost:443
GET / HTTP/1.0
Cookie: a=aaaaaaaa….
Herhaal 1 teken per seconde, tot ruim 10 seconden. Daarna 10s wachten.
Verwacht gedrag: verbinding wordt gesloten
94. I1. Security Updates
Drupal updates via update module.
Andere frameworks via eigen tools, bijv. NodeJS modules via nsp.
95. I2. Andere software op server? Up to date?
- Control panel (plesk:8443, cpanel:2083, webmin:10000)
- /phpmyadmin
- Overige libraries / applicaties (zoals forum)
96. I3. Coder - unescaped Variables in templates etc
Via coder / CodeSniffer
101. K4. User 1
Password must meet at least 3 out of the following 4 complexity rules
at least 1 uppercase character (A-Z)
at least 1 lowercase character (a-z)
at least 1 digit (0-9)
at least 1 special character (punctuation and space)
at least 10 characters
at most 128 characters
not more than 2 identical characters in a row (e.g., 111 not allowed)