freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

NoSQL数据库注入原理与实践
2024-12-05 19:28:06

NoSQL 注入

NoSQL注入是一种漏洞,攻击者可以利用它干扰应用程序对NoSQL数据库的查询。NoSQL注入可能使攻击者能够:

  • 绕过认证或保护机制。

  • 提取或编辑数据。

  • 导致拒绝服务。

  • 在服务器上执行代码

NoSQL 数据库以传统 SQL 关系表以外的格式存储和检索数据。它们使用多种查询语言,而不是像 SQL 这样的通用标准,并且关系约束较少。

image.png

更多信息

有关 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

image.png

# 网络安全 # web安全
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录