PHP-beveiliging uitgelegd · defensief
SSRF in PHP: wat het is en hoe je het oplost
Linkvoorbeelden, webhooks, afbeeldingsimport en pdf-generatoren laten de server een URL ophalen. Bepaalt de bezoeker die URL, dan kan hij je server richten op plekken die hij zelf niet bereikt.
Laatst bijgewerkt
Wat het is
Je server staat meestal in een vertrouwd netwerk. Zijn verzoeken bereiken databases, beheerpanelen, andere microservices en cloudmetadatadiensten die inloggegevens uitdelen. SSRF maakt van elke ophaalfunctie een proxy naar dat netwerk. MITRE noemt dit CWE-918 en OWASP heeft er een eigen preventie-cheatsheet voor.
Zo vind je het
- Zoek naar
curl_setopt(... CURLOPT_URL ...),file_get_contents($var),fopen($var),get_headers()en HTTP-clients zoals Guzzle die een URL uit invoer nemen. - Maak een lijst van alle functies die externe inhoud ophalen: webhooks, avatar- of afbeeldingsimport, linkvoorbeelden, feedlezers, pdf- of screenshotrendering, XML met externe entiteiten.
- Bekijk uitgaand verkeer van de webserver; onverwachte verzoeken naar
169.254.169.254,localhostof private reeksen zijn een alarmsignaal.
Zo los je het op
- Sta alleen de hosts en schema’s toe die de functie echt nodig heeft (meestal alleen
https) en weiger de rest. - Resolve de host zelf, weiger private, loopback- en link-local adressen en verbind dan met dat IP-adres, zodat DNS niet verandert tussen controle en gebruik.
- Schakel het volgen van redirects uit (
CURLOPT_FOLLOWLOCATIONfalse) en beperk protocollen metCURLOPT_PROTOCOLS. - Vereis in de cloud sessietokens voor instance-metadata (bijvoorbeeld AWS IMDSv2) en beperk uitgaand verkeer met een firewall.
Alleen-lezen controles en veilige patronen
# 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);Is 127.0.0.1 blokkeren genoeg?
Nee. Alternatieve IP-notaties, IPv6, DNS-namen die naar private adressen wijzen en redirects omzeilen eenvoudige blocklists. OWASP raadt allowlists aan.
Houdt een WAF SSRF tegen?
Die vangt sommige patronen, maar weet niet welke interne hosts voor jou belangrijk zijn. Los het op in de code.
Andere PHP-kwetsbaarheidsklassen
- PHP object injection: wat het is en hoe je het oplostPHP object injection ontstaat wanneer door gebruikers beïnvloedbare invoer unserialize() bereikt, dat objecten kan aanmaken waarvan de magische methoden door de aanvaller gekozen logica uitvoeren.
- PHP file inclusion (LFI/RFI): wat het is en hoe je het oplostFile inclusion ontstaat wanneer gebruikersinvoer het pad voor include of require bepaalt, waardoor een aanvaller lokale bestanden leest (LFI) of, met allow_url_include aan, externe code uitvoert (RFI).
- XSS in PHP: wat het is en hoe je het voorkomtCross-site scripting (XSS) ontstaat wanneer een PHP-pagina door gebruikers beïnvloedbare data zonder escaping in HTML zet, zodat het script van een aanvaller in de browser van andere bezoekers draait.
- phpinfo()-blootstelling: waarom het telt en hoe je het oplostEen openbare phpinfo()-pagina verraadt de exacte PHP-versie, geladen modules, bestandspaden en vaak omgevingsvariabelen of geheimen, wat aanvallers helpt fouten als PHP2Shell gericht te misbruiken.
Bronnen
Externe links verlaten deze site. Wij hosten geen exploitcode.
- CWE-918: Server-Side Request Forgery (SSRF) — MITRE CWE
- Server-Side Request Forgery Prevention Cheat Sheet — OWASP Cheat Sheet Series