0%

NoSQL注入

什么是NoSQL

NoSQL,指的是非关系型的数据库。NoSQL 有时也称作 Not Only SQL 的缩写,是对不同于传统的关系型数据库数据库管理系统的统称。NoSQL 用于超大规模数据的存储。(例如谷歌或 Facebook 每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。


NoSQL 提供了新的数据模型和查询格式,从而可以规避常规的 SQL 注入攻击。但是,它们也为攻击者提供了插入恶意代码的新方法。总的来讲有四种注入手法:

1、重言式

又称为永真式(这个好像是数理逻辑里面的术语),此类攻击是在条件语句中注入代码,使生成的表达式判定结果永远为真,从而绕过认证或访问机制。

2、联合查询

联合查询是一种众所周知的SQL注入技术,攻击者利用一个脆弱的参数去改变给定查询返回的数据集。联合查询最常用的用法是绕过认证页面获取数据。

3、JavaScript 注入

MongoDB Server 支持 JavaScript,这使得在数据引擎进行复杂事务和查询成为可能,传递不干净的用户输入到这些查询中可以注入任意 JavaScript 代码,导致非法的数据获取或篡改。

4、盲注

当页面没有回显时,那么我们可以通过$regex正则表达式来达到和 SQL 注入中substr()函数相同的功能,而且 NoSQL 用到的基本上都是布尔盲注。


对于 PHP 本身的特性而言,由于其松散的数组特性,导致如果我们输入value=1那么,也就是输入了一个 value 的值为 1 的数据。如果输入value[$ne]=1也就意味着value=array($ne=>1),在 MongoDB 中,原来的一个单个目标的查询变成了条件查询。同样的,我们也可以使用username[$gt]=&password[$gt]=作为 payload 进行攻击。

在我看来,nosql注入就是通过传入数组然后拼接恶意语句造成注入,和其他数据库的注入原理类似,但是语法有所不同。

查询操作符

nosql的查询操作符不用or、and、=等等,取而代之的是$eq、$ne、$gt

方法名 描述
$gt 大于
$lte 小于等于
$in 包含
$nin 不包含
$lt 小于
$gte 大于等于
$ne 不等于
$eq 等于
$and
$nor $nor在NOR一个或多个查询表达式的数组上执行逻辑运算,并选择 对该数组中所有查询表达式都失败的文档
$not 反匹配(1.3.3及以上版本),字段值不匹配表达式或者字段值不存在
$or

例如:

我们传入username=admin&password=123456

后端就会处理成

1
2
3
4
array(
'username' => 'admin',
'password' => '123456'
)

如果我们传入username[$ne]=1&password[$ne]=1

后端处理成

1
2
3
4
array(
'username' => array('$ne' => 1),
'password' => array('$ne' => 1)
)

查询的语句就会变成db.users.find({'username':{$ne:1}, 'password':{$ne:1}})

意思就是查询username不等于1,password不等于1的用户

此外,nosql还可以进行javascrip注入

例如:db.users.find( { $where: function() { return this.username == 'admin'; } } )

该查询返回在users集合中username等于admin的所有文档。

参考链接

从零学习 NoSQL 注入之 Mongodb

get-started-with-nosql-injection-nosqli