从sql 注入到rce 的挖掘分析
字数 883 2025-08-29 08:30:24
从SQL注入到RCE的漏洞挖掘与分析
1. 漏洞概述
本文详细分析了一个从SQL注入到远程代码执行(RCE)的完整漏洞链。该漏洞允许攻击者通过控制SQL查询结果,最终在服务器上执行任意PHP代码。
2. 漏洞复现步骤
2.1 环境搭建
- 搭建目标系统环境
- 确认系统正常运行
2.2 漏洞触发流程
- 通过SQL注入或直接执行SQL语句修改数据库内容
- 访问特定页面触发数据查询
- 查询结果被传递给eval()函数执行
- 实现任意代码执行
2.3 具体操作
-
执行SQL语句插入恶意数据:
INSERT INTO vulnerable_table (lid, data) VALUES (1, 'malicious_code'); -
访问包含漏洞的页面,触发查询:
http://target.com/vulnerable_page.php?lid=1 -
系统执行恶意代码
3. 漏洞原理分析
3.1 漏洞链组成
- SQL注入/控制:能够控制数据库内容
- 不安全的数据处理:从数据库获取的数据未经充分验证
- 危险函数调用:使用eval()执行动态代码
3.2 关键代码分析
3.2.1 数据获取流程
// 从请求参数获取lid
$lid = $_GET['lid'];
// 构造SQL查询
$sql = "SELECT * FROM table WHERE lid = " . $lid;
$result = $db->query($sql);
// 获取数据
$data = $result->fetch_assoc();
3.2.2 危险的数据处理
// 检查数据类型
if (is_array($data)) {
// 分割数组并执行eval
$parts = explode('|', $data['content']);
eval($parts[0]);
}
3.2.3 方法调用链
testcj()方法可直接调用- 构造方法中定义了参数传递方式
- 数据最终来源于SQL查询结果
4. 漏洞挖掘过程
4.1 审计关键点
- 寻找SQL查询点
- 跟踪数据流
- 识别危险函数(eval, system, exec等)
- 分析数据来源是否可控
4.2 具体步骤
- 使用源码审计工具分析系统
- 定位到数据处理类
- 发现eval()函数调用
- 回溯数据来源:
- 来自数据库查询
- 查询条件基于用户输入(lid)
- 确认数据库内容可控
5. 调试分析
5.1 调试流程
-
插入测试数据:
INSERT INTO table (lid, data) VALUES (1, 'phpinfo();'); -
触发查询:
// 调试输出SQL查询 var_dump($sql); // SELECT * FROM table WHERE lid = 1 // 调试查询结果 var_dump($data); // array('content' => 'phpinfo();') -
观察eval执行:
// 调试eval输入 var_dump($parts[0]); // 'phpinfo();'
6. 防御措施
6.1 防止SQL注入
- 使用预处理语句
- 实施输入验证
- 最小权限原则
6.2 防止RCE
- 避免使用eval()
- 如果需要动态执行,使用安全替代方案
- 严格过滤所有动态代码内容
6.3 其他建议
- 实施WAF防护
- 定期安全审计
- 安全编码培训
7. 总结
本案例展示了一个典型的二阶漏洞利用链:
- 首先控制数据库内容(SQL注入或权限过高)
- 然后利用系统对数据库数据的不安全处理
- 最终实现远程代码执行
这种漏洞组合在实际中危害极大,防御时需要从多个层面进行防护。