Ga naar hoofdinhoud

File Inclusion — High

Om van het 'knippen en plakken' probleem af te zijn, stapt de ontwikkelaar over op een strengere aanpak.

1. Predict (Voorspel)

De server controleert nu of de bestandsnaam strict aan bepaalde voorwaarden voldoet, anders gooit hij direct een "ERROR: File not found!".

$file = $_GET['page'];
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
echo "ERROR: File not found!";
exit;
}
include($file);

Vraag: Het bestand MOET dus exact include.php heten, óf de bestandsnaam moet beginnen met het woordje file. Hoe kan dit woordje file een onbedoelde achterdeur openzetten in Linux?

Antwoord

Op Linux en Mac bestaat het zogeheten file:// protocol (net zoals je http:// en ftp:// hebt). Dit wordt gebruikt om in een browser naar lokale bestanden te verwijzen op je harde schijf. Omdat de ontwikkelaar eist dat de invoer begint met file, staat hij onbewust het gebruik van het file:// protocol toe, waarmee we de hele harde schijf kunnen uitlezen!

2. Run & Investigate

Start het lab:

Laden...

3. Modify & Make (Aanpassen & Maken)

Bedenk een payload die begint met het woord file en waarmee je alsnog naar /etc/passwd navigeert.

Tip

Gebruik het file protocol en navigeer vanaf de absolute root van de harde schijf, zonder met ../ te hoeven werken.

Antwoord

Vul in de URL in: ?page=file:///etc/passwd

Omdat de string netjes begint met "file", gooit het beveiligingsfilter het niet weg. De include functie leest vervolgens letterlijk het file protocol uit en toont het wachtwoordenbestand!

4. ✓ Wat moest je zien?

Controle
  • Met ../../../etc/passwd krijg je nu "ERROR: File not found!" — de fnmatch-check weigert je payload.
  • Met file:///etc/passwd verschijnt alsnog de passwd-inhoud beginnend met root:x:0:0:….
  • Het verschil zit volledig in dat eerste woordje "file": de blacklist denkt dat dit een legitiem bestandsnaampatroon is.

Krijg je nog steeds "File not found"? Let op de drie schuine strepen na file: (file:///) — de eerste twee horen bij het protocol, de derde bij de root van de harde schijf.