15

PHP GET 変数に配列を挿入してコードを実行できることを最近知りました。

.php?a[]=asd&a[]=asdasd&b[]=$a

それが私が与えられた例でした。それがどのように機能するのかわかりませんが、これが可能かどうか疑問に思っていましたか?

4

9 に答える 9

9

PHP はクエリ文字列を解析し、それらの値を$_GETスーパーグローバル配列に挿入します($_POSTこれが POST を使用したフォームで行われた場合も同様です)

あなたの場合、$_GET配列にはこれが含まれます:

array
  'a' => 
    array
      0 => string 'asd' (length=3)
      1 => string 'asdasd' (length=6)
  'b' => 
    array
      0 => string '$a' (length=2)

$_GETクエリ文字列で渡された各値は、クエリ文字列で使用されている場合、必要に応じてサブ配列を作成して、PHP によって配列に配置[]されます。

しかし、これはいかなる種類の「コード実行」も引き起こしません: 入力を適切に処理する限り(つまり、入力を信頼して使用evalしないか、このような悪い考えをしないでください)、リスクはありませんコードインジェクション。

于 2009-12-11T05:34:13.920 に答える
7

セキュリティを確保する方法がわからない場合、少なくとも $_GET 配列をフィルタリングすることができます。関数は次のとおりです。

function filter_url($url)
{
  if (is_array($url))
  {
    foreach ($url as $key => $value)
    {
      // recurssion
      $url[$key] = filter_url($value);
    }
    return $url;
  }
  else
  {
    // remove everything except for a-zA-Z0-9_.-&=
    $url = preg_replace('/[^a-zA-Z0-9_\.\-&=]/', '', $url);
    return $url;
  }
}

これで、次のように $_GET をフィルタリングできます。

$_GET = filter_url($_GET);

これにより、基本的に [ ] などの疑わしい文字から $_GET 配列がクリーンアップされます。

ありがとう

于 2009-12-11T06:56:10.743 に答える
2

簡単に言うと、コードは実行されません。そうでなければ、誰かがすでにFacebookをハッキングしていたと思いませんか?:)

ディープアレイネスティングを使用してバッファオーバーフロー/ダブルフリー/その他のハックベクトルをトリガーする他のバグについて混乱していると言った人は、理論的にはコードの実行に使用できると思います。多くの人気のあるソフトウェアで毎日見られるように、これらはソフトウェアのバグです。通常、パッチはすぐに適用されます。

あなたはhttp://www.suspekt.org/でより多くの情報を見つけるかもしれません

于 2009-12-11T05:52:27.557 に答える
2
echo $_GET['a'][0]; //prints "asd"
echo $_GET['a'][1]; //prints "asdasd"
echo $_GET['b'][0]; //prints "$a"
于 2009-12-11T05:34:21.267 に答える
2

上記はコードの実行を厳密に許可するものではありませんが、データが配列である可能性があるという事実を考慮しない場合、既存のコードの制御フローが変更される可能性があります。

上記が機能する理由は、PHP が [] で終わる変数を配列として解釈するためです。したがって、[] で終わる同じ名前の複数の GET 変数を指定すると、PHP はすべての値を含む配列を作成します。

于 2009-12-11T05:35:51.740 に答える
2

彼は、配列を渡したときに評価が異なる何かについて話していると思います

strcasecmp( $_GET['password'], $password ) == 0 ) { echo($secret); } ` 空の配列を strcasecmp に渡すと、何らかの理由で true と評価されます。

IE: index.php?password=[]

于 2013-09-18T23:57:43.647 に答える
1

あなたは何かを誤解しているようです。

上記の例は、次のような配列を作成するだけです

Array (
  [a] => Array (
    [0] => asd
    [1] => asdasd
  )
  [b] => Array ( [0] => $a )
)

これは文書化されており、意図したとおりに機能します。

于 2009-12-11T05:35:16.070 に答える
0

誰かがあなたに嘘をつきました。あなたはそれで何も実行しません。単純な変数の代わりに配列を送るだけです。

このコードを試してください

<?php
    $x = $_GET['x'];
    var_dump($x);
?>

?x=1 を使用してアクセスし、次に ?x[a]=1&x[b]=2 を使用してアクセスします。これは予想される動作であり、インジェクションではなく、コードを実行することはできません。

于 2009-12-11T05:34:00.567 に答える