11

私はかなり長い間それについてかなり興味がありましたが、答えを得ることができなかったようです. しかし、ここには非常に知的な人たちがいるので、誰かができると確信しています。

では、質問へ。例として、リモート コマンド実行の脆弱性を使用します。

<?php echo preg_replace('/(.*)/e', 'strtoupper("\\1")', $argv[1]); ?>

これを悪用するには、攻撃者は単純に入力{${phpinfo()}}します。私の質問は次のとおりです。

  1. 中括弧は何の{}ためのもので、変数のように見えるのはなぜですか?
  2. それは何かの名前を持っていますか?それらは異なるので、変数関数だとは思いませんよね?

ありがとうございました!

4

2 に答える 2

8

これは複雑な (巻き毛の) 構文です。

{$} 内の関数、メソッド呼び出し、静的クラス変数、およびクラス定数は、PHP 5 以降で機能します。ただし、アクセスされた値は、文字列が定義されているスコープ内の変数の名前として解釈されます。関数やメソッドの戻り値、またはクラス定数や静的クラス変数の値にアクセスする場合、単一の中括弧 ({}) を使用しても機能しません。

したがって、単純な変数の場合、 single{}は のよう"{$foo}"に機能しますが、これは関数です。呼び出すphpinfo()必要がある場合は、関数を呼び出す 2 つ{}の例が必要です。"{${phpinfo()}}"phpinfo()

そして、これがeモディファイヤが推奨されない理由です。たとえば、これをイメージングする

{${eval($_GET['php_code'])}}これにより、攻撃者は任意の PHP コードを実行できるようになり、サーバーへのほぼ完全なアクセスが可能になります。

これを防ぐには、preg_replace_callback()代わりに使用します。

于 2012-09-28T09:00:07.960 に答える
2

「複雑な(中)構文」と呼ばれるこのリンクが役立つことを願っています:

http://php.net/manual/en/language.types.string.php

于 2012-09-28T08:56:23.943 に答える