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-navigatie tekens 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 niks (een lege string). Bedenk wat er gebeurt als jij als hacker de volgende string instuurt: ..././
Antwoord
Dit is een klassieke denkfout van ontwikkelaars! De str_replace functie controleert de tekst maar één keer, niet oneindig vaak.
Als je ..././ invoert, ziet de compiler in het midden van die string precies het patroon ../ staan. Hij knipt dat ene patroon eruit. Wat blijft er dan over van de buitenste letters die je nog over had? Die plakken aan elkaar vast en vormen... opnieuw ../! Het filter omzeilt zichzelf.
2. Run & Investigate
Start het lab:
Probeer de standaardaanval van het Low niveau (../../etc/passwd). Je ziet dat het niet meer werkt, omdat de filter de navigatie-tekens weghaalt.
3. Modify & Make (Aanpassen & Maken)
Jouw taak: Breek door het filter heen en lees alsnog /etc/passwd uit.
Tip
Je kunt de methode uit de Predict-fase gebruiken (..././), óf je schrijft je directory traversal letterlijk dubbelop (....//), zodat het filter de middelste wegsnijdt en er één valide overblijft.
Antwoord
Maak je aanval-string dubbelop:
....//....//....//....//etc/passwd
Wanneer de server het filter toepast, knipt hij de ../ in het midden weg, waardoor exact ../../../../etc/passwd overblijft voor de include-functie!
4. ✓ Wat moest je zien?
- Met de oude payload
../../../etc/passwdkrijg je een foutmelding of de huidige pagina opnieuw — het filter heeft de../weggesneden. - Met
....//....//....//....//etc/passwd(of..././-variant) verschijnt de passwd-inhoud beginnend metroot:x:0:0:…. - Dat bewijst dat het filter zichzelf heeft omzeild: de
../in het midden viel weg, waardoor de buitenste tekens samen weer een geldige../vormen.
Geen passwd-inhoud? Probeer méér ....//-segmenten achter elkaar (5 of 6 stuks). Het include-pad zit soms dieper dan je denkt.
5. Er gaat iets mis...
Wat als de server op Windows draait in plaats van Linux?
In Windows zoek je niet naar /etc/passwd, maar bijvoorbeeld naar C:\Windows\System32\drivers\etc\hosts of C:\boot.ini. Je moet je directory-traversal (en de gebruikte slashes \ of /) altijd afstemmen op het besturingssysteem van je slachtoffer!