Ga naar hoofdinhoud

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:

Laden...

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?

Controle
  • Met de oude payload ../../../etc/passwd krijg je een foutmelding of de huidige pagina opnieuw — het filter heeft de ../ weggesneden.
  • Met ....//....//....//....//etc/passwd (of ..././-variant) verschijnt de passwd-inhoud beginnend met root: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!