File Inclusion â Medium
De ontwikkelaar is geschrokken van de LFI-kwetsbaarheid en schrijft razendsnel een filter.
1. Predict (Voorspel)â
Dit is de gepatchte code. De ontwikkelaar gebruikt str_replace om de map-navigatietekens en http:// weg te knippen:
$file = $_GET['page'];
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\\" ), "", $file );
include($file);
Vraag: Kijk naar het tweede filter dat ../ vervangt door niets. Wat gebeurt er als je de string ..././ instuurt?
Antwoord
De str_replace-functie controleert de tekst maar ÊÊn keer. Als je ..././ invoert, ziet het filter in het midden de volgorde ../ staan en knipt dat weg. Wat blijft er over van de letters eromheen? Die plakken aan elkaar en vormen opnieuw ../! Het filter omzeilt zichzelf.
2. Run (Uitvoeren)â
Start het lab en probeer het bestand file1.php op te vragen.
Bevestig dat de normale paginaweergave werkt. Probeer daarna je Low-level aanval (../../etc/passwd) opnieuw.
3. Investigate (Onderzoeken)â
Verander de URL-parameter naar ?page=../ en kijk wat er verschijnt.
Vraag: Verdwijnt de ../ volledig of blijft er iets over? Wat zegt dit over de manier waarop het filter werkt?
Antwoord
De server geeft een foutmelding voor het pad zonder ../ â het filter heeft de tekens weggehaald. Maar als je ....// invoert, verdwijnt alleen het binnenste ../ en blijft er toch ../ over. Dit onthult dat het filter enkelvoudig is: het verwijdert ÊÊn keer het patroon, maar controleert niet of er na verwijdering opnieuw een verboden patroon ontstaat.
4. Modify & Make (Aanpassen & Maken)â
Gebruik de geneste-truc om het filter te omzeilen en alsnog /etc/passwd uit te lezen.
Tip
Maak je directory-traversal dubbelop: schrijf elk ../ als ....//. Het filter knipt de binnenste weg, waarna de buitenste letters aan elkaar plakken tot het gewenste patroon.
Antwoord
Vul in als waarde voor page:
....//....//....//....//etc/passwd
Wanneer de server het filter toepast, knipt hij telkens de ../ in het midden weg, waardoor exact ../../../../etc/passwd overblijft voor de include()-functie.
5. â Wat moest je zien?â
- De pagina toont de inhoud van
/etc/passwdondanks het filter. - De directe aanval (
../../etc/passwd) werkt niet meer â het filter verwijdert de paden. - De geneste variant (
....//....//) slaagt wÊl â het filter herkent het verscholen patroon niet.
Werkt de geneste aanval ook niet? Controleer of je voldoende niveaus hebt â voeg meer ....// toe tot je de root bereikt.
6. Er gaat iets mis...â
Wat als de server op Windows draait in plaats van Linux? In Windows zoek je niet naar /etc/passwd, maar naar paden zoals C:\Windows\System32\drivers\etc\hosts. Je moet ook de slashes aanpassen: Windows gebruikt \, hoewel / ook vaak werkt. Stem je directory-traversal altijd af op het besturingssysteem van de server.