36 NoSQL 注入
前言
● NoSQL 注入针对非关系数据库,包括面向文档的数据库、键值存储和图形数据库。虽然 NoSQL 数据库因其可扩展性、灵活性和易用性而越来越受欢迎,但它们也容易受到注入攻击,从而损害数据的机密性、完整性和可用性。了解这些漏洞并知道如何利用它们来测试 Web 应用程序的安全性至关重要。
● NoSQL 注入攻击可以让攻击者读取或修改敏感数据、执行任意代码,甚至控制整个 NoSQL 数据库。
结构化查询语言 (SQL)
SQL 数据库已经存在了几十年,是 Web 应用程序中最常用的数据库类型。这些数据库使用结构化查询语言 (SQL) 以结构化格式存储和检索数据,使其易于使用且高效。然而,它们也容易受到 SQL 注入攻击,攻击者可以利用这种攻击执行恶意 SQL 语句,获取敏感数据的访问权限,甚至控制数据库。
SQL 注入攻击是指攻击者将恶意 SQL 语句输入到易受攻击的应用程序的输入字段(例如登录表单、搜索字段或联系表单)中。如果应用程序未能正确验证和过滤输入,攻击者的恶意 SQL 语句可能会被数据库执行,从而导致意外且往往是灾难性的后果。
一些常见的 SQL 注入攻击类型包括:
● 基于联合的 SQL 注入:攻击者使用 UNION 运算符组合两个 SELECT 语句,从而允许他们从数据库中提取他们不应该访问的数据。
● 基于错误的 SQL 注入:攻击者使用无效的输入值触发数据库的错误消息,据称这会泄露有关数据库结构和内容的信息。
● 盲 SQL 注入:攻击者使用基于布尔或基于时间的技术从数据库中提取信息,而无需查看实际输出。
不仅仅是 SQL(NoSQL)
与 SQL 数据库不同,NoSQL 数据库旨在存储和检索非结构化或半结构化数据。它们灵活、可扩展,能够高效处理海量数据。然而,它们也容易受到 NoSQL 注入攻击,这种攻击可能造成与 SQL 注入攻击类似的后果,包括数据窃取和应用程序入侵。
NoSQL 注入攻击是指攻击者将恶意数据输入到与 NoSQL 数据库交互的应用程序输入字段(例如搜索字段或评论表单)中。如果应用程序未能正确验证和过滤输入,攻击者的恶意代码可能会被 NoSQL 数据库执行,从而导致意外且往往灾难性的后果。
一些常见的 NoSQL 注入攻击类型包括:
● 命令注入:攻击者输入的命令被NoSQL数据库解释为代码,从而允许他们在服务器上执行任意命令。
● 对象注入:攻击者输入一个序列化的对象,该对象被应用程序反序列化并在服务器上执行,从而允许他们访问敏感数据或执行任意代码。
● JavaScript 注入:攻击者输入由客户端应用程序执行的 JavaScript 代码,从而窃取用户数据或操纵应用程序的行为。
SQL注入与NoSQL注入
下表简要比较了 NoSQL 和 SQL 数据库的特性和属性。
数据库管理系统 | NoSQL数据库 | SQL数据库 |
询问 | 没有单一的声明性查询语言,它完全依赖于数据库类型。 | 结构化查询语言 (SQL) 用于编写查询。 |
架构 | 没有预定义的模式。 | 使用预定义的模式。 |
可扩展性 | 水平和垂直可扩展性。 | 垂直可扩展性。 |
支持 | 支持分布式系统。 | 一般来说,不适合分布式系统。 |
用法 | 一般用于大数据应用。 | 一般用于较小的应用程序或项目。 |
表现 | 为大型数据集和写入密集型工作负载(例如社交媒体应用程序)提供更好的性能。 | 在处理大型数据集时可能会遇到性能问题,但在处理读取密集型工作负载(例如数据仓库)时表现良好。 |
结构 | 以键值、列式文档和图形的形式组织和存储数据。 | 以表格和固定列和行的形式组织和存储数据。 |
造型 | 提供更简单的数据建模,更好地适应分层数据结构。 | 仅限于平面关系模型,不太适合分层数据。 |
可用性 | 提供高可用性,允许在节点发生故障时不间断地访问数据。 | 高可用性需要复杂的设置,例如集群和复制。 |
数据类型 | 可以处理多种数据类型,包括多媒体 | 仅限于处理结构化数据类型 |
MongoDB 中的 NoSQLi
在 MongoDB 中,数据以 BSON(二进制 JSON)文档的形式存储,这些文档与 JSON 对象类似,但包含一些额外的数据类型。MongoDB 使用一种名为 MongoDB 查询语言 (MQL) 的查询语言来操作和检索这些文档中的数据。例如,检索具有特定用户名的用户的查询可能如下所示:
在此查询中,在 db数据库中的users集合上调用find()方法,并将查询对象{username: “secops”}作为参数传递。此查询将检索users集合中username字段等于“secops”的所有文档。
但是,如果用户输入未经任何验证或清理就直接传递到查询中,攻击者可以通过输入特制的值来利用此漏洞,该值会以某种方式修改查询。例如,攻击者可以像这样在用户名字段中输入值:
MongoDB 会将此值解释为与空字符串的“大于”比较。查询结果如下:
此查询将匹配 用户 集合中所有 用户名字 段大于空字符串的文档,从而有效地匹配集合中的所有文档。攻击者可以利用此技术检索敏感数据或以非预期的方式修改数据。
现在让我们尝试通过另一个例子来加深理解。我们来看以下 MQL 查询:
攻击者可能能够通过添加可能改变其行为的其他查询参数来修改此查询:
修改后的查询将返回所有用户名为 secops且密码不为空的用户文档。攻击者可以利用此技术绕过身份验证并获取敏感数据的访问权限。
ElasticSearch 中的 NoSQLi
Elasticsearch 是一款功能强大的 NoSQL 数据库,旨在快速高效地索引和搜索海量数据。它广泛应用于电子商务、社交媒体和金融服务等众多领域。然而,与其他数据库一样,Elasticsearch 也容易受到攻击,包括 NoSQL 注入。
在 Elasticsearch 中,当应用程序接受用户输入并在未经适当验证或清理的情况下使用该输入构建 Elasticsearch 查询时,可能会发生 NoSQL 注入攻击。这允许攻击者将恶意代码注入查询参数,并以意想不到的方式操纵查询。
例如,考虑以下搜索具有特定 ID 的文档的 Elasticsearch 查询:
此查询在索引index_name中搜索ID 为123的文档。然而,攻击者可以将以下代码注入 ID 参数中,以检索索引中的所有文档:
这将导致以下查询:
OR运算符会导致查询匹配索引中的所有文档,从而允许攻击者检索敏感信息。
Redis 中的 NoSQLi
Redis 是一个流行的 NoSQL 数据库系统,因其高性能和低延迟而被广泛使用。然而,与许多 NoSQL 数据库一样,Redis 容易受到 NoSQL 注入攻击。Redis 命令使用一种名为 Redis 序列化协议 (RESP) 的基于文本的协议发送。该协议采用一种简单的格式,其中每个命令由一个或多个字符串组成,每个字符串之间用换行符分隔。例如,用于设置键值对的 Redis 命令可能如下所示:
在 NoSQL 注入攻击中,攻击者可以通过添加其他命令或更改现有命令的参数来操纵上述命令。例如,攻击者可能会尝试通过在SET命令末尾附加以下命令来注入一条删除数据库中所有键的命令:
此命令将mykey键的值设置为myvalue ,然后删除数据库中的所有键。
Memcached 中的 NoSQLi
Memcached 是一个广泛使用的分布式内存缓存系统,常用于提升 Web 应用程序的性能。然而,它并非完全没有安全漏洞,其中之一就是 Memcached NoSQL 注入漏洞。
当攻击者向 Memcached 服务器发送特制请求时,就会发生 Memcached NoSQL 注入漏洞。该请求包含一个旨在利用应用程序中漏洞的有效载荷。该有效载荷可以是多种技术的组合,例如命令注入、SQL 注入或跨站点脚本 (XSS)。
Memcached NoSQL 注入攻击中最常用的技术是命令注入。在命令注入中,攻击者发送一个请求,其中包含应用程序将在 Memcached 服务器上执行的命令。该命令可以是系统命令,例如ls或cat ,也可以是 Memcached 特定的命令,例如stats或get 。攻击者随后可以使用执行命令的输出来收集敏感信息或执行其他命令。
以下 Python 代码向 Memcached 服务器发送 GET 请求以根据用户提供的密钥检索值:
这段代码会提示用户输入要从Memcached 服务器检索的键。memcache库用于创建与服务器的客户端连接,并检索与该键关联的值。如果该值存在,则将其返回到控制台。否则,会返回一条错误消息。
然而,这段代码容易受到 Memcached NoSQL 注入攻击。攻击者可以提供恶意密钥,例如 '; system(“rm -rf /”); # ,这将导致在服务器上执行以下查询:
这将在服务器上执行rm -rf /命令,从而删除服务器上的所有文件和目录。
为了防止 Memcached NoSQL 注入攻击,务必净化用户输入并使用参数化查询。以下示例展示了如何修改上述代码以阻止 Memcached NoSQL 注入攻击:
在这段修改后的代码中,用户输入经过了过滤,删除了 Memcached NoSQL 注入攻击中常用的分号、破折号或井号。memcache库的get_multi()方法 用于检索与已过滤键关联的值。value变量是一个字典,包含服务器返回的所有键和值,因此可以使用value[key]访问与已过滤键关联的值。这确保了用户输入经过了正确的过滤,并有效防止了 Memcached NoSQL 注入攻击。
CouchDB 中的 NoSQLi
在 CouchDB 中,当攻击者向数据库提交未经适当清理或验证的恶意查询时,可能会发生 NoSQL 注入。这可能导致未经授权访问敏感数据、修改数据,甚至删除整个数据库。
以下示例展示了使用 Nano 库与 CouchDB 数据库交互的 JavaScript 代码片段:
在这个例子中,代码容易受到 NoSQL 注入的攻击,因为它直接在查询中使用用户输入(用户名和密码)从数据库中检索用户数据(db.get('users', username, …) ),而没有进行任何验证或清理。
攻击者可以通过提交包含特殊字符(例如 $ 、| 、& 、;等)的恶意用户名或密码来利用此漏洞,这可能会改变查询的结构并可能允许未经授权的访问或操纵数据。
为了防止上述示例中的 NoSQL 注入,代码应使用参数化查询和输入验证,以确保用户输入得到适当的清理和验证。例如:
在这个更新的示例中,代码使用参数化查询 ( db.view ),该查询指定要搜索的键 ( username ),并正确验证输入以确保其不为空或 null。此外,该代码使用视图来检索用户数据,而不是直接查询数据库,以提高安全性和效率。
检测
尽管本质上很复杂,但可以通过执行以下步骤来检测 NoSQL 注入漏洞:
● 了解每个NoSQL数据库使用的语法和查询语言,以检测NoSQL注入。
● 分析数据库的API、文档和代码示例以识别有效的语法和参数。
● 尝试向数据库注入恶意输入并观察其响应。
● 制作可绕过输入验证和过滤机制的有效载荷,以执行任意代码或泄露敏感数据。
● 利用NoSQLMap和Nosql-Exploitation-Framework等工具自动化检测过程并提供攻击面的综合报告。
NoSQLMap
NoSQLMap 是一款开源渗透测试工具,旨在检测和利用 NoSQL 注入漏洞。该工具通过针对已知的注入向量和有效载荷测试目标应用程序,自动发现 NoSQL 注入漏洞。它支持多种 NoSQL 数据库,包括 MongoDB、Cassandra 和 CouchDB,并可执行各种任务,例如转储数据、暴力破解密码和执行任意命令。NoSQLMap 使用命令行界面 (CLI),并提供一系列选项和开关来自定义所使用的攻击向量和技术。该工具还支持脚本编写,并可与其他安全测试工具(例如 Metasploit 和 Nmap)集成。
NoSQLMap 工具提供了一个命令行界面,可以通过打开终端并导航到安装 NoSQLMap 的目录来访问。执行以下命令来测试目标应用程序:
将<target_url>替换为目标应用程序的 URL。您可以使用-d等选项指定目标数据库,-p指定端口,以及-v启用详细输出。例如,如果您想测试在端口27017上运行的 MongoDB 数据库,则命令如下:
NoSQLMap 支持多种注入技术,例如基于布尔值、基于错误和基于时间的注入。您可以使用-t选项指定要使用的技术。例如,要使用基于布尔值的技术,可以使用以下命令:
NoSQLMap 附带一组预定义的有效负载,可用于测试 NoSQL 注入漏洞。您还可以使用–eval选项创建自定义有效负载。例如,要使用自定义有效负载,您可以使用以下命令:
NoSQLMap 会生成一份包含其发现的漏洞的报告,其中包括注入类型、受影响的参数以及用于利用漏洞的有效载荷。您可以使用这些信息进一步测试和利用漏洞。例如,如果 NoSQLMap 发现漏洞,您可以使用–sql-shell选项获取数据库的 shell 并执行命令。
Nosql开发框架
NoSQL Exploitation Framework(NoSQL-Exploitation-Framework)是一个用于审计和利用 NoSQL 数据库的工具。它是一个开源项目,提供各种模块和插件,用于自动检测和利用 MongoDB、CouchDB、Redis 和 Cassandra 等各种数据库中的 NoSQL 注入漏洞。
NoSQL-Exploitation-Framework 工具提供了命令行界面和 Web 界面,可用于扫描和测试目标 NoSQL 数据库是否存在各种漏洞。它支持不同类型的攻击,包括远程代码执行、SQL 注入、跨站点脚本 (XSS) 和文件检索。该工具还可以执行暴力破解攻击,以猜测弱密码和用户名。
NoSQL-Exploitation-Framework 工具可以安装在各种操作系统上,包括 Linux、macOS 和 Windows,并且需要安装 Python 和 Pip。它具有高度可定制性,允许用户编写自己的模块和插件来扩展该工具的功能。
启动NoSQL-Exploitation-Framework工具并执行以下命令:
这将以命令行模式启动 NoSQL-Exploitation-Framework 工具。
NoSQL-Exploitation-Framework 启动后,需要使用 set 命令配置数据库连接,然后配置数据库详细信息。例如,要配置 MongoDB 连接,可以使用以下命令:
将<username> 、<password> 、<hostname> 、<port>和<database_name>替换为 MongoDB 实例的实际值。
然后,您可以使用show modules命令列出 NoSQL-Exploitation-Framework 工具中可用的模块。这将显示所有可用模块及其描述的列表。
要加载模块,请使用use命令,后跟模块名称。例如,要加载 MongoDB 远程代码执行模块,请使用以下命令:
加载模块后,需要使用 set 命令加上参数名称和值来设置所需的参数。例如,要设置目标 IP 地址和端口,可以使用以下命令:
最后,您可以使用运行命令来运行漏洞利用程序。这将执行命令并尝试利用目标 NoSQL 数据库中的漏洞。
漏洞的输出将显示在屏幕上,其中包括有关漏洞的详细信息以及漏洞利用是否成功。
实践实验室
找到旗帜
作为一支由高级渗透测试人员和安全研究人员组成的团队,我们坚信实践操作是保障网络安全的关键。因此,我们在平台上发布了 NoSQL 注入实践实验室。漏洞机器。学习者可以通过在反映现实生活情况的实验室中练习来进一步了解这种脆弱性及其利用。
启动实验室并导航到主页后,我们可以观察到有三种类型的 NoSQL 注入实验室可供使用,现在让我们选择“查找标志” ,如下所示:
导航到“Find The Flag”实验室后,我们可以看到屏幕上出现了一个名为“JavaScript 注入”的页面。该页面还提到我们必须利用 NoSQLi 来确定应用程序的其他用户,如下所示:
由于我们在此场景中的目标是发现所有用户,因此我们希望注入一个始终求值为 true 的有效负载。如果我们注入一个字符串,例如' || '1'=='1 ,后端的查询将变为$where: `this.username == ” || '1'=='1' ,其求值始终为 true,因此返回所有结果,如下所示:
绕过登录
启动实验室并导航到主页后,我们可以观察到屏幕上出现了一个登录页面,其中提到登录表单容易受到 MongoDB Verb Injection 漏洞的攻击,如下所示:
要执行此攻击,请通过 Burp Suite 代理捕获登录请求并将其发送到中继器选项卡。
在用户名和密码字段中添加如下payload ,观察攻击是否成功,在响应体中可以查看flag,如下图所示:
查找管理员密码
启动实验室并导航到主页后,我们可以观察到屏幕上出现了一个登录页面,其中提到登录表单容易受到 MongoDB Verb Injection 漏洞的攻击,如下所示:
使用 Burp Suite 代理捕获请求并将其发送给入侵者。正则表达式以字符a、b、c、d、e、f、g、…、z开头。逐个检查字符,可以发现字符f显示的是一个登录消息:
观察字符f显示了有效的用户 ID 和密码,如下所示:
现在使用狙击手攻击类型对带有正则表达式的密码字段执行暴力破解。向入侵者发送请求并点击清除:
点击添加(添加有效载荷标记)并将^f标记为攻击的有效载荷位置。
单击“Payloads”并加载从a到z 、A到Z和0 – 9 的所有字符,然后单击“开始 攻击”按钮:
注意密码字段fl其中字符l内容长度为 343 而其他字母长度为 263:
对每个字符进行暴力破解,以确定admin用户的密码,如下所示:
最后,您将获得管理员用户的密码。
缓解措施和最佳实践
● 使用参数化查询:使用参数化查询可以避免将用户输入与查询连接在一起。这有助于防止攻击者将恶意代码注入您的查询中。
● 验证用户输入:验证所有用户输入,确保其仅包含预期值,并过滤所有输入,删除应用程序运行不需要的任何字符。拒绝任何不符合预期格式的输入。这有助于防止攻击者在您的查询中注入恶意代码。
● 实施基于角色的访问控制:限制用户仅访问其履行工作职责所需的资源。这有助于防止攻击者访问敏感数据。
● 使用数据加密:加密存储在数据库中的数据,以防止攻击者读取敏感信息。
● 应用最小权限原则:根据需要知道的原则向用户授予权限。这可以限制攻击者获取用户帐户访问权限后可能造成的损害。
参考文献和进一步阅读
● https://owasp.org/www-pdf-archive/GOD16-NOSQL.pdf
● What Is NoSQL Injection? | MongoDB Attack Examples | Imperva
● NoSQL injection - HackTricks
● https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2Fgit-blob-3b49b5d5a9e16cb1ec0d50cb1e62cb60f3f9155a%2FEN-NoSQL-No-injection-Ron-Shulman-Peleg-Bronshtein-1.pdf?alt=media