ホームページ >バックエンド開発 >PHPチュートリアル >php mongodb インジェクション_PHP チュートリアル

php mongodb インジェクション_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-14 10:09:42845ブラウズ


次に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"];

var_dump($passwd);

テスト結果は次のとおりです:

配列(1) { ["$ne"]=> 文字列(1) "1" }

この場合


[php]

$collection->find(array(
"ユーザー名" => "管理者"、
"passwd" => array("$ne" => 1)
));
$collection->find(array(
"ユーザー名" => "管理者",

"passwd" => array("$ne" => 1)

));
次のようになります:


[php]

$collection->find(array( "username" => "admin", "passwd" =>array("$ne" => 1) )); $collection->find(array(
) "ユーザー名" => "管理者",

"passwd" => array("$ne" => 1)

));


リンクをこれ(username=[$ne]=1&passwd[$ne]=1)に変更すると、全てのユーザー情報が取得されます

このバグを解決する方法は、パラメータを取得した後に強制的に文字列型にすることです:

[php]

$collection->find(array(

"ユーザー名" => (文字列)$_GET['ユーザー名'],

"パスワード" => (文字列)$_GET['パスワード']
));
$collection->find(array(
"ユーザー名" => (文字列)$_GET['ユーザー名'],
"passwd" => (文字列)$_GET['passwd']

)); これは、次の mysql ステートメントを実行するのと同じであり、両方とも注入されます



[php]

mysql_query("コレクションから * を選択します

WHERE ユーザー名 = "管理者",
AND パスワード!=1

mysql_query("SELECT * FROM コレクション
WHERE ユーザー名 = "管理者",
AND パスワード!=1

テストするためにデモを作成しましたが、実際に動作します。




http://www.bkjia.com/PHPjc/477615.html

www.bkjia.com

http://www.bkjia.com/PHPjc/477615.html技術記事 php+mongodb インジェクションの方法と原理を紹介します。ある投稿には、login.php?username=adminpasswd[$ne]=1 をインジェクトでき​​ると書かれていました。最初に読んだとき、これは非常に戸惑いました。 .
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。