You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何验证Java Servlet中MongoDB的NoSQL注入漏洞?

NoSQL注入漏洞验证与代码调整方案

你的当前代码因为将用户输入(u和p)包裹在双引号中作为字符串值拼入JSON查询语句,导致所有输入都会被当作字符串处理,无法直接注入MongoDB的查询操作符——这就是你之前尝试的注入payload失效的核心原因。

一、如何让代码存在可利用的漏洞

要产生可被利用的NoSQL注入漏洞,需要修改拼接逻辑,去掉u和p外层的双引号,让用户输入直接作为JSON查询结构的一部分。修改后的代码如下:

// 去掉u和p外层的双引号,让输入直接参与JSON结构构建
String andQuery = "{$and: [{user: "+u+"}, {password: "+p+"}]}";

二、验证漏洞的有效输入

修改代码后,你可以通过以下方式验证漏洞:

  1. 绕过登录验证:在用户名和密码输入框都输入 {$gt: ""},此时拼接后的查询语句为:

    {"$and": [{"user": {"$gt": ""}}, {"password": {"$gt": ""}}]}
    

    这个查询会匹配所有用户名和密码非空的用户,直接绕过登录验证。

  2. 灵活匹配用户:在用户名输入框输入 {$ne: null},密码随便输入任意内容。拼接后的查询为:

    {"$and": [{"user": {"$ne": null}}, {"password": "任意输入"}]}
    

    只要系统中存在用户名不为null的用户,且该用户密码与你输入的内容一致,就能直接登录;若想匹配所有存在的用户,可在用户名输入 {$or: [{user: {$exists: true}}, {password: {$exists: true}}]},密码随意输入即可。

三、关于你之前尝试的无效操作说明

  • 提交username[$ne]=1&password[$ne]=1无效:因为你的Servlet是通过request.getParameter("username")获取参数,而username[$ne]是未被代码读取的参数名,导致u和p的值为null。
  • 输入{"$gt":"" }无效:因为你的代码将输入包裹在双引号中,最终生成的查询中该内容是字符串而非MongoDB操作符,自然无法生效。

内容的提问来源于stack exchange,提问作者P00

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:35:14