2012-09-28 8 views
11

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

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

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

これを悪用するには、攻撃者はたとえば{${phpinfo()}}と入力します。次のように 私の質問は以下のとおりです。

  1. 、なぜそれが 変数のように見えないため、中括弧{}は何ですか?
  2. 何らかの名前がありますか?私はそれが異なるので、それは可変関数だとは思わない?

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

+1

ああ、中括弧はこれまでのリストの一部ではありません:[参考 - このシンボルはPHPで何を意味しますか?](http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol -mean-in-php) – hakre

答えて

8

これはComplex (curly) syntaxです。

関数、メソッド呼び出し、静的クラス変数、およびクラスはPHP 5ため 内部{$}作業定数。ただし、アクセスされる値は、 が定義されているスコープ内の変数の名前として解釈されます。 ファンクションまたはメソッドの戻り値またはクラス の定数または静的クラス変数の値に にアクセスするために、中括弧({})を使用すると、が機能しません。

ので、単純な変数のために、単一{}"{$foo}"のように、動作しますが、phpinfo()は、関数であるあなたがそれを呼び出す必要があるとき、あなたはphpinfo()関数を呼び出しますあなたの例"{${phpinfo()}}"、2 {}を、必要とします。攻撃者に任意のPHPコードを実行することができますそのように彼にあなたにほぼ完全なアクセスを与える

そしてe修飾子がである理由ですが、この

{${eval($_GET['php_code'])}}を画像化する、例えば、を落胆サーバ。

これを防ぐには、代わりにpreg_replace_callback()を使用してください。

関連する問題