南馆潇湘
NoSQL注入

如何避免 NoSQL 注入

分享
  • 上官雨宝 2 CISM-WSE 中级信息安全等级测评师 官方采纳
    上官雨宝2 CISM-WSE 中级信息安全等级测评师
    官方采纳

    使用mongoose等数据库。
    如果找不到适合您环境的库,请将用户输入转换为期望的类型。
    切勿在用户输入中使用where等运算符。
    请始终使用最小特权模型:尽可能低的特权运行您的应用程序。

    NoSQL数据库提供比传统SQL数据库更宽松的一致性限制。 通过减少关系约束和一致性检查,NoSQL数据库提供了更好的性能和扩展性。 然而,即使这些数据库没有使用传统的SQL语法,它们仍然可能很容易的受到注入攻击。 由于这些NoSQL注入攻击可以在程序语言中执行,而不是在声明式 SQL语言中执行,所以潜在影响要大于传统SQL注入。

    NoSQL数据库的调用是使用应用程序的编程语言编写的,过滤掉常见的HTML特殊字符,如<>&;不会阻止针对NoSQL的攻击。

    NoSQL注入分类

    我找到了两种NoSQL注入分类的分类方式,第一种是按照语言的分类:PHP数组注入,js注入和mongo shell拼接注入等等。

    第二种是按照攻击机制分类:重言式,联合查询,JavaScript注入等等,这种分类方式很像SQL注入的分类方式。

    我们详细讨论下第二种分类方式:

    1) 重言式

    又称为永真式,此类攻击是在条件语句中注入代码,使生成的表达式判定结果永远为真,从而绕过认证或访问机制。

    2) 联合查询

    联合查询是一种众所周知的SQL注入技术,攻击者利用一个脆弱的参数去改变给定查询返回的数据集。联合查询最常用的用法是绕过认证页面获取数据。

    3) JavaScript注入

    这是一种新的漏洞,由允许执行数据内容中JavaScript的NoSQL数据库引入的。JavaScript使在数据引擎进行复杂事务和查询成为可能。传递不干净的用户输入到这些查询中可以注入任意JavaScript代码,这会导致非法的数据获取或篡改。

    为了避免NoSQL注入,您必须始终将用户输入视为不受信任。您可以执行以下操作来验证用户输入:

    • 使用mongoose等数据库。
    • 如果找不到适合您环境的库,请将用户输入转换为期望的类型。例如,将用户名和密码转换为字符串。
    • 在MongoDB的情况下,切勿在用户输入中使用where,mapReduce或group运算符,因为这些运算符使攻击者能够注入JavaScript,因此比其他运算符更加危险。为了加强安全性,设置javascriptEnabled到false在mongod.conf如果可能的话。
    • 此外,请始终使用最小特权模型:以尽可能低的特权运行您的应用程序,以便即使被利用,攻击者也无法访问其他资源。
  • Andrew 2 CISP-PTE CISM-WSE 官方采纳
    Andrew2 CISP-PTE CISM-WSE
    官方采纳

    为了避免NoSQL注入,您必须始终将用户输入视为不受信任。您可以执行以下操作来验证用户输入:

    • 使用mongoose等数据库。

    • 如果找不到适合您环境的库,请将用户输入转换为期望的类型。例如,将用户名和密码转换为字符串。

    • 在MongoDB的情况下,切勿在用户输入中使用where,mapReduce或group运算符,因为这些运算符使攻击者能够注入JavaScript,因此比其他运算符更加危险。为了加强安全性,设置javascriptEnabled到false在mongod.conf如果可能的话。

    • 此外,请始终使用最小特权模型:以尽可能低的特权运行您的应用程序,以便即使被利用,攻击者也无法访问其他资源。

  • 房乐 2 CISAW CISP-PTE
    房乐2 CISAW CISP-PTE

    1,只需要控制输入,禁止使用危险的操作就可以基本避免NoSQL注入。通过参数过滤就可以避免。

    2,对于JavaScript注入,$where 和Commend方法能不用就尽量不要用了,如果必须用的话一定要限制输入或者把要执行的内容写成JavaScript function通过参数的方式传进去。

    3,不要打开一些MongoDB相关的REST API,防止跨站请求伪造,给应用最小权限,不要存在未授权访问用户

  • 在下炳尚 2 风险管理(专业级)RM/PL 高级信息系统项目管理师
    在下炳尚2 风险管理(专业级)RM/PL 高级信息系统项目管理师

    1,只需要控制输入,禁止使用危险的操作就可以基本避免NoSQL注入。通过参数过滤就可以避免。

    2,对于JavaScript注入,$where 和Commend方法能不用就尽量不要用了,如果必须用的话一定要限制输入或者把要执行的内容写成JavaScript function通过参数的方式传进去。

    3,不要打开一些MongoDB相关的REST API,防止跨站请求伪造,给应用最小权限,不要存在未授权访问用户

  • 写回答