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:
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?
- Met
../../../etc/passwdkrijg je nu "ERROR: File not found!" — defnmatch-check weigert je payload. - Met
file:///etc/passwdverschijnt alsnog de passwd-inhoud beginnend metroot: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.