1: File inclusion vulnerability
Hier sieht mal gleich: Alles lässt sich includen.
Beispielsweise mit ?page=/../../../../../../etc/passwd lassen sich Informationen des Servers aus der passwd datei auslesen.
Aber nicht nur das, es lässt sich auch beliebiger PHP-Code ausführen. Dazu muss der PHP-Code einfach als parameter
übergeben werden: ?page=<?php phpinfo(); ?> Da die meisten Server eine Log-File besitzen. Und in diese
auch die URL keinplan.de/fuckoff.php?page=<?php phpinfo(); ?> geschrieben wurde, kann der Angreifer durch
'includen' der Log-File diesen php-code ausführen. Die Log-File kann dabei vollgestopft mit anderem Müll sein, spielt
ja keine Rolle
Hier mal ein möglicher Fix:
Code:
<?php
$pages = scandir('pages');
unset($pages[0], $pages[1]);
if (isset($_GET['page']) && in_array($_GET['page'], $pages)){
include("pages/{$_GET['page']}");
}else{
echo 'Die Seite konnte nicht gefunden werden!'
?>
2: Null-Byte vulnerability
Diesmal könnte man denken es sei sicher, da nur TXT-Files included werden. Das täuscht.
Durch anhängen eines Nullbytes lässt sich das leicht umgehen.
Warum? ... Da wir alle wissen ist der PHP-Compiler in c geschrieben. Dort wird das
Ende eines Strings mit einem Nullbyte markiert.
Das hat zufolge das der PHP-Code die Endung '.txt' ganz einfach weglässt. FAIL!
Fix: Genau wie bei 1. adden wir eine Whitelist:
Code:
<?php
$pages = scandir('pages');
unset($pages[0], $pages[1]);
if (isset($_GET['file']) && in_array("{$_GET['file']).txt", $files)){
echo "<h3>Inhalt der Datei 'pages/{$_GET['file']}.txt'</h3>";
include("pages/{$_GET['file']}.txt");
}
?>