bluecms v1.6 sp1 代码审计
字数 1560 2025-08-26 22:11:51
BlueCMS v1.6 SP1 代码审计报告
一、网站目录结构分析
BlueCMS v1.6 SP1 是一个基于PHP开发的内容管理系统,其目录结构包含以下关键部分:
/admin/- 后台管理目录/include/- 核心函数和类库目录/data/- 缓存数据目录/include/payment/- 支付模块目录
二、网站基本防护机制
1. 输入过滤机制
在/include/common.inc.php中实现了全局输入过滤:
if(!get_magic_quotes_gpc()) {
$_POST = deep_addslashes($_POST);
$_GET = deep_addslashes($_GET);
$_COOKIES = deep_addslashes($_COOKIES);
$_REQUEST = deep_addslashes($_REQUEST);
}
缺陷:未对$_SERVER变量进行过滤,导致后续多个漏洞。
2. deep_addslashes()函数
位于/include/common.fun.php:
function deep_addslashes($str) {
if(is_array($str)) {
foreach($str as $key=>$val) {
$str[$key] = deep_addslashes($val);
}
} else {
$str = addslashes($str);
}
return $str;
}
三、SQL注入漏洞分析
1. 前台SQL注入
(1) /ad_js.php注入
$ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';
$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
漏洞点:
$ad_id未用引号包裹,导致addslashes()失效- 直接拼接SQL语句
(2) /guest_book.php X-Forwarded-For注入
$sql = "INSERT INTO " . table('guest_book') . " (id, rid, user_id, add_time, ip, content)
VALUES ('', '$rid', '$user_id', '$timestamp', '$online_ip', '$content')";
漏洞点:
$online_ip来自getip()函数getip()函数从HTTP头获取IP,未过滤
(3) /comment.php X-Forwarded-For注入
$sql = "INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check)
VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '".getip()."', '$is_check')";
漏洞点:
- 同上,
getip()未过滤导致注入
2. 宽字节注入
(1) 后台登录宽字节注入(/admin/login.php)
$row = $db->getone("SELECT COUNT(*) AS num FROM ".table('admin')." WHERE admin_name='$name' and pwd = md5('$pwd')");
漏洞点:
- GBK编码环境下可构造
%df'绕过addslashes
(2) 用户注册宽字节注入(/user.php)
$sql = "INSERT INTO ".table('user')." (user_id, user_name, pwd, email, reg_time, last_login_time)
VALUES ('', '$user_name', md5('$pwd'), '$email', '$timestamp', '$timestamp')";
漏洞点:
$email参数存在宽字节注入可能
3. 后台SQL注入
(1) /admin/nav.php注入
$sql = "select * from ".table('navigate')." where navid = ".$_GET['navid'];
(2) /admin/attachment.php注入
$sql = "DELETE FROM ".table('attachment')." WHERE att_id = ".$_GET['att_id'];
(3) /admin/ad.php注入
$ad = $db->getone("SELECT ad_id, ad_name, time_set, start_time, end_time, content, exp_content FROM ".table('ad')." WHERE ad_id=".$ad_id);
四、XSS漏洞分析
1. 存储型XSS(/user.php)
$email = !empty($_POST['email']) ? trim($_POST['email']) : '';
漏洞点:
- 邮箱字段仅经过trim()和addslashes()处理
- 前端验证可绕过
2. 评论XSS(/user.php)
$content = !empty($_POST['content']) ? filter_data($_POST['content']) : '';
filter_data()函数缺陷:
function filter_data($str) {
$str = preg_replace("/<(\/?)(script|i?frame|meta|link)(\s*)[^<]*>/", "", $str);
return $str;
}
绕过方法:
- 使用``等未被过滤的标签
五、文件包含漏洞
/user.php文件包含
include 'include/payment/'.$_POST['pay']."/index.php";
漏洞点:
- 未过滤
../目录遍历 - 低版本PHP可截断(%00或路径长度截断)
六、SSRF漏洞
/user.php SSRF
if (strpos($_POST['face_pic1'], 'http://') != false && strpos($_POST['face_pic1'], 'https://') != false) {
showmsg('只支持本站相对路径地址');
}
漏洞点:
- 逻辑错误应使用
!==而非!= strpos()返回0时与false弱类型相等
七、任意文件删除漏洞
1. /user.php文件删除
if(file_exists(BLUE_ROOT.$_POST['face_pic3'])) {
@unlink(BLUE_ROOT.$_POST['face_pic3']);
}
2. /user.php另一处文件删除
if (file_exists(BLUE_ROOT.$_POST['lit_pic'])) {
@unlink(BLUE_ROOT.$_POST['lit_pic']);
}
八、审计方法与总结
1. 审计方法
- 全局搜索危险函数(SELECT/UPDATE/INSERT/DELETE/unlink等)
- 跟踪用户输入流向
- 检查过滤函数实现
- 关注编码转换问题
2. 漏洞总结
| 漏洞类型 | 主要文件 | 关键点 |
|---|---|---|
| SQL注入 | ad_js.php, guest_book.php | 未过滤$_SERVER, 直接拼接SQL |
| 宽字节注入 | login.php, user.php | GBK编码+addslashes |
| XSS | user.php | 过滤函数不完善 |
| 文件包含 | user.php | 未限制路径 |
| SSRF | user.php | 逻辑判断错误 |
| 文件删除 | user.php | 未验证文件权限 |
3. 修复建议
- 对所有输入变量进行统一过滤
- 使用预处理语句替代SQL拼接
- 完善XSS过滤函数
- 限制文件操作权限
- 修复逻辑判断错误