新手入门代码审计(1)--xdcms-3.0.1
字数 1470 2025-08-06 08:35:25
XDCMS 3.0.1 代码审计入门教学文档
一、系统架构分析
XDCMS 3.0.1 是一个非 MVC 架构的 CMS 系统,适合新手进行代码审计学习。其特点包括:
- 结构简单,没有复杂框架
- 采用公共函数文件进行统一过滤
- 安装完成后会删除 install 目录
- 生成文件锁防止重复安装
二、核心过滤函数分析
1. safe_replace() 函数
function safe_replace($string) {
$string = str_replace('%20','',$string);
$string = str_replace('%27','',$string);
$string = str_replace('%2527','',$string);
// 其他过滤项...
return $string;
}
功能:过滤危险字符,如空格(%20)、单引号(%27)等编码形式
2. safe_html() 函数
function safe_html($str){
if(empty($str)){return;}
$str=preg_replace('/select|insert | update | and | in | on | left | joins | delete union | from | where | group | into |load_file|outfile/','',$str);
return htmlspecialchars($str);
}
功能:
- 过滤常见 SQL 注入关键词
- 使用 htmlspecialchars 进行 HTML 转义
- 可通过大小写绕过过滤(如 SELECT 替换为 SeLeCt)
三、漏洞分析
1. SQL 注入漏洞
漏洞位置:会员登录功能 /system/module/member/index
漏洞代码:
public function login_save(){
$username = safe_html($_POST['username']);
$password = safe_html($_POST['password']);
// ...
$sql="select * from ".DB_PRE."member where `username`='$username'";
// ...
}
漏洞原因:
- 仅使用 safe_html 过滤,未使用 safe_replace
- safe_html 可通过大小写绕过
- 系统开启了报错提示
利用方法:
- 构造特殊用户名进行报错注入
- 示例:
username=admin' AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT username FROM admin LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)--
影响范围:
- 所有仅使用 safe_html 过滤的数据库查询操作
2. 任意文件删除漏洞
漏洞位置:index.php?m=xdcms&c=data&f=delete&file=../../test
漏洞代码:
public function delete(){
$file=trim($_GET["file"]);
$dir=DATA_PATH.'backup/'.$file;
if(is_dir($dir)){
// 删除文件夹中的文件
if (false != ($handle = opendir ( $dir ))) {
while ( false !== ($file = readdir ( $handle )) ) {
if ($file != '.' && $file != '..'){
unlink($dir."/".$file);
}
}
closedir ( $handle );
}
@rmdir($dir);//删除目录
}
showmsg(C('success'),'-1');
}
漏洞原因:
- 未对 file 参数进行过滤
- 未设置白名单限制
- 允许目录遍历(../)
利用方法:
- 通过构造 file 参数删除任意文件
- 示例:
file=../../config.php
3. 文件上传漏洞
漏洞位置:后台文件上传功能
漏洞原因:
- 后台可修改允许上传的文件类型
- 上传后可通过修改后缀名执行恶意代码
利用方法:
- 通过管理员权限修改允许上传的文件类型
- 上传恶意文件
- 修改文件后缀为可执行类型(如 .php)
四、审计方法论
1. 代码审计方法
- 入口分析:从入口文件(index.php)开始,跟踪程序执行流程
- 函数追踪:重点分析公共过滤函数(如 safe_replace、safe_html)
- 敏感函数搜索:全局搜索关键函数(如 unlink、file_get_contents、eval 等)
- 参数追踪:跟踪用户输入参数的传递和处理过程
2. 重点关注点
- 用户输入过滤不完整的地方
- 数据库查询拼接处
- 文件操作函数
- 权限验证逻辑
- 安装和升级流程
五、防御建议
-
SQL 注入防御:
- 同时使用 safe_replace 和 safe_html 过滤
- 使用预处理语句
- 关闭错误回显
-
文件删除防御:
- 限制 file 参数为白名单
- 禁止目录遍历
- 添加权限验证
-
文件上传防御:
- 固定允许上传的文件类型
- 检查文件内容而不仅是扩展名
- 设置上传目录不可执行
六、总结
XDCMS 3.0.1 作为入门级代码审计目标,展示了常见漏洞类型:
- 过滤不严导致的 SQL 注入
- 未验证参数导致的任意文件删除
- 配置不当导致的文件上传漏洞
通过分析这些漏洞,可以掌握基本的代码审计思路和方法,为分析更复杂的系统打下基础。