下面就介紹下php+mongodb注入的方法和原理
其中一篇帖子說:login.php?username=admin&passwd[$ne]=1就有可能注入,剛看的時候,我感覺挺納悶的,這個怎麼就存在注入漏洞了呢,終於從這篇帖子http://hi.baidu.com/hi_heige/item/ce93ce926dede4f428164747中發現了原因。因為PHP是可以直接提交array的,也就是說提交的是含有“$ne”索引的數組,我做了個demo:
[php]
$passwd=$_GET["passwd"];
var_dump($passwd);
$passwd=$_GET["passwd"];
var_dump($passwd);
測試結果為:
array(1) { ["$ne"]=> string(1) "1" }
這樣的話
[php]
$collection->find(array(
"username" => "admin",
"passwd" => array("$ne" => 1)
));
$collection->find(array(
"username" => "admin",
"passwd" => array("$ne" => 1)
));
就變為了:
[php]
$collection->find(array( "username" => "admin", "passwd" => array("$ne" => 1) )); $collection->find(array(
"username" => "admin",
"passwd" => array("$ne" => 1)
));
如果把鏈接改成這種(username=[$ne]=1&passwd[$ne]=1)的話,那麼會把所有的用戶信息都獲取過來
解決這個bug的方法為在獲取參數後都把參數強制轉換成string類型下:
[php]
$collection->find(array(
"username" => (string)$_GET['username'],
"passwd" => (string)$_GET['passwd']
));
$collection->find(array(
"username" => (string)$_GET['username'],
"passwd" => (string)$_GET['passwd']
));這個與執行下面的mysql語句是一樣的道理了,都注入了
[php]
mysql_query("SELECT * FROM collection
WHERE username="admin",
AND passwd!=1
mysql_query("SELECT * FROM collection
WHERE username="admin",
AND passwd!=1
我做了個demo測試了下,果然好使。