一直以为注入只存在关系型数据库中,看了这篇文章才知道mongodb也会中招.
翻看php手册发现早就发现有这个问题,以前看手册一直没注意.
数组绑定时的注入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <?php $mongo = new mongoclient(); $db = $mongo->myinfo; $coll = $db->test; $username = $_GET['username']; $password = $_GET['password']; $data = array( 'username'=>$username, 'password'=>$password ); $data = $coll->find($data); $count = $data->count(); if ($count>0) { foreach ($data as $user) { echo 'username:'.$user['username']."</br>"; echo 'password:'.$user['password']."</br>"; } } else{ echo '未找到'; } ?>
|
如果传入url为
1
| http://127.0.0.1/2.php?username[$ne]=test&password[$ne]=test
|
mongodb最终执行:
1
| db.test.find({username:{'$ne':'test'},password:{'$ne':'test'}});
|
php会把test集合内的所有数据全部便利出来。
防止注入的方法也很简单, 注意参数的检验.
1 2 3 4 5 6 7 8 9
| <?php ... $username = $_GET['username']; $password = $_GET['password']; $username = is_string($username) ? $username : ''; $password = is_string($password) ? $password : ''; ... ?>
|
接受参数拼接直接以命令行执行的注入可以参考php手册 使用MongoCode 进行转椅后再使用.