PHP代码审计实战:某CRM系统多处SQL注入漏洞分析
1. 审计准备
1.1 工具配备
- 开发环境:PHPStorm + PHPStudy
- 审计工具:Seay源代码审计系统
- 测试工具:SQLMap
1.2 审计检查清单
| 漏洞类型 | 关键搜索词 |
|---|---|
| SQL注入 | select, mysqli, mysql_query, insert |
| 文件上传 | $_FILES, type="file", upload |
| XSS | print, echo, sprintf, var_dump |
| 文件包含 | require, include等四个函数 |
| 代码执行 | eval, assert, call_user_func, preg_replace |
| 命令执行 | system, exec, shell_exec, popen, proc_open |
| 变量覆盖 | parse_str(), extract(), ` |
\[` | | 反序列化 | `serialize()`, `__construct`, `__destruct` | | SSRF | `file_get_contents` | | 文件删除 | `unlink` | | 变量来源 | `$_GET`, `$_POST`, `$_FILES`, `$_REQUEST` | ## 2. 系统分析 ### 2.1 路由结构 系统采用自定义路由结构: ``` xxx(controller层)/controller(子层)/函数 ``` ### 2.2 加密混淆 - 源代码进行了混淆处理 - 登录接口采用动态加密随机分配的cookie认证 - 密码使用DES加密后存入数据库 ## 3. 漏洞发现 ### 3.1 SQL注入漏洞 #### 漏洞点1:报告类型时间戳参数 - **位置**:报告类型选择功能 - **参数**:时间戳参数可被任意修改 - **测试结果**:SQLMap成功检测出注入点 - **原因分析**: ```php // 伪代码示例 $timestamp = $_GET['timestamp']; // 未过滤直接使用 $sql = "SELECT * FROM reports WHERE time = $timestamp"; ``` #### 其他SQL注入点 在同一目录下发现另外两处类似的不安全SQL拼接操作 ### 3.2 文件上传漏洞 #### 漏洞点1:客户导入功能 - **文件**:uploadxx.php - **攻击方式**: 1. 拦截上传请求 2. 修改文件类型或内容 3. 上传成功后可获取文件路径 4. 通过路径拼接访问上传文件 #### 其他上传点 通过全局搜索发现多个文件上传路由点 ## 4. 审计技巧总结 ### 4.1 审计方法 1. **从功能点入手**:当代码混淆难以直接审计时,从功能点逆向分析 2. **参数追踪**:重点关注用户可控参数的传递路径 3. **SQL语句分析**:查找直接拼接用户输入的SQL语句 4. **全局搜索**:使用IDE的全局搜索功能查找关键函数和变量 ### 4.2 防御建议 1. **SQL注入防御**: - 使用预处理语句(PDO/mysqli prepared statements) - 对所有用户输入进行严格过滤和类型检查 - 最小化数据库操作权限 2. **文件上传防御**: - 限制上传文件类型(白名单方式) - 重命名上传文件 - 存储上传文件在非Web目录 - 对上传内容进行严格检查 3. **代码层面**: - 避免使用混淆作为唯一安全措施 - 实现统一的输入验证机制 - 对敏感操作进行权限验证 ## 5. 扩展思考 1. **框架审计**:虽然本系统使用自定义框架,但常见PHP框架(如ThinkPHP、Laravel)也有其特定漏洞模式 2. **加密实现**:DES加密已不安全,建议升级为更安全的加密方式如bcrypt或Argon2 3. **混淆有效性**:代码混淆不能替代安全编码实践,反而可能掩盖安全问题 通过本次审计可以看出,即使系统采用了加密混淆等保护措施,如果核心安全实践不到位,仍然会存在严重的安全漏洞。安全应该贯穿于整个开发过程,而不仅仅是后期添加的保护层。\]