Ga naar hoofdinhoud

File Inclusion — Impossible

Tijd om dit lek voor eens en altijd dicht te metselen.

1. Predict (Voorspel)

De ontwikkelaar stapt af van het filteren van "slechte" invoer (Blacklisting) en kiest weer voor Whitelisting.

$file = $_GET['page'];

if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" ) {
echo "ERROR: File not found!";
exit;
}

Vraag: Kun je hier nog op een of andere manier voorbij?

Antwoord

Nee. Omdat het script exact en letterlijk drie specifieke bestandsnamen verwacht, zal alles wat daarvan afwijkt (zelfs include.php%00 of file:///file1.php) genadeloos in de if-statement afvallen. Geen enkele truc kan de strakke, letterlijke string-vergelijking verslaan.

2. Run & Investigate

Start het lab.

Laden...

Kijk hoe elke vorm van manipulatie wordt afgewezen en resulteert in de ERROR boodschap.

3. ✓ Wat moest je zien?

Controle
  • Bij include.php, file1.php of file2.php werkt de pagina normaal en zie je de gewenste inhoud.
  • Bij élke andere waarde (../etc/passwd, file:///etc/passwd, ....//etc/passwd, include.php%00) krijg je "ERROR: File not found!".
  • Géén passwd-inhoud, géén PHP-error, géén stack trace — de whitelist is hard.

Krijg je tóch passwd-inhoud? Dan staat het level rechtsboven niet op Impossible.

Wat heb je geleerd?

  • LFI is dodelijk: Local File Inclusion laat hackers gevoelige bestanden, back-ups of configuraties (met databasewachtwoorden) uitlezen van de harde schijf.
  • Filters omzeilen (Filter Evasion): Ontwikkelaars vergeten vaak dat filters zelfstandig omzeild kunnen worden als je strings nestelt (zoals ....//).
  • Whitelisting is koning: Ook hier geldt: probeer geen verboden woorden of tekens eruit te filteren, maar sta uitsluitend exact toe wat je verwacht.