SlideShare a Scribd company logo
1 of 103
Drupal Security Audit
Index
- Wie zijn wij
- Doel van de workshop
- Opzetten werkomgeving
- Workshop
Wie zijn wij?
Maurits Lawende
Marc Kwee
Doel van de Workshop
● Awareness
● Meestvoorkomende issues
Opzetten werkomgeving
Opzetten werkomgeving
- VirtualBox installeren
- USB Stick “ova” file kopieren
1 2
3 4
5 Linux PW
- root/root
Drupal:
localhost:10080/443
- admin / admin
Checklist
Checklist
- Voorkant / achterkant
- Commandos vanuit VirtualBox
- Prioriteit
Wat gaan we vandaag doen:
- SSL
- HTTP Headers & Cookies
- XSS
- SQLi
- CSRF
- Login
- Information disclosure
- Hosting en DNS
SSL
Doel van SSL
- Met wie praat ik? ( Integriteit )
- Veilig praten, encryptie ( Confidentialiteit )
A1. HTTPS bij formulieren
- Formulieren met gevoelige informatie over https:
- Denk aan: login, beheer webformulieren met persoonlijke data
- Hoe te checken?
A1. Post action moet httpS zijn
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?
A2. TLS
- echo -n | openssl s_client -connect localhost:443 -ssl3
- 139745678513816:error:140A90C4:SSL routines:SSL_CTX_new:null ssl method
passed:ssl_lib.c:1878:
- Verify return code: 18 (self signed certificate)
DONE
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?
A3. Ciphers
- echo -n | openssl s_client -cipher LOW:MEDIUM:EXP:eNULL -connect
localhost:443
(...)
Verify return code: 18 (self signed certificate)
---
DONE
/root/sslciphers.sh localhost
A4. Geldig Certificaat voor andere diensten
- Behalve de website zorg er ook voor dat andere diensten met een geldig certificaat
draaien.
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
A5. Strict-Transport-Security
Alice
www.website.nl
A5. Strict-Transport-Security
Alice
www.website.nl
http://www.website.nl
A5. Strict-Transport-Security
Alice
www.website.nl
Eve
A5. Strict-Transport-Security
Alice
www.website.nl
Eve
https://www.website.nl
A5. Strict-Transport-Security
Alice
www.website.nl
Eve
https://www.website.nl
http://www.website.nlReplace https -> http
A5. Strict-Transport-Security
- curl -k -s -D - https://localhost -o /dev/null
- Strict-Transport-Security: max-age=31536000;
HTTP headers & cookies
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
B2. X-Content-Type-Options: nosniff
- Waarom? De header sluit ‘mime-type’sniffing uit.
B2. X-Content-Type-Options: nosniff
https://www.website.nl
Eve
leukefoto.png
B2. X-Content-Type-Options: nosniff
B2. X-Content-Type-Options: nosniff
https://www.website.nl
Alice
https://www.website.nl/eve/leukefoto.png
B2. X-Content-Type-Options: nosniff
https://www.website.nl
Alice
https://www.website.nl/eve/leukefoto.png
Eve
Script uitgevoerd bij Alice
B2. X-Content-Type-Options: nosniff
- Hoe te checken?
- Commands:
curl -k -s -D - https://localhost -o /dev/null
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-
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>"
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)" />
B6. CHANGELOG.TXT
Controleer aanwezigheid van txt-files
find . | grep .txt
B7. Outline in robots.txt
- Waarom? Het geeft mogelijke paden weer die bruikbaar kunnen zijn voor
exploits.
- Voorbeeld:
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)
B8. HttpOnly & Secure Flag op Sessie cookies
- Waarom Secure Flag?
B8. Secure Flag
https://www.website.nl
http://www.website.nl
Alice
B8. Secure Flag
https://www.website.nl
http://www.website.nl
Alice
Login
B8. Secure Flag
https://www.website.nl
http://www.website.nl
Alice
Cookie
B8. Secure Flag
https://www.website.nl
http://www.website.nl
Alice
Cookie
Eve
Een http link!
B8. Secure Flag
https://www.website.nl
http://www.website.nl
Alice
Cookie
Eve
B8. Secure Flag
https://www.website.nl
http://www.website.nl
Alice
Cookie
Eve
B8. HttpOnly & Secure Flag op Sessie cookies
Secure flag check in Chrome Developer tools.
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
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?
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
- 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
telnet localhost 80
TRACE / HTTP/1.0
Host: localhost
Cookie: foo=bar
Connection: Close
openssl s_client -connect localhost:443
B11. TRACE
XSS
XSS
- XSS is het injecteren van (java)script op een website.
- Vrijwillige XSS
C1. Formulier XSS
- Kan ik javascript invullen in formulieren?
- Hoe te testen?
C1. XSS
- <script>alert(‘XSS’);</script>
- <IMG SRC=JaVaScRiPt:alert('XSS')>
- '';!--"<XSS>=&{()}
Controleer source op aanwezigheid <XSS
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
SQLi
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
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)
CSRF
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.
E1. Security Tokens op formulieren
- Elk formulier binnen Drupal heeft een CSRF token wanneer ingelogt
- Voorbeeld:
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
Login
F1. Blokkade na foute logins
- Waarom? Om bruteforce attacks te stoppen.
- Drupal zelf heeft de flood module.
F2. Logging aanwezig van blokkades
- Deze bruteforce attacks kunnen geanalyseerd worden en verdere stappen kunnen
ondernomen worden. Denk aan het blokkeren van IP adressen.
Information Disclosure
G1. Uploads van webformulieren openbaar
- www.mijngemeente.nl/sites/default/files/webforms/passpoort.pdf
- Maak “private files” de default
G2. Private Filepath
- Zet de private Filepath buiten de webroot.
- Private files kunnen dan nooit direct uit de webserver worden geserveerd.
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
Hosting en DNS
H1. Via ander domein te benaderen
H1. Via ander domein te benaderen
http://www.website.nl
Eve
user/password
Host: evil.nl
H1. Via ander domein te benaderen
http://www.website.nl
Alice
Mail
evil.nl/user/reset?token=asd...
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=....
.
H1. Via ander domein te benaderen
http://www.website.nl
Eve
user/reset?token=....
Alice
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’);
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
H3. SMTP Relay op adressen uit DNS A & SPF
- Brievenbus naar brievenbus
- Legitieme mailserver gebruiken als afzender voor niet legitieme mail
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”
H4. FTP? Zo ja SSH?
- Controleer poort 21 en 990 (ftps-implicit)
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
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
H7. SPF
- Wie mag mail sturen namens domein?
dig +short drupaljam.nl TXT
"v=spf1 include:_spf.google.com ~all"
"v=spf1 redirect=_spf.facebook.com"
dig +short _spf.facebook.com TXT
"v=spf1 ip4:69.63.179.25 ip4:69.63.178.128/25 ip4:69.63.184.0/25 ip4:66.220.144.128/25
ip4:66.220.155.0/24 ip4:69.171.232.0/24 i" "p4:66.220.157.0/25 ip4:69.171.244.0/24 mx -all"
H7. SPF
$ dig +short gemeente.nl TXT
"_spfpolicy.gemeente.nl"
$ dig +short _spfpolicy.gemeente.nl TXT
"v=spf1 ip4:... include:... include:... -all"
H8. Apache onder eigen User
devel/php of losse php-file: echo shell_exec(‘whoami’);
Verwacht een user als “www-data”, maar geen “root”
H9. Open basedir op files directory ****
controleer /sites/default/files in de browser
Code analysis
I1. Security Updates
Drupal updates via update module.
Andere frameworks via eigen tools, bijv. NodeJS modules via nsp.
I2. Andere software op server? Up to date?
- Control panel (plesk:8443, cpanel:2083, webmin:10000)
- /phpmyadmin
- Overige libraries / applicaties (zoals forum)
I3. Coder - unescaped Variables in templates etc
Via coder / CodeSniffer
Drupal Specifiek
K1. Tekstopmaak instellingen
- Wie heeft Full HTML rechten?
- Zijn overige input filters correct ingesteld?
K2. Rollen & Rechten
controleren op “manage people” en “masquerade”
drush -y en security_review
admin/reports/security-review
K3. Testaccounts aanwezig
- “Test”, “redacteur” etc.
- Veilige wachtwoorden in gebruik?
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)
K5. PHP Filter
● Block visibility
● Views header / footer
● Custom blocks
● Node body
$/> init 0

More Related Content

Similar to Security audit van een Drupal site

Flex In De Praktijk
Flex In De PraktijkFlex In De Praktijk
Flex In De Praktijkmarcel panse
 
Mijn site beveiliging
Mijn site beveiligingMijn site beveiliging
Mijn site beveiligingMarko Heijnen
 
Sijmen Ruwhof - Geautomatiseerd website vulnerability management
Sijmen Ruwhof - Geautomatiseerd website vulnerability managementSijmen Ruwhof - Geautomatiseerd website vulnerability management
Sijmen Ruwhof - Geautomatiseerd website vulnerability managementPFCongres
 
JUG Nederland - Presentatie SSL Certificaten - Hoe, waarom & waarmee.
JUG Nederland - Presentatie SSL Certificaten - Hoe, waarom & waarmee.JUG Nederland - Presentatie SSL Certificaten - Hoe, waarom & waarmee.
JUG Nederland - Presentatie SSL Certificaten - Hoe, waarom & waarmee.Wilco Alsemgeest
 
Rf meetup 20210412 robo_con
Rf meetup 20210412 robo_conRf meetup 20210412 robo_con
Rf meetup 20210412 robo_conchristiantester
 
Presentatie Kor Dwarshuis Holland Open2008
Presentatie Kor Dwarshuis Holland Open2008Presentatie Kor Dwarshuis Holland Open2008
Presentatie Kor Dwarshuis Holland Open2008KorDwarshuis
 
Linux command-line-magic-jdnl15
Linux command-line-magic-jdnl15Linux command-line-magic-jdnl15
Linux command-line-magic-jdnl15Peter Martin
 
De 10 geboden van WordPress Development
De 10 geboden van WordPress DevelopmentDe 10 geboden van WordPress Development
De 10 geboden van WordPress DevelopmentFloris Lof
 
XML tekortkomingen en pluspunten
XML   tekortkomingen en pluspuntenXML   tekortkomingen en pluspunten
XML tekortkomingen en pluspuntenMarc de Graauw
 
Oplijsting mogelijkheden open source
Oplijsting mogelijkheden open sourceOplijsting mogelijkheden open source
Oplijsting mogelijkheden open sourceguesta83c7d
 
oplijsting_mogelijkheden_open_source
oplijsting_mogelijkheden_open_sourceoplijsting_mogelijkheden_open_source
oplijsting_mogelijkheden_open_sourceguesta83c7d
 
Drupaljam2015 logstash
Drupaljam2015 logstashDrupaljam2015 logstash
Drupaljam2015 logstashWebscale
 
Copernica Advanced
Copernica AdvancedCopernica Advanced
Copernica AdvancedCopernica BV
 
Informatiebeveiliging & Web 2.0
Informatiebeveiliging & Web 2.0Informatiebeveiliging & Web 2.0
Informatiebeveiliging & Web 2.0Virtualbits
 

Similar to Security audit van een Drupal site (20)

Flex In De Praktijk
Flex In De PraktijkFlex In De Praktijk
Flex In De Praktijk
 
Mijn site beveiliging
Mijn site beveiligingMijn site beveiliging
Mijn site beveiliging
 
Speeding up WordPress
Speeding up WordPressSpeeding up WordPress
Speeding up WordPress
 
Sijmen Ruwhof - Geautomatiseerd website vulnerability management
Sijmen Ruwhof - Geautomatiseerd website vulnerability managementSijmen Ruwhof - Geautomatiseerd website vulnerability management
Sijmen Ruwhof - Geautomatiseerd website vulnerability management
 
Web Security 101
Web Security 101Web Security 101
Web Security 101
 
JUG Nederland - Presentatie SSL Certificaten - Hoe, waarom & waarmee.
JUG Nederland - Presentatie SSL Certificaten - Hoe, waarom & waarmee.JUG Nederland - Presentatie SSL Certificaten - Hoe, waarom & waarmee.
JUG Nederland - Presentatie SSL Certificaten - Hoe, waarom & waarmee.
 
Rf meetup 20210412 robo_con
Rf meetup 20210412 robo_conRf meetup 20210412 robo_con
Rf meetup 20210412 robo_con
 
Presentatie Kor Dwarshuis Holland Open2008
Presentatie Kor Dwarshuis Holland Open2008Presentatie Kor Dwarshuis Holland Open2008
Presentatie Kor Dwarshuis Holland Open2008
 
Linux command-line-magic-jdnl15
Linux command-line-magic-jdnl15Linux command-line-magic-jdnl15
Linux command-line-magic-jdnl15
 
Beveiliging en REST services
Beveiliging en REST servicesBeveiliging en REST services
Beveiliging en REST services
 
De 10 geboden van WordPress Development
De 10 geboden van WordPress DevelopmentDe 10 geboden van WordPress Development
De 10 geboden van WordPress Development
 
XML tekortkomingen en pluspunten
XML   tekortkomingen en pluspuntenXML   tekortkomingen en pluspunten
XML tekortkomingen en pluspunten
 
Oplijsting mogelijkheden open source
Oplijsting mogelijkheden open sourceOplijsting mogelijkheden open source
Oplijsting mogelijkheden open source
 
oplijsting_mogelijkheden_open_source
oplijsting_mogelijkheden_open_sourceoplijsting_mogelijkheden_open_source
oplijsting_mogelijkheden_open_source
 
Web 2.0
Web 2.0Web 2.0
Web 2.0
 
Drupaljam2015 logstash
Drupaljam2015 logstashDrupaljam2015 logstash
Drupaljam2015 logstash
 
Copernica Advanced
Copernica AdvancedCopernica Advanced
Copernica Advanced
 
Informatiebeveiliging & Web 2.0
Informatiebeveiliging & Web 2.0Informatiebeveiliging & Web 2.0
Informatiebeveiliging & Web 2.0
 
[Idm b] tools databases 3
[Idm b] tools databases 3[Idm b] tools databases 3
[Idm b] tools databases 3
 
HTML5 Overview
HTML5 OverviewHTML5 Overview
HTML5 Overview
 

Security audit van een Drupal site

Editor's Notes

  1. Marc
  2. Marc Werkomgevnig 20 min
  3. Marc
  4. Mau
  5. Marc
  6. Mau Awareness
  7. Mau
  8. Mau
  9. Mau
  10. Mau
  11. Mau
  12. Mau
  13. Mau
  14. Marc
  15. Marc
  16. Marc
  17. Marc
  18. Marc
  19. Marc
  20. Mau
  21. Mau
  22. Marc
  23. Marc
  24. Marc
  25. Marc
  26. Marc
  27. Marc
  28. Marc
  29. Marc
  30. Marc
  31. Marc
  32. Marc
  33. Marc
  34. Marc
  35. Marc
  36. Marc
  37. Marc
  38. Marc ()() +ADw-
  39. Marc
  40. Marc
  41. Mau
  42. Marc
  43. Marc
  44. Marc
  45. Marc
  46. Marc
  47. Marc
  48. Marc
  49. Marc
  50. Marc
  51. Marc
  52. Marc
  53. Marc
  54. Marc
  55. Mau
  56. Mau
  57. Mau
  58. Mau
  59. Mau
  60. Mau
  61. Mau
  62. Mau
  63. Mau
  64. Mau
  65. Marc
  66. Marc
  67. Marc
  68. Marc
  69. Marc
  70. Marc
  71. Marc
  72. Marc
  73. Marc
  74. Marc
  75. Mau
  76. Maui
  77. Mau
  78. Mau
  79. Mau
  80. Mau
  81. Mau
  82. Mau
  83. Mau
  84. Mau
  85. Mau
  86. Mau
  87. Mau
  88. Mau
  89. Mau
  90. Mau
  91. Mau
  92. Mau
  93. Mau
  94. Mau
  95. Mau
  96. Mau
  97. Mau
  98. Mau
  99. Mau
  100. Mau
  101. Mau
  102. Mau