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. 修复建议

  1. 对所有输入变量进行统一过滤
  2. 使用预处理语句替代SQL拼接
  3. 完善XSS过滤函数
  4. 限制文件操作权限
  5. 修复逻辑判断错误
BlueCMS v1.6 SP1 代码审计报告 一、网站目录结构分析 BlueCMS v1.6 SP1 是一个基于PHP开发的内容管理系统,其目录结构包含以下关键部分: /admin/ - 后台管理目录 /include/ - 核心函数和类库目录 /data/ - 缓存数据目录 /include/payment/ - 支付模块目录 二、网站基本防护机制 1. 输入过滤机制 在 /include/common.inc.php 中实现了全局输入过滤: 缺陷 :未对 $_SERVER 变量进行过滤,导致后续多个漏洞。 2. deep_ addslashes()函数 位于 /include/common.fun.php : 三、SQL注入漏洞分析 1. 前台SQL注入 (1) /ad_js.php 注入 漏洞点 : $ad_id 未用引号包裹,导致addslashes()失效 直接拼接SQL语句 (2) /guest_book.php X-Forwarded-For注入 漏洞点 : $online_ip 来自 getip() 函数 getip() 函数从HTTP头获取IP,未过滤 (3) /comment.php X-Forwarded-For注入 漏洞点 : 同上, getip() 未过滤导致注入 2. 宽字节注入 (1) 后台登录宽字节注入( /admin/login.php ) 漏洞点 : GBK编码环境下可构造 %df' 绕过addslashes (2) 用户注册宽字节注入( /user.php ) 漏洞点 : $email 参数存在宽字节注入可能 3. 后台SQL注入 (1) /admin/nav.php 注入 (2) /admin/attachment.php 注入 (3) /admin/ad.php 注入 四、XSS漏洞分析 1. 存储型XSS( /user.php ) 漏洞点 : 邮箱字段仅经过trim()和addslashes()处理 前端验证可绕过 2. 评论XSS( /user.php ) filter_ data()函数缺陷 : 绕过方法 : 使用 `` 等未被过滤的标签 五、文件包含漏洞 /user.php 文件包含 漏洞点 : 未过滤 ../ 目录遍历 低版本PHP可截断(%00或路径长度截断) 六、SSRF漏洞 /user.php SSRF 漏洞点 : 逻辑错误应使用 !== 而非 != strpos() 返回0时与false弱类型相等 七、任意文件删除漏洞 1. /user.php 文件删除 2. /user.php 另一处文件删除 八、审计方法与总结 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过滤函数 限制文件操作权限 修复逻辑判断错误