菜单

NoSQL 注入

相关源文件

NoSQL注入是一种代码注入漏洞,当使用不受信任的数据构造NoSQL数据库查询时发生。与传统的SQL数据库不同,NoSQL数据库不使用SQL查询语言,但它们仍然可以通过其自身的查询操作符和语法受到注入攻击。

介绍

NoSQL数据库(如MongoDB、Cassandra、CouchDB等)提供了更宽松的一致性限制,并且通常使用基于JSON的查询而不是SQL语法。虽然这些数据库不使用SQL,但当应用程序未能在使用用户输入构造数据库查询之前对其进行正确清理时,它们仍然容易受到注入攻击。

来源: NoSQL Injection/README.md1-4

工具

有几种工具可用于帮助识别和利用NoSQL注入漏洞

  • NoSQLMap:自动化NoSQL数据库枚举和Web应用程序利用工具
  • nosqlilab:一个用于练习NoSQL注入技术的实验环境
  • Burp-NoSQLiScanner:一个用于发现NoSQL注入漏洞的Burp Suite扩展

来源: NoSQL Injection/README.md21-25

NoSQL注入概念

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注入可以通过操纵查询操作符来绕过身份验证机制。常见技术包括

HTTP参数操纵

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

基于JSON的操纵

这些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操作符逐字符测试来进行实际数据提取

HTTP数据方法

username[$ne]=toto&password[$regex]=m.{2}
username[$ne]=toto&password[$regex]=md.{1}
username[$ne]=toto&password[$regex]=mdp

JSON数据方法

还可以使用$in操作符一次性测试多个可能的值

来源: NoSQL Injection/README.md86-113

WAF和过滤器

有些应用程序实现了过滤器来检测和阻止NoSQL注入尝试。一种绕过技术是利用JSON对象中的重复键。在MongoDB中,当一个文档包含重复键时,只使用最后一次出现的值

在这个例子中,"id"的最终值将是"100"。

来源: NoSQL Injection/README.md115-125

盲注NoSQL注入

当无法直接检索信息时,可以采用盲注技术。这些技术涉及根据不同的输入观察应用程序行为,以推断数据库内容。

攻击流程图

带有JSON主体的POST请求

该技术在POST请求中使用JSON数据和正则表达式模式来逐字符提取数据

来源: NoSQL Injection/README.md129-153

带有URL编码主体的POST请求

与JSON方法类似,但使用URL编码参数

来源: NoSQL Injection/README.md155-179

GET方法

对于使用GET参数的应用程序,可以应用类似的技术

还提供了Ruby中的替代实现,以提供更多样化的利用选项。

来源: NoSQL Injection/README.md181-231

常见NoSQL注入模式

来源: NoSQL Injection/README.md31-104

NoSQL与SQL注入比较

方面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注入技术

  • Root Me - NoSQL注入 - 身份验证
  • Root Me - NoSQL注入 - 盲注

来源: NoSQL Injection/README.md233-236

参考资料

NoSQL注入领域正随着新的研究和技术而不断发展。一些值得注意的资源包括

  • matrix的Burp-NoSQLiScanner研究
  • Reino Mostert关于前置条件和后置条件的研究
  • OWASP Web安全测试指南中关于NoSQL注入的部分
  • Zanon关于MongoDB特定注入的研究

有关完整的参考文献列表,请查阅原始文档中的参考文献部分。

来源: NoSQL Injection/README.md238-247