PHP-Sicherheit erklärt · defensiv
SSRF in PHP: was es ist und wie Sie es beheben
URL-Vorschauen, Webhooks, Bildimporte und PDF-Generatoren lassen den Server eine URL abrufen. Kontrolliert der Besucher diese URL, kann er Ihren Server auf Ziele richten, die er selbst nicht erreicht.
Zuletzt aktualisiert
Worum es geht
Ihr Server steht meist in einem vertrauenswürdigen Netz. Seine Anfragen erreichen Datenbanken, Admin-Oberflächen, andere Microservices und Cloud-Metadatendienste, die Zugangsdaten ausgeben. SSRF macht jede Abruffunktion zum Proxy in dieses Netz. MITRE führt das als CWE-918, OWASP hat ein eigenes Cheat Sheet zur Vorbeugung.
So finden Sie es
- Suchen Sie nach
curl_setopt(... CURLOPT_URL ...),file_get_contents($var),fopen($var),get_headers()und HTTP-Client-Aufrufen wie Guzzle, die eine URL aus Eingaben nehmen. - Listen Sie alle Funktionen auf, die entfernte Inhalte holen: Webhooks, Avatar- oder Bildimport, Link-Vorschauen, Feed-Reader, PDF- oder Screenshot-Rendering, XML mit externen Entitäten.
- Prüfen Sie ausgehenden Verkehr des Webservers; unerwartete Anfragen an
169.254.169.254,localhostoder private Netze sind ein Warnsignal.
So beheben Sie es
- Erlauben Sie nur die Hosts und Schemata, die die Funktion wirklich braucht (meist nur
https), und lehnen Sie alles andere ab. - Lösen Sie den Host selbst auf, verweigern Sie private, Loopback- und Link-Local-Adressen und verbinden Sie sich dann mit genau dieser IP, damit sich DNS zwischen Prüfung und Nutzung nicht ändern kann.
- Deaktivieren Sie Weiterleitungen (
CURLOPT_FOLLOWLOCATIONfalse) und begrenzen Sie Protokolle mitCURLOPT_PROTOCOLS. - Verlangen Sie in der Cloud Sitzungstoken für Instanz-Metadaten (zum Beispiel AWS IMDSv2) und beschränken Sie ausgehenden Verkehr per Firewall.
Lesende Prüfungen und sichere Muster
# Find server-side fetches that may take a user-supplied URL (read-only)
grep -rnE "(curl_setopt.*CURLOPT_URL|file_get_contents\s*\(\s*\$|fopen\s*\(\s*\$)" --include=*.php . | grep -v /vendor/
// Allowlist hosts and schemes before fetching
$u = parse_url($url);
$allowed = ['api.example.com'];
if (($u['scheme'] ?? '') !== 'https' || !in_array($u['host'] ?? '', $allowed, true)) {
throw new RuntimeException('URL not allowed');
}
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);Reicht es, 127.0.0.1 zu sperren?
Nein. Alternative IP-Schreibweisen, IPv6, DNS-Namen mit privaten Adressen und Weiterleitungen umgehen einfache Sperrlisten. OWASP empfiehlt Allowlists.
Stoppt eine WAF SSRF?
Sie erkennt manche Muster, weiß aber nicht, welche internen Hosts für Sie wichtig sind. Beheben Sie es im Code.
Weitere PHP-Schwachstellenklassen
- PHP Object Injection: was es ist und wie Sie es behebenPHP Object Injection entsteht, wenn benutzerkontrollierte Eingaben unserialize() erreichen, das Objekte erzeugen kann, deren magische Methoden vom Angreifer gewählte Logik ausführen.
- PHP File Inclusion (LFI/RFI): was es ist und wie Sie es behebenFile Inclusion entsteht, wenn Benutzereingaben den Pfad für include oder require steuern; Angreifer lesen dann lokale Dateien (LFI) oder führen bei aktivem allow_url_include entfernten Code aus (RFI).
- XSS in PHP: was es ist und wie Sie es verhindernCross-Site Scripting (XSS) entsteht, wenn eine PHP-Seite benutzerkontrollierte Daten ohne Escaping in HTML ausgibt, sodass das Skript eines Angreifers im Browser anderer Besucher läuft.
- phpinfo()-Offenlegung: warum sie zählt und wie Sie sie behebenEine öffentliche phpinfo()-Seite verrät die genaue PHP-Version, geladene Module, Dateipfade und oft Umgebungsvariablen oder Geheimnisse, was Angreifern hilft, Fehler wie PHP2Shell gezielt auszunutzen.
Quellen
Externe Links verlassen diese Website. Wir hosten keinen Exploit-Code.
- CWE-918: Server-Side Request Forgery (SSRF) — MITRE CWE
- Server-Side Request Forgery Prevention Cheat Sheet — OWASP Cheat Sheet Series