当前位置: 首页 > news >正文

应用安全系列之四十七:NoSQL注入

 1、NoSQL注入简介

        NoSQL 注入是一种针对非关系型数据库(如 MongoDB、Cassandra、Redis)的安全攻击手段,攻击者通过构造恶意输入,绕过应用程序的输入验证,篡改数据库查询逻辑,从而窃取数据、破坏数据或执行未授权操作。与传统 SQL 注入不同,NoSQL 注入利用的是 NoSQL 数据库的查询语法特性(如 JSON/BSON 结构、操作符等)。

        NoSQL 注入通常与查询操作相关联,而不是直接与插入操作相关。然而,在特定情况下,如果应用程序在执行插入操作时未正确处理用户输入,并且该输入被用于构造后续的查询或其他动态操作,则可能存在注入风险。 因此,建议在进行插入操作时,也建议对输入进行验证,以防有威胁的字符串被插入到数据库。

2、NoSQL 注入的发生机制

        NoSQL 注入通常发生在应用程序将用户输入直接拼接到查询语句中,而没有进行适当的验证或转义。攻击者可以构造特定的输入来修改查询逻辑,如改变查询条件、添加新的查询条件或执行其他数据库操作。主要由以下几种情况:

  • 输入拼接漏洞:应用程序直接将用户输入拼接到 NoSQL 查询语句中,未对输入进行过滤或转义。
  • 操作符滥用:NoSQL 查询中广泛使用操作符(如 $eq$ne$gt$where 等),攻击者可通过注入操作符改变查询逻辑。
  • 类型混淆:NoSQL 数据库(如 MongoDB)的弱类型特性可能导致输入被解析为操作符而非普通字符串。

3、NoSQL注入的危害

3.1、未授权数据访问(数据泄露)

  • 攻击方式

       通过注入操作符(如 $ne$regex)绕过查询条件,直接访问敏感数据。

// 示例:绕过密码验证,获取管理员账户信息
{"username": "admin","password": { "$exists": true }  // 条件变为“密码存在即可”
}
  • 危害
    • 窃取用户隐私(如密码、手机号)。
    • 泄露商业机密(如订单数据、客户信息)。

    • 违反 GDPR 等数据保护法规,导致法律风险。

3.2、权限提升

  • 攻击方式

       篡改查询逻辑,将普通用户权限提升至管理员。

// 示例:通过 $or 注入添加管理员权限条件
{"username": "user123","$or": [{ "role": "admin" }]  // 强制查询角色为 admin 的记录
}
  • 危害
    • 攻击者以管理员身份执行高危操作(如删除数据、修改配置)。
    • 横向渗透内网其他系统。

3.3、数据篡改或删除

  • 攻击方式

        注入更新或删除操作符(如 $set$unset),破坏数据完整性。

// 示例:篡改商品价格为 0
{"product_id": "123","$set": { "price": 0 }  // 注入更新操作
}
  • 危害
    • ​​​​​​​​​​​​​​业务数据被恶意修改(如订单金额、库存数量)。
    • 关键数据丢失导致系统功能异常。

3.4、服务拒绝(DoS)

  • 攻击方式

       注入复杂查询或递归操作,耗尽数据库资源。

// 示例:通过 $where 注入死循环
{"$where": "function() { while(true) {} }"  // 触发无限循环,拖慢数据库
}
  • 危害
    • ​​​​​​​​​​​​​​数据库 CPU/内存耗尽,服务响应缓慢或崩溃。
    • 业务中断导致直接经济损失。

3.5、服务拒绝(DoS)

  • 攻击方式

       在支持执行代码的查询(如 MongoDB 的 $where)中注入恶意逻辑。

// 示例:通过 $where 执行系统命令(需数据库配置不当)
{"$where": "function() { return require('child_process').exec('rm -rf /') }"
}
  • 危害
    • ​​​​​​​服务器被完全控制,攻击者可删除文件、安装后门。
    • 内网横向攻击其他服务器。

3.6、逻辑绕过(业务欺诈)

  • 攻击方式

       篡改业务逻辑判断条件(如优惠券核销、投票系统)。

// 示例:绕过“单用户仅能投票一次”的限制
{"user_id": "attacker","voted": { "$ne": true }  // 条件变为“用户未投票过”
}
  • 危害
    • ​​​​​​​刷票、薅羊毛(如无限领取优惠券)。
    • 破坏业务公平性,影响品牌声誉。

 4、NoSQL注入的预防

  1. 输入过滤:禁止用户输入包含 $、. 等操作符。

  2. 转义用户输入:对用户输入进行严格的验证,确保其符合预期的格式和类型。同时,对输入进行适当的转义,以防止恶意代码被执行。

  3. 参数化查询:使用数据库驱动的安全 API(如 MongoDB 的 findOne({ username: sanitizedInput }))。
  4. 最小权限:数据库账户仅授予必要权限,禁用高危操作(如 db.eval())。
  5. 使用静态代码扫描工具,及时发现问题解决问题。
  6. 安全审计:定期扫描 NoSQL 查询代码,使用工具在实际环境上检测注入漏洞。

相关文章:

  • 14.外观模式:思考与解读
  • IoTDB数据库建模与资源优化指南
  • 从拒绝采样到强化学习,大语言模型推理极简新路径!
  • Tailwind CSS 实战:基于 Kooboo 构建企业官网页面(三)
  • Webshell管理工具的流量特征
  • Selenium 与 Playwright:浏览器自动化工具的深度对比
  • python jupyter notebook
  • 麒麟OS系统的Python程序和应用部署
  • 给 BBRv2/3 火上浇油的 drain-to-target
  • 使用DDR4控制器实现多通道数据读写(十)
  • Thinkphp开发自适应职业学生证书查询系统职业资格等级会员证书管理网站
  • 【PyTorch动态计算图原理精讲】从入门到灵活应用
  • react-native-vector-icons打包报错并且提示:copyReactNativeVectorIconFonts相关信息
  • 20_大模型微调和训练之-基于LLamaFactory+LoRA微调LLama3后格式合并
  • 详解大语言模型生态系统概念:lama,llama.cpp,HuggingFace 模型 ,GGUF,MLX,lm-studio,ollama这都是什么?
  • LeetCode 2302 统计得分小于K的子数组数目(滑动窗口)
  • “连接世界的桥梁:深入理解计算机网络应用层”
  • 第十六届蓝桥杯 2025 C/C++组 脉冲强度之和
  • Leetcode 3533. Concatenated Divisibility
  • python中 str.strip() 是什么意思
  • 匈牙利国会通过退出国际刑事法院的决定
  • 释新闻|西葡大停电为何规模大、恢复慢?可再生能源是罪魁祸首?
  • 日月谭天丨赖清德强推“脱中入北”是把台湾带向死路
  • 幸福航空取消“五一”前航班,财务人员透露“没钱飞了”
  • 广州一人均500元的日料店回收食材给下一桌?市场监管部门介入调查
  • 大漠孤烟为何“直”?物理学家在唐诗中读出“不一样的美”