picoCTF 2024: [[NoSQL]] Injection - Writeup

发布于:2025-07-20 ⋅ 阅读:(14) ⋅ 点赞:(0)

#wp #web

【[[WEB]]】提高题 - [[PICOCTF]]

创建时间:2025-07-19 15:03
题目链接:picoCTF - picoGym Challenges

解题过程

picoCTF 2024: [[NoSQL]] Injection - Writeup

hints:


漏洞分析

这道题涉及 NoSQL 注入,这种漏洞发生在非关系型数据库(例如 MongoDB)中,攻击者可以通过特殊的查询条件影响数据库的行为。

我们从题目附件中(server.js)获得的信息是:后端使用 MongoDB 作为数据库,并且登录功能存在漏洞。代码如下所示:

const user = await User.findOne({
  email: email.startsWith("{") && email.endsWith("}") ? JSON.parse(email) : email,
  password: password.startsWith("{") && password.endsWith("}") ? JSON.parse(password) : password,
});

这段代码的功能是检查 emailpassword 是否被包裹在 {} 中。如果是,它们将被当作 JSON 字符串进行解析,然后应用于 MongoDB 的查询。

例如,如果输入的 email 字段是 {"$ne": null},MongoDB 会执行一个查询,表示 email 不等于 null,并且根据这一条件查找用户。

关键漏洞:

  • 该系统使用了 JSON.parse() 来解析用户输入。如果攻击者构造了一个特殊的 JSON 字符串,它将被当做查询条件传递给 MongoDB。

  • MongoDB 查询语言允许使用特殊操作符,如 "$ne": null,这使得任何值都能通过验证。攻击者可以利用这一点绕过身份验证。


漏洞利用

构造恶意请求

我们可以通过注入 MongoDB 查询条件来绕过认证。有效的注入内容通常是通过将 emailpassword 字段设置为以下形式:

{
  "email": "{\"$ne\": null}",
  "password": "{\"$ne\": null}"
}

这里:

  • {"$ne": null} 是 MongoDB 查询的语法,表示 emailpassword 不等于 null。这将匹配所有非 null 的值,绕过了对 emailpassword 字段的实际验证。

  • 由于 MongoDB 查询语言的灵活性,任何不为 null 的值都会通过验证。

通过 curl 发送请求

我们可以使用 curl 发送 POST 请求来测试这个注入。以下是发送请求的命令:

curl -X POST http://atlas.picoctf.net:54037/ \
  -H "Content-Type: application/json" \
  -d '{"email": "{\"$ne\": null}", "password": "{\"$ne\": null}"}'

这条命令向服务器发送了带有恶意查询条件的 emailpassword 字段,目的是绕过身份验证。

使用 Burp Suite 测试注入

通过 Burp Suite 也可以进行同样的操作:

  1. 启动 Burp Suite 并将浏览器代理设置为 Burp 代理。

  2. 访问登录页面并捕获 POST 请求。

  3. 将请求发送到 Repeater,并在 emailpassword 字段中注入 {"$ne": null}

  4. 发送修改后的请求,查看响应结果。


获取 Flag

登录后,服务器会返回一个包含 token 字段的 JSON 响应。这个 token 字段通常是 Base64 编码的,包含了题目的 Flag。


网站公告

今日签到

点亮在社区的每一天
去签到