代码审计-php篇之某CRM系统多处sql注入
字数 1543 2025-08-19 12:42:00

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. **混淆有效性**:代码混淆不能替代安全编码实践,反而可能掩盖安全问题 通过本次审计可以看出,即使系统采用了加密混淆等保护措施,如果核心安全实践不到位,仍然会存在严重的安全漏洞。安全应该贯穿于整个开发过程,而不仅仅是后期添加的保护层。\]

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 路由结构 系统采用自定义路由结构: 2.2 加密混淆 源代码进行了混淆处理 登录接口采用动态加密随机分配的cookie认证 密码使用DES加密后存入数据库 3. 漏洞发现 3.1 SQL注入漏洞 漏洞点1:报告类型时间戳参数 位置 :报告类型选择功能 参数 :时间戳参数可被任意修改 测试结果 :SQLMap成功检测出注入点 原因分析 : 其他SQL注入点 在同一目录下发现另外两处类似的不安全SQL拼接操作 3.2 文件上传漏洞 漏洞点1:客户导入功能 文件 :uploadxx.php 攻击方式 : 拦截上传请求 修改文件类型或内容 上传成功后可获取文件路径 通过路径拼接访问上传文件 其他上传点 通过全局搜索发现多个文件上传路由点 4. 审计技巧总结 4.1 审计方法 从功能点入手 :当代码混淆难以直接审计时,从功能点逆向分析 参数追踪 :重点关注用户可控参数的传递路径 SQL语句分析 :查找直接拼接用户输入的SQL语句 全局搜索 :使用IDE的全局搜索功能查找关键函数和变量 4.2 防御建议 SQL注入防御 : 使用预处理语句(PDO/mysqli prepared statements) 对所有用户输入进行严格过滤和类型检查 最小化数据库操作权限 文件上传防御 : 限制上传文件类型(白名单方式) 重命名上传文件 存储上传文件在非Web目录 对上传内容进行严格检查 代码层面 : 避免使用混淆作为唯一安全措施 实现统一的输入验证机制 对敏感操作进行权限验证 5. 扩展思考 框架审计 :虽然本系统使用自定义框架,但常见PHP框架(如ThinkPHP、Laravel)也有其特定漏洞模式 加密实现 :DES加密已不安全,建议升级为更安全的加密方式如bcrypt或Argon2 混淆有效性 :代码混淆不能替代安全编码实践,反而可能掩盖安全问题 通过本次审计可以看出,即使系统采用了加密混淆等保护措施,如果核心安全实践不到位,仍然会存在严重的安全漏洞。安全应该贯穿于整个开发过程,而不仅仅是后期添加的保护层。