日期:2014-05-16  浏览次数:20351 次

php mongodb 注入

转载请注明来源:http://blog.csdn.net/kaosini/article/details/8732566

这两天学习sqlmap这个工具的时候,突然想到一个问题:nosql是否也存在注入漏洞。于是上网搜索了一下午,得出来了个论:

  • php+mongodb的话还是存在有注入漏洞的
  • asp.net+mongodb的话,暂时还没发现


下面就介绍下php+mongodb注入的方法和原理

其中一篇帖子说:login.php?username=admin&passwd[$ne]=1就有可能注入,刚看的时候,我感觉挺纳闷的,这个怎么就存在注入漏洞了呢,终于从这篇帖子http://hi.baidu.com/hi_heige/item/ce93ce926dede4f428164747中发现了原因。因为PHP是可以直接提交array的,也就是说提交的是含有“$ne”索引的数组,我做了个demo:

$passwd=$_GET["passwd"];
var_dump($passwd);

测试结果为:

array(1) { ["$ne"]=> string(1) "1" } 


这样的话

$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类型下:

$collection->find(array(
    "username" => (string)$_GET['username'],
    "passwd" => (string)$_GET['passwd']
));

这个与执行下面的mysql语句是一样的道理了,都注入了

mysql_query("SELECT * FROM collection
    WHERE username="admin",
    AND passwd!=1

我做了个demo测试了下,果然好使。


另外参考老外的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字节注射