次にphp+mongodbインジェクションの方法と原理を紹介します
投稿の 1 つには、「login.php?username=admin&passwd[$ne]=1 が挿入される可能性がある」と書かれていました。最初に読んだとき、これにどのような脆弱性があるのか非常に困惑しました。最後に、その理由を説明します。 http://hi.baidu.com/hi_heige/item/ce93ce926dede4f428164747 で見つかりました。 PHP は配列を直接送信できるため、つまり、「$ne」インデックスを含む配列が送信されるため、デモを作成しました:
[php]
$passwd=$_GET["passwd"];
var_dump($passwd);
$passwd=$_GET["passwd"];
テスト結果は次のとおりです:
配列(1) { ["$ne"]=> 文字列(1) "1" }
この場合
$collection->find(array(
"ユーザー名" => "管理者"、
"passwd" => array("$ne" => 1)
));
$collection->find(array(
"ユーザー名" => "管理者",
));
次のようになります:
[php]
$collection->find(array( "username" => "admin", "passwd" =>array("$ne" => 1) )); $collection->find(array(
)
"ユーザー名" => "管理者",
));
リンクをこれ(username=[$ne]=1&passwd[$ne]=1)に変更すると、全てのユーザー情報が取得されます
このバグを解決する方法は、パラメータを取得した後に強制的に文字列型にすることです:
$collection->find(array(
"ユーザー名" => (文字列)$_GET['ユーザー名'],
"パスワード" => (文字列)$_GET['パスワード']
));
$collection->find(array(
"ユーザー名" => (文字列)$_GET['ユーザー名'],
"passwd" => (文字列)$_GET['passwd']
[php]
WHERE ユーザー名 = "管理者",
AND パスワード!=1
mysql_query("SELECT * FROM コレクション
WHERE ユーザー名 = "管理者",
AND パスワード!=1
www.bkjia.com