PHP-beveiliging uitgelegd · defensief
PHP file inclusion (LFI/RFI): wat het is en hoe je het oplost
include en require voeren elk bestand uit dat ze krijgen. Komt een deel van het pad uit het verzoek, dan bepaalt de bezoeker wat er draait.
Laatst bijgewerkt
Wat het is
Bij local file inclusion (LFI) wijst een verzoek include of require naar bestanden die al op de server staan, zoals configuratie of logs; samen met een upload of logregel kan dat code-uitvoering worden. Remote file inclusion (RFI) laadt code van een andere server en werkt alleen als allow_url_include aanstaat, wat volgens php.net standaard uit is. MITRE noemt dit CWE-98.
Zo vind je het
- Zoek naar
include,require,include_onceenrequire_oncemet een variabele in het argument en volg die variabele terug naar verzoekdata. - Draai
php -ien controleer datallow_url_includeOff is en ofopen_basediris ingesteld. - Bekijk webserverlogs op parameters met
../,php://ofdata:; dat wijst op aftasten, niet op een bewezen inbraak.
Zo los je het op
- Bouw nooit een includepad uit invoer. Koppel een toegestane sleutel aan een vaste bestandsnaam, zoals in het voorbeeld hieronder.
- Houd
allow_url_include = Off; overweegallow_url_fopen = Offals de app geen externe bestanden hoeft te lezen. - Zet
open_basedirop de map van de site zodat PHP geen bestanden elders kan openen. - Bewaar uploads buiten de webroot en include ze nooit.
Alleen-lezen controles en veilige patronen
# Find include/require with a variable path (read-only)
grep -rnE "(include|require)(_once)?\s*\(?\s*\$" --include=*.php . | grep -v /vendor/
php -i | grep -E "allow_url_include|allow_url_fopen|open_basedir"
; php.ini hardening
allow_url_include = Off
open_basedir = /var/www/example:/tmp
// Map user choices to fixed files instead of building paths
$pages = ['home' => 'home.php', 'about' => 'about.php'];
require __DIR__ . '/pages/' . ($pages[$_GET['p'] ?? 'home'] ?? 'home.php');Maakt basename() een include veilig?
Het verwijdert mapdelen maar laat de bezoeker nog elk bestand in die map kiezen. Een expliciete allowlist is veiliger.
Is RFI in moderne PHP nog een risico?
Alleen als allow_url_include is aangezet. LFI blijft vaak voorkomen omdat het geen speciale instelling nodig heeft.
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.
- SSRF in PHP: wat het is en hoe je het oplostServer-side request forgery (SSRF) ontstaat wanneer een PHP-app een door de gebruiker bepaalde URL ophaalt, waardoor een aanvaller via je server interne diensten of cloudmetadata-endpoints bereikt.
- 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-98: PHP Remote File Inclusion — MITRE CWE
- Testing for Local File Inclusion — OWASP Web Security Testing Guide
- Filesystem runtime configuration (allow_url_fopen, allow_url_include) — PHP Manual
- Core php.ini directives (open_basedir, expose_php) — PHP Manual