PHP代码审计入门篇bluecms
字数 1359 2025-08-26 22:11:40

BlueCMS代码审计入门教学文档

一、概述

BlueCMS是一个适合代码审计入门的CMS系统,本教学文档将详细分析其中的安全漏洞,包括SQL注入、宽字节注入、XSS、SSRF、任意URL跳转等多种漏洞类型。

二、SQL注入漏洞分析

1. 普通SQL注入

漏洞文件: ad_js.php

漏洞代码:

$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);

变量溯源:

$ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id'])

过滤机制:
common.inc.php中进行了全局转义:

if(!get_magic_quotes_gpc()) {
    $_POST = deep_addslashes($_POST);
    $_GET = deep_addslashes($_GET);
    $_COOKIES = deep_addslashes($_COOKIES);
    $_REQUEST = deep_addslashes($_REQUEST);
}

漏洞原理:

  • 参数未使用引号包裹,addslashes转义无效
  • 可直接进行数字型SQL注入

2. 宽字节注入

漏洞文件: user.php

漏洞代码:

$row = $db->getone("SELECT COUNT(*) AS num FROM ".table('admin')." WHERE admin_name='$user_name'");

变量溯源:

$user_name = !empty($_REQUEST['user_name']) ? trim($_REQUEST['user_name'])

漏洞验证:

  • 输入%df'会报错
  • 响应头Content-Type为gb2312编码

利用方式:

  • 可使用盲注或报错注入
  • 其他类似漏洞点:
    • user.php 154行注册处
    • 多处使用相同查询模式的地方

3. INSERT型注入

漏洞文件: guest_book.php

漏洞代码:

$sql = "INSERT INTO " . table('guest_book') . " (id, rid, user_id, add_time, ip, content) VALUES ('', '$rid', '$user_id', '$timestamp', '$online_ip', '$content')";

IP获取方式:

$online_ip = getip();

getip()函数:

function getip() {
    if (getenv('HTTP_CLIENT_IP')) {
        $ip = getenv('HTTP_CLIENT_IP');
    } elseif (getenv('HTTP_X_FORWARDED_FOR')) {
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    }
    // ...
}

漏洞利用:

  • 通过X-Forwarded-For头注入
  • 注意SESSION数据不会自动URL解码
  • comment.php中同样存在此问题

三、XSS漏洞分析

1. 存储型XSS

漏洞文件: comment.php和guest_book.php

漏洞代码:

$content = !empty($_POST['comment']) ? htmlspecialchars($_POST['comment'])

htmlspecialchars问题:

  • 未开启ENT_QUOTES选项
  • 单引号不会被转义

2. 过滤绕过XSS

漏洞文件: user.php 266行

过滤函数:

function filter_data($str) {
    $str = preg_replace("/<(script|i?frame|meta|link)(\s*)/is", "<\\1\\2", $str);
    return $str;
}

绕过方式:


四、SSRF漏洞分析

漏洞文件: user.php 780行

漏洞代码:

if (strpos($_POST['face_pic1'], 'http:') === false && strpos($_POST['face_pic1'], 'https:') === false){
    showmsg('只支持本站相对路径地址');
}

问题:

  • 应使用===判断,否则0和false弱类型相等
  • 可绕过http/https检测

利用方式:

  • 不传图片,直接控制face_pic1参数
  • 最终存入数据库:
$sql = "UPDATE ".table('user')." SET ... face_pic = '$face_pic' ...";

五、任意URL跳转漏洞

漏洞文件: user.php

关键变量:

$from = !empty($_REQUEST['from']) ? $_REQUEST['from'] : '';
$from = !empty($from) ? base64_decode($from) : 'user.php';

跳转点:

showmsg('欢迎您 '.$user_name.' 回来,现在将转到...', $from);
showmsg('恭喜您注册成功,现在将转向...', $from);

利用方式:

  • 对恶意URL进行base64编码后传入

六、审计思路总结

  1. 危险函数定位:

    • 查找SQL查询函数(getone, query等)
    • 查找输出函数(echo, print等)
    • 查找文件操作函数
  2. 变量回溯:

    • 从危险函数参数回溯变量来源
    • 检查过滤是否充分
  3. 过滤机制分析:

    • 检查全局过滤(common.inc.php)
    • 检查局部过滤
    • 检查编码转换
  4. 特殊场景注意:

    • 宽字节环境
    • 弱类型比较
    • 编码/解码过程

七、修复建议

  1. SQL注入:

    • 使用预处理语句
    • 对数字参数强制类型转换
    • 统一字符集为UTF-8避免宽字节问题
  2. XSS:

    • 开启htmlspecialchars的ENT_QUOTES选项
    • 完善标签过滤
  3. SSRF:

    • 严格校验URL协议
    • 使用白名单限制域名
  4. URL跳转:

    • 限制跳转目标域名
    • 不使用用户可控参数直接跳转
  5. 全局安全:

    • 增加CSRF防护
    • 完善SESSION管理
    • 实现安全的文件上传机制

八、学习要点

  1. 理解不同漏洞类型的原理和利用方式
  2. 掌握代码审计的基本方法和流程
  3. 学会追踪变量和识别过滤机制
  4. 了解常见的安全编码实践
  5. 培养安全意识,避免类似漏洞

通过本案例的学习,可以掌握PHP代码审计的基本技能,为后续更复杂的审计工作打下坚实基础。

BlueCMS代码审计入门教学文档 一、概述 BlueCMS是一个适合代码审计入门的CMS系统,本教学文档将详细分析其中的安全漏洞,包括SQL注入、宽字节注入、XSS、SSRF、任意URL跳转等多种漏洞类型。 二、SQL注入漏洞分析 1. 普通SQL注入 漏洞文件 : ad_ js.php 漏洞代码 : 变量溯源 : 过滤机制 : common.inc.php中进行了全局转义: 漏洞原理 : 参数未使用引号包裹,addslashes转义无效 可直接进行数字型SQL注入 2. 宽字节注入 漏洞文件 : user.php 漏洞代码 : 变量溯源 : 漏洞验证 : 输入 %df' 会报错 响应头Content-Type为gb2312编码 利用方式 : 可使用盲注或报错注入 其他类似漏洞点: user.php 154行注册处 多处使用相同查询模式的地方 3. INSERT型注入 漏洞文件 : guest_ book.php 漏洞代码 : IP获取方式 : getip()函数 : 漏洞利用 : 通过X-Forwarded-For头注入 注意SESSION数据不会自动URL解码 comment.php中同样存在此问题 三、XSS漏洞分析 1. 存储型XSS 漏洞文件 : comment.php和guest_ book.php 漏洞代码 : htmlspecialchars问题 : 未开启ENT_ QUOTES选项 单引号不会被转义 2. 过滤绕过XSS 漏洞文件 : user.php 266行 过滤函数 : 绕过方式 : 四、SSRF漏洞分析 漏洞文件 : user.php 780行 漏洞代码 : 问题 : 应使用 === 判断,否则0和false弱类型相等 可绕过http/https检测 利用方式 : 不传图片,直接控制face_ pic1参数 最终存入数据库: 五、任意URL跳转漏洞 漏洞文件 : user.php 关键变量 : 跳转点 : 利用方式 : 对恶意URL进行base64编码后传入 六、审计思路总结 危险函数定位 : 查找SQL查询函数(getone, query等) 查找输出函数(echo, print等) 查找文件操作函数 变量回溯 : 从危险函数参数回溯变量来源 检查过滤是否充分 过滤机制分析 : 检查全局过滤(common.inc.php) 检查局部过滤 检查编码转换 特殊场景注意 : 宽字节环境 弱类型比较 编码/解码过程 七、修复建议 SQL注入 : 使用预处理语句 对数字参数强制类型转换 统一字符集为UTF-8避免宽字节问题 XSS : 开启htmlspecialchars的ENT_ QUOTES选项 完善标签过滤 SSRF : 严格校验URL协议 使用白名单限制域名 URL跳转 : 限制跳转目标域名 不使用用户可控参数直接跳转 全局安全 : 增加CSRF防护 完善SESSION管理 实现安全的文件上传机制 八、学习要点 理解不同漏洞类型的原理和利用方式 掌握代码审计的基本方法和流程 学会追踪变量和识别过滤机制 了解常见的安全编码实践 培养安全意识,避免类似漏洞 通过本案例的学习,可以掌握PHP代码审计的基本技能,为后续更复杂的审计工作打下坚实基础。