web-dev-qa-db-ja.com

PHPのeval()関数は、配列から構築された文字列を実行するときのコードインジェクションに対して脆弱ですか?

私はPHP eval()の悪用についてもっと学びたいと思っていて、このシナリオに出くわしました:

<?php

$test = array();
$test[0] = "command0 ";
$test[1] = $_GET["cmd1"];
$test[2] = "command2 ";
$test[3] = "command3 ";

$params = "";
for ($i = 0; $i < count($test); $i++) {
        $params .= "\$test[$i]";
}

echo $params;
echo "<br>";

$cmd = "echo \"" . $params . "\";";
echo $cmd;
echo "<br>";

eval($cmd);
?>

$ _GETパラメータに二重引用符とバックスラッシュのいくつかの組み合わせを挿入しようとしましたが、$ cmd文字列を抜け出すことができませんでした。

XSSバグを超えて、このコードスニペットは脆弱ですか?これは、PHPコードインジェクションで悪用される可能性がありますか?

7
Robleh

いいえ、これはPHPコードインジェクションに対して脆弱ではありません。

eval()に渡される文字列は、単にユーザーが制御するものではありません。ソース_$_GET["cmd1"]_からシンクeval()へのパスはありません。

  • eval()の引数は_$cmd_です。
  • _$cmd_は、固定文字列と_$params_からアセンブルされます。
  • _$params_は、固定文字列と_$i_から累積されます。
  • _$i_は、配列_$text_の(固定)長さに依存する反復変数です。

とはいえ、生成された配列をevalを介して渡すのは確かに良いスタイルではなく、出力をサニタイズしていないため、コードがXSSに対して脆弱になります。

5
Arminius

ここで評価しているコードは実際には完全に修正されているため、PHPここではコードインジェクションはできません。

evaledを取得するコードは常に:

echo "$test[0]$test[1]$test[2]$test[3]";

これらの変数は文字列データとして参照されるため、安全です(XSSを除く)。

1