NoSQL 注入
NoSQL注入是一种漏洞,攻击者可以利用它干扰应用程序对NoSQL数据库的查询。NoSQL注入可能使攻击者能够:
-
绕过认证或保护机制。
-
提取或编辑数据。
-
导致拒绝服务。
-
在服务器上执行代码
NoSQL 数据库以传统 SQL 关系表以外的格式存储和检索数据。它们使用多种查询语言,而不是像 SQL 这样的通用标准,并且关系约束较少。
更多信息
有关 NoSQL 数据库及其与 SQL 数据库区别的更多信息,请参阅 NoSQL 数据库。
NoSQL 注入类型
NoSQL 注入有两种不同类型:
-
语法注入:当您可以破坏 NoSQL 查询语法,从而注入自己的有效载荷时,就会发生这种情况。其方法与 SQL 注入中使用的方法类似。但由于 NoSQL 数据库使用一系列查询语言、查询语法类型和不同的数据结构,因此攻击的性质也大不相同。
-
操作符注入 - 这种情况发生在使用 NoSQL 查询操作符操作查询时。
在本专题中,我们将介绍如何测试一般的 NoSQL 漏洞,然后重点介绍如何利用最流行的 NoSQL 数据库 MongoDB 中的漏洞。我们还提供了一些实验课程,以便您实践所学知识。
NoSQL 语法注入
您可以通过尝试破坏查询语法来检测 NoSQL 注入漏洞。为此,通过提交模糊字符串和特殊字符对每个输入进行系统测试,如果应用程序未对这些字符串和特殊字符进行适当消毒或过滤,它们就会触发数据库错误或其他可检测行为。
如果知道目标数据库的 API 语言,就使用与该语言相关的特殊字符和模糊字符串。否则,请使用各种模糊字符串来针对多种 API 语言。
检测 MongoDB 中的语法注入
虑一个显示不同类别产品的购物应用程序。当用户选择汽水饮料类别时,浏览器会请求以下 URL:
https://insecure-website.com/product/lookup?category=fizzy
这将导致应用程序发送 JSON 查询,从 MongoDB 数据库的产品集合中检索相关产品:
this.category
== 'fizzy'
要测试输入是否可能存在漏洞,请在类别参数值中提交一个模糊字符串。MongoDB 的示例字符串是
'"{
;$Foo}
$Foo \xYZ
使用该模糊字符串构建以下攻击:
https://insecure-website.com/product/lookup?category='%22%60%7b%0d%0a%3b%24Foo%7d%0d%0a%24Foo%20%5cxYZ%00
如果这会导致原始响应发生变化,这可能表明用户输入未被正确过滤或消毒。
注意
NoSQL 注入漏洞可能发生在各种情况下,您需要相应地调整模糊字符串。否则,您可能只会触发验证错误,这意味着应用程序永远不会执行您的查询。
在本例中,我们通过 URL 注入模糊字符串,因此该字符串是 URL 编码的。在某些应用程序中,您可能需要通过 JSON 属性注入有效负载。在这种情况下,有效负载将变成'\"{\r;$Foo}\n$Foo \\xYZ\u0000
确定处理哪些字符
要确定应用程序将哪些字符解释为语法,可以注入单个字符。例如,您可以提交“'”,这将导致以下 MongoDB 查询:
-
this.category
== '''
如果这会导致原始响应发生变化,这可能表明''字符破坏了查询语法并导致语法错误。您可以通过在输入中提交一个有效的查询字符串来确认这一点,例如转义引号:
-
this.category
== '\''
如果这不会导致语法错误,则可能意味着应用程序容易受到注入攻击。
确认条件行为
检测到漏洞后,下一步就是确定能否使用 NoSQL 语法影响布尔条件。
要测试这一点,请发送两个请求,一个带假条件,一个带真条件。例如,您可以使用条件语句' && 0 && 'x
和' && 1 && 'x
具体如下:
https://insecure-website.com/product/lookup?category=fizzy'+%26%26+0+%26%26+'x
https://insecure-website.com/product/lookup?category=fizzy'+%26%26+1+%26%26+'x
如果应用程序的表现不同,则表明假条件会影响查询逻辑,而真条件不会。这表明注入这种语法会影响服务器端查询。
凌驾于现有条件之上
既然已经确定可以影响布尔条件,就可以尝试覆盖现有条件来利用漏洞。例如,您可以注入一个总是求值为 true 的 JavaScript 条件,如``'||'1'=='1`:
https://insecure-website.com/product/lookup?category=fizzy%27%7c%7c%27%31%27%3d%3d%27%31
这将导致以下 MongoDB 查询:
this.category == 'fizzy'||'1'=='1'
由于注入的条件始终为真,因此修改后的查询会返回所有项目。这样,您就可以查看任何类别中的所有产品,包括隐藏或未知类别。
警告
在 NoSQL 查询中注入总是求值为 “true ”的条件时要小心。虽然在注入的初始上下文中这可能是无害的,但应用程序在多个不同查询中使用来自单个请求的数据是很常见的。例如,如果应用程序在更新或删除数据时使用它,就可能导致意外的数据丢失。
检测 MongoDB 中的语法注入-靶场
靶场地址:https://portswigger.net/web-security/nosql-injection/lab-nosql-injection-detection
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)