NoSQL注入是一种代码注入漏洞,当使用不受信任的数据构造NoSQL数据库查询时发生。与传统的SQL数据库不同,NoSQL数据库不使用SQL查询语言,但它们仍然可以通过其自身的查询操作符和语法受到注入攻击。
NoSQL数据库(如MongoDB、Cassandra、CouchDB等)提供了更宽松的一致性限制,并且通常使用基于JSON的查询而不是SQL语法。虽然这些数据库不使用SQL,但当应用程序未能在使用用户输入构造数据库查询之前对其进行正确清理时,它们仍然容易受到注入攻击。
来源: NoSQL Injection/README.md1-4
有几种工具可用于帮助识别和利用NoSQL注入漏洞
来源: NoSQL Injection/README.md21-25
NoSQL注入在语法和利用技术上都与传统的SQL注入不同。下图说明了NoSQL注入如何适应更广泛的注入漏洞类别。
来源: NoSQL Injection/README.md27-29 基于注入的漏洞关系图
NoSQL注入漏洞可以通过多种方法利用。下图说明了NoSQL注入攻击的一般流程
来源: NoSQL Injection/README.md27-29
NoSQL数据库在其查询语法中通常使用特殊操作符。如果用户输入未经过适当的清理,这些操作符可以被篡改以改变查询行为。
| 运算符 | 描述 |
|---|---|
| $ne | 不等于 |
| $regex | 正则表达式 |
| $gt | 大于 |
| $lt | 小于 |
| $nin | 不在其中 |
示例:如果一个Web应用程序使用如下查询
攻击者可以注入一个NoSQL查询:{ "$gt": 0 } 来检索所有价格大于零的产品
来源: NoSQL Injection/README.md31-53
NoSQL注入可以通过操纵查询操作符来绕过身份验证机制。常见技术包括
username[$ne]=toto&password[$ne]=toto
login[$regex]=a.*&pass[$ne]=lol
login[$gt]=admin&login[$lt]=test&pass[$ne]=1
login[$nin][]=admin&login[$nin][]=test&pass[$ne]=toto
这些Payload有效地改变查询逻辑以绕过身份验证检查。
来源: NoSQL Injection/README.md55-75
为了提取值的长度信息(如密码),可以使用$regex操作符来匹配特定长度的字符串
username[$ne]=toto&password[$regex]=.{1}
username[$ne]=toto&password[$regex]=.{3}
通过迭代测试不同的长度,攻击者可以确定目标值的确切长度。
来源: NoSQL Injection/README.md77-84
一旦长度已知,就可以使用$regex操作符逐字符测试来进行实际数据提取
username[$ne]=toto&password[$regex]=m.{2}
username[$ne]=toto&password[$regex]=md.{1}
username[$ne]=toto&password[$regex]=mdp
还可以使用$in操作符一次性测试多个可能的值
来源: NoSQL Injection/README.md86-113
有些应用程序实现了过滤器来检测和阻止NoSQL注入尝试。一种绕过技术是利用JSON对象中的重复键。在MongoDB中,当一个文档包含重复键时,只使用最后一次出现的值
在这个例子中,"id"的最终值将是"100"。
来源: NoSQL Injection/README.md115-125
当无法直接检索信息时,可以采用盲注技术。这些技术涉及根据不同的输入观察应用程序行为,以推断数据库内容。
该技术在POST请求中使用JSON数据和正则表达式模式来逐字符提取数据
来源: NoSQL Injection/README.md129-153
与JSON方法类似,但使用URL编码参数
来源: NoSQL Injection/README.md155-179
对于使用GET参数的应用程序,可以应用类似的技术
还提供了Ruby中的替代实现,以提供更多样化的利用选项。
来源: NoSQL Injection/README.md181-231
来源: NoSQL Injection/README.md31-104
| 方面 | SQL 注入 | NoSQL 注入 |
|---|---|---|
| 查询语法 | 基于SQL(SELECT * FROM users WHERE...) | 通常基于JSON或专有 |
| 运算符 | SQL操作符(OR, UNION等) | 数据库特定操作符($ne, $gt等) |
| 攻击向量 | 字符串拼接,UNION攻击 | 操作符操纵,JSON结构修改 |
| 盲注技术 | 基于时间,基于布尔 | 类似方法,但使用NoSQL语法 |
| 影响 | 数据访问,身份验证绕过等 | 类似影响,但使用不同技术 |
| 数据库类型 | MySQL, PostgreSQL, Oracle等 | MongoDB, Cassandra, CouchDB等 |
来源: NoSQL Injection/README.md3-4 基于注入的漏洞关系图
有几个实验环境可用于练习NoSQL注入技术
来源: NoSQL Injection/README.md233-236
NoSQL注入领域正随着新的研究和技术而不断发展。一些值得注意的资源包括
有关完整的参考文献列表,请查阅原始文档中的参考文献部分。