程序员征服安全:分享与学习系列 - NoSQL 注入

NoSQL 数据库正日益普及。不可否认,它们在处理非结构化数据时速度快且便捷,尤其是在开发团队日益采用敏捷开发方法的情况下。
开发人员需要时间来排查新兴技术中的漏洞和其他挑战。只有在生产环境中应用一段时间后,问题才会开始显现。
NoSQL 数据库也是如此。开发人员应了解其中的关键风险,以确保应用程序的安全。NoSQL 注入就是其中一种风险。
让我们来看看什么是 NoSQL 注入、它会造成什么损害以及如何修复它:
了解 NoSQL 注入
NoSQL 注入的成因与 XML 或 SQL 注入等许多注入漏洞相同。
NoSQL 注入允许攻击者将任意命令植入 NoSQL 查询中。如果权限足够高,他们不仅可以窃取数据,甚至还能修改数据库。
当应用程序将用户控制的数据直接放入 NoSQL 查询表达式时,这些表达式中往往包含可被操纵以窃取或篡改数据的函数或内置运算符。如果此类操作被恶意利用,后果将不堪设想。
MongoDB 数据库是此类漏洞最常被利用的目标之一。“$ne: ""”运算符相当于 SQL 世界中的 1=1。举例来说,攻击者可以在用户界面(UI)的用户名和密码字段中输入“$ne: ""”。如果代码存在 NoSQL 注入漏洞,数据库就会搜索所有用户名和密码不等于空字符串的记录。换句话说:搜索所有记录。太可怕了。
如果数据库未加密,攻击者就能窃取其中所有用户的用户名和密码。这甚至包括管理员的账号信息,从而让他们获得访问整个数据库的“通行证”。
攻击者通常会尝试传入始终为真的值。另一种常见的攻击方式是将恶意代码注入到被设置为函数的属性中。
例如,MongoDB 使用一个 find 函数,该函数接收一个包含 $where 属性的对象。$where 属性被设置为一个应评估为真或假的函数。如果该函数被用户输入以任何方式篡改,那么很可能就潜伏着 NoSQL 注入漏洞。
如需深入了解 NoSQL 注入的复杂细节,请查看这篇 InfoQ 文章。
了解 NoSQL 注入的危险性
NoSQL 注入之所以危险,主要是因为它尚未受到安全社区应有的重视。
NoSQL 注入的影响与传统的 SQL 注入基本相同。数据可能被窃取或篡改,账户可能因数据泄露而遭到入侵,而最恶劣的情况是,如果攻击者成功执行删除命令,数据可能会被彻底抹除。
归根结底,MongoDB 和其他 NoSQL 数据库引擎同样容易受到攻击。“No SQL”并不意味着没有注入风险。
值得庆幸的是,社区中已有部分人士注意到了这一点并积极发出警示。更多的开发者需要提升安全意识,保护自己的应用免受那些鲜为人知但一旦被利用就会造成巨大麻烦的隐患侵害。
防御 NoSQL 注入
NoSQL 注入防御起来颇具挑战。遗憾的是,它不像 SQL 注入那样可以使用参数化查询。但这并非无法解决,以下几种方案可以为您提供帮助:
- 模糊测试(Fuzzing)是检测漏洞的一种方法。不过,正如生活中的许多事情一样,最简单的方法往往最有效。在这里,传统的代码审查依然是你最强大的盟友。
- 在审查代码时,请留意用户输入可能影响表达式值或改变函数行为的地方。切勿允许用户输入直接修改查询语句。
- 务必将用户输入强制转换为正确的类型。如果是数字,就转为数字;如果是字符串,就转为字符串,以此类推。
- 永远不要将 $where 或类似的 eval 函数与用户输入混用。在大多数情况下,你可以通过调整数据模型或架构来规避这种需求。
- 尝试使用 Mongoose 作为你的 MongoDB 驱动程序。Mongoose 允许你为 NoSQL 数据库定义架构。如果你告知 Mongoose 输入内容为字符串,它们就会被强制转换为字符串。这样,攻击者传入的任何对象都不会被当作对象处理,而是被视为字符串。
- 加固你的数据库!创建低权限用户账户,限制查询执行时间,并始终遵循适用于贵组织的各项安全最佳实践。
NoSQL 数据库易于使用的缺点在于,开发者往往在部署后就直接投入使用,而完全忽略了安全性。
花时间学习如何安全地部署 NoSQL 数据库并防范 NoSQL 注入至关重要。
例如,MongoDB 企业版针对文档提供了高级访问控制功能。实施“最小权限”原则可以作为一种有效的纵深防御(DiD)策略,以防有人在你的应用中发现漏洞。
总结一下,我们有以下建议:
- 在将输入用于 NoSQL 查询表达式之前,请先进行清理
- 使用 Mongoose 等能提供辅助的驱动程序
- 执行代码审查,重点检查查询中输入数据的使用方式
- 利用模糊测试工具和扫描器来辅助发现代码中的漏洞。
NoSQL 并非没有注入
NoSQL 数据库因其可扩展性和快速部署的特性而迅速普及。由于技术较新,开发者往往在未考虑安全性的情况下就直接使用它们。
NoSQL 数据库在注入攻击面前与 SQL 数据库同样脆弱,因此请务必谨慎并关注你的查询。如需了解更多信息,请查看我们的学习资源,或通过我们的免费演示测试你的技能。
提前做好准备,你就无需担心应用中的 NoSQL 注入问题。就是这么简单!
觉得现在就可以定位、识别并修复 NoSQL 注入了吗?勇士,进入安全代码竞技场吧:
2018 年到此结束!这是我们今年的最后一篇文章,但我们会在 2019 年 1 月 10 日带着下一期《程序员征服安全》指南回归。很快再见!
在 AI 驱动的开发成果发布前实现有效治理
评估 AI 辅助风险,在提交代码时强制执行安全编码策略,并加速整个软件开发生命周期的安全交付。
探索更多博客
获取有关安全编码、人工智能治理和软件风险管理的专家内容。
%252520%252520(3).avif)
Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Security as culture: How Blue Prism cultivates world-class secure developers
Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed
在产品发布前确保 AI 驱动的开发安全
洞察开发风险,执行安全策略,并在整个软件开发生命周期中预防漏洞。



.avif)