Christopher Kunz Stefan Esser PHP-Sicherheit PHP/MySQL-Webanwendungen sicher programmieren 3, Oberarbeitete Auflage dpunktverlag
InhaItsverzeichnis 1 Einleitung 11 Dber dieses Buch 1 12 Was ist Sicherheit? 4 13 Wichtige Begriffe 5 14 Sicherheitskonzepte 7 15 ISO 17799 9 16 Wie verkaufe ich Sicherheit? 10 17 Wichtige Informationsquellen 12 171 Mailinglisten 12 172 Full Disclosure " 13 173 BugTraq 14 174 WebAppSec 15 18 OWASP 15 19 PHP-Sicherheitde 16 2 Informationsgewinnung 17 21 Grundlagen 17 22 Webserver erkennen 18 221 Server-Banner erfragen 19 222 Webserver-Verhalten interpretieren 21 223 Tools fur Webserver-Fingerprinting 22 23 Betriebssystem erkennen 22 24 PHP-Installation erkennen 23 25 Datenbanksystem erkennen 26
26 27 28 29 210 211 212 Datei-Altlasten 27 261 Ternporare Dateien 28 262 Include- und Backup-Dateien 29 263 Dateien von Entwicklungswerkzeugen 30 264 Vergessene oder»versteckte«php-dateien 31 265 Ternporare CVS-Dateien 32 Pfade 32 271 mod_speling 32 272 robotstxt 33 273 Standardpfade 34 274 Pfade verkiirzen 37 Kommentare aus HTML-Dateien 37 Applikationen erkennen 38 291 Das Aussehen/Layout 39 292 Typische Dateien bekannter Applikationen 39 293 Header-Felder 39 294 Bestimmte Pfade 39 295 Kornmentare im Quellcode 40 296 HTML-Metatags 41 Default-User 41 Coogle Dork 42 Fazit 42 3 Parametermanipulation 45 31 32 33 Grundlagen 45 Werkzeuge zur Parametermanipulation 48 321 Parametermanipulation mit dem Browser 48 322 Einen Proxy benutzen 51 Angriffsszenarien und Losungen 53 331 Fehlererzeugung 53 332 HTTP Response Splitting 55 333 Remote Command Execution 59 334 Angriffe auf Dateisysternfunktionen 61 335 Angriffe auf Shell-Ebene 62 336 Cookie Poisoning 63 337 Manipulation von Formulardaten 64 338 Vordefinierte PHP-Variablen manipulieren " 65 339 Spam iiber Mailformulare 65
34 35 36 Variablen richtig prufen 341 Auf Datentyp prufen 68 342 Datenlange priifen 69 343 Inhalte priifen 70 344 Whitelist-Priifungen 72 345 Blacklist-Priifung 74 346 Clientseitige Validierung 75 registetglobals Fazit 79 67 75 4 Cross-Site Scripting 81 41 42 43 44 45 46 47 48 49 410 411 412 413 414 415 416 417 Grenzenlose Angriffe Was ist Cross-Site Scripting? Warum XSS gefahrlich ist Erhohte Gefahr dank Browserkomfort 84 Forrnularvervollstandigung verhindern 85 XSS in LANs und WANs XSS - einige Beispiele 87 Ein klassisches XSS Angriffspunkte fiir XSS Angriffe verschleiern - XSS Cheat Sheet 91 Einfache Cegenrnafsnahmen 94 XSS verbieten, HTML erlauben - wie? 97 4121 BBCode 97 4122 HTML-Filter mit XSS-Blacklist 98 4123 Whitelist-Filtern mit»html Purifier" 101 Die Zwischenablage per XSS auslesen XSS-Angriffe iiber DOM 81 82 83 86 88 90 103 104 XSS in HTTP-Headern 107 4151 Angriffe der ersten Ordnung mit Headern 107 4152 Second Order XSS per Header 107 Attack API 110 Second Order XSS per RSS 111
418 Cross-Site Request Forgery (CSRF) 112 4181 4182 4183 4184 4185 4186 CSRF als Firewall-Brecher CSRF in BBCode Ein erster Schutz gegen CSRF, CSRF-Schutzmechanismen Formular-Token gegen CSRF Unheilige Allianz: CSRF und XSS 114 115 116 117 118 119 5 SQL-Injection 121 51 Grundlagen 121 52 Auffinden von SQL-Injection-Moglichkeiten 123 521 GET-Parameter 124 522 POST-Parameter 125 523 Cookie-Parameter 126 524 Servervariablen 127 53 Syntax einer SQL-Injection 130 531 Sonderzeichen in SQL 130 532 Schliisselworter in SQL 131 533 Einfache SQL-Injection 131 534 UNION-Injections 133 54 Advanced SQL-Injection 136 55 541 LOAD_FILE 542 Denial of Service mit SQL-Injection 543 ORDER BY Injection Schutz vor SQL-Injection 551 Sonderzeichen maskieren 552 1st Schliisselwort-Filterung ein wirksamer Schutz? Parameter BindinglPrepared Statements Stored Procedures 553 554 56 Fazit 143 136 137 138 139 139 140 140 142 6 Authentisierung undauthentifizierung 145 61 Wichtige Begriffe 145 611 612 613 Authentisierung Authentifizierung Autorisierung 145 146 146
62 Authentisierungssicherheit 147 621 SSL 147 622 Behandlung von Passwortern 149 623 Benutzernamen und Kennungen 151 624 Sichere Passworter 152 625 Passwort-Sicherheit bestimmen 155 626 Vergessene Passworter 158 63 Authentifizierungssicherheit 163 631 Falsche Request-Methode 163 632 Falsche SQL-Abfrage 164 633 SQL-Injection 165 634 XSS 165 64 Spamvermeidung mit CAPTCHAs 166 65 Fazit 170 7 Sessions 171 71 Grundlagen 171 72 Permissive oder strikte Session-Systerne 173 73 Session-Speicherung 174 74 Schwache Algorithmen zur Session-ID-Generierung 177 75 Session-Timeout " 178 76 Bruteforcing von Sessions 179 77 Session Hijacking 180 78 Session Fixation 182 79 Zusatzliche Abwehrmethoden 182 791 Page-Ticket-System 182 792 Session-Dateien mittels Cronjob loschen 184 793 Session-ID aus dem Referrer loschen 184 710 Fazit 185 8 Upload-Formulare 187 81 Grundlagen 187 82 Aufbau eines Upload-Forrnulars 187 83 PHP-interne Verarbeitung 188 84 Speicherung der hochgeladenen Dateien 189 85 Bildiiberpriifung 190 86 PHP-Code in ein Bild einfiigen 191
87 Andere Dateitypen uberprufen 192 88 Gefahrliche Zip-Archive 193 89 Fazit 193 9 Variablenfilter mit ext/filter 195 91 Oberblick 195 92 Installation 196 93 Die Filter-API 196 94 Verfiigbare Filter 197 941 Validierende Filter 198 942 Reinigende Filter 199 95 Zahlen prufen und filtern 200 96 Boolesche Werte 201 97 URLs validieren 201 98 IP-Adressen prufen 203 99 Syntaxcheck fur E-Mail-Adressen 204 910 Reinigende Filter 205 911 Prufung externer Daten 205 912 Callback-Funktionen 206 913 Fazit 207 10 PHPintern 209 101 Fehler in PHP 209 1011 Month of PHP Bugs 209 1012 File-Upload-Bug 210 1013 Unsichere (De-)Serialisierung 210 1014 Verwirrter Speichermanager '" 210 1015 Speicherproblem dank htmlentities 211 1016 Bewertung 211 102 Bestandteile eines sicheren Servers 211 103 Unix oder Windows? 213 104 BIeiben Sie aktuell! 213 105 Installation 214 1051 Installation als Apache-Modul 214 1052 CGI 216 106 suexec 217
107 108 109 1010 1011 1012 11 111 Safe Mode 219 1071 Einrichtung des Safe Mode 220 1072 safe_mode_exec_dir 221 1073 safe_mode_include_dir 221 1074 Umgebungsvariablen im Safe Mode 222 1075 Safe Mode considered harmful? 222 Weitere PHP-Einstellungen 224 1081 1082 1083 1084 1085 1086 1087 1088 1089 open_basedir 224 disable_functions 225 disable_classes 226 max_execution_time 226 maxjnputjirne 226 memory_limit 226 Upload-Einstellungen 227 allow_urlfopen 228 allowjirljnclude 229 10810 registerglobals 229 Code-Sandboxing mit runkit 229 Externe Ansatze 231 10101 suphp 231 10102 FastCGI 235 10103 Das Apache-Modul mod_suid 237 Roo~ai~Lbsungen 241 10111 10112 10113 10114 Fazit PHP-Hardening 245 Warum PHP harten? 245 1111 1112 1113 1114 1115 1116 1117 1118 BSD-Rootjails 241 User Mode Linux 242 mod_security 242 mod_chroot 242 243 Buffer Overflows 246 Schutz vor Pufferuberlaufen im Suhosin-Patch 247 Schutz vor Format-String-Schwachstellen 248 Simulationsmodus 249 Include-Schutz gegen Remote-Includes und N ullbytes 250 Funktions- und Evaluationsbeschrankungen 251 Schutz gegen Response Splitting und Mailheader Injection 252 Variablenschutz 252
1119 SQL Intrusion Detection 253 11110 Logging 253 11111 Transparente Cookie- und Session-Verschlusselung 253 11112 Hartung des Speicherlimits 11113 Transparenter phpinfot) Schutz 254 254 11114 Kryptografische Funktionen 254 112 Prinzipien hinter Suhosin 255 113 Installation 255 1131 Installation des Patch 255 1132 Installation der Extension 258 114 Zusammenarbeit mit anderen Zend-Extensions 259 115 Konfiguration 260 1151 1152 1153 Generelle Optionen Log-Dateien Alarmskript 260 263 266 1154 Transparente Verschlusselung 267 1155 Variablenfilter 268 1156 Upload-Konfiguration 271 116 Beispielkonfiguration 273 117 Fazit und Ausblick 274 12 Webserver-Filter fur Apache 275 121 Einsatzgebiet von Filtermodulen 275 122 Blacklist oder Whitelist? 276 123 mod_security 277 1231 1232 So funktioniert's Gefahren durch mod_security 278 278 1233 Installation 279 1234 Konfiguration 280 1235 Regelwerk von mod_security 283 1236 Alarmskript fur mod_security 293 1237 Rootjail-Umgebungen mit mod_security 293 1238 mod_security 2 296 124 mod_parmguard 299 1241 So funktioniert's 299 1242 Installation 300 1243 Webserver-Konfiguration 301 1244 XML-Whitelist manuell erstellen 303 1245 Automatische Erzeugung 308 125 Fazit 309
Anhang 310 A Checkliste fur sichere Webapplikationen 311 B B1 B2 B3 B4 Bo5 B6 Bo7 Bo8 B9 sio Wichtige Optionen in phpini variables_order register_globals 0 register_long_arrays 0 0 0 0 0 0 0 0 0 0 register_argc_argv o' 0 0 0 0 0 0 0 0 post_max_size 0 magicquotesgpc 0 magic_quotes_runtime 0 always_populatcraw_poscdata 0 allow_urlfopen 0 allow_uri_include 0 0 0 0 0 0 : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 315 315 316 316 316 317 317 317 317 318 318 C e1 e2 e3 e4 e5 e6 e7 e8 D E Liste aller Schwachstellen mit Gefahrenpotenzial-Bewertung Cross-Site Scripting 0 Information Disclosure 0 Full Path Disclosure 0 SQL-Injection 0 HTIP Response Splitting 0 Cross-Site Request Forgery 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Remote Command Execution 0 Mail-Header Injection Quellen Glossar 0 0 0 0 0 0 0 0 0 0 0 0 319 319 319 320 320 320 321 321 321 322 323 Stichwortverzeichnis 331