什么是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 | array( |
如果我们传入username[$ne]=1&password[$ne]=1
后端处理成
1 | array( |
查询的语句就会变成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的所有文档。