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编码后传入
六、审计思路总结
-
危险函数定位:
- 查找SQL查询函数(getone, query等)
- 查找输出函数(echo, print等)
- 查找文件操作函数
-
变量回溯:
- 从危险函数参数回溯变量来源
- 检查过滤是否充分
-
过滤机制分析:
- 检查全局过滤(common.inc.php)
- 检查局部过滤
- 检查编码转换
-
特殊场景注意:
- 宽字节环境
- 弱类型比较
- 编码/解码过程
七、修复建议
-
SQL注入:
- 使用预处理语句
- 对数字参数强制类型转换
- 统一字符集为UTF-8避免宽字节问题
-
XSS:
- 开启htmlspecialchars的ENT_QUOTES选项
- 完善标签过滤
-
SSRF:
- 严格校验URL协议
- 使用白名单限制域名
-
URL跳转:
- 限制跳转目标域名
- 不使用用户可控参数直接跳转
-
全局安全:
- 增加CSRF防护
- 完善SESSION管理
- 实现安全的文件上传机制
八、学习要点
- 理解不同漏洞类型的原理和利用方式
- 掌握代码审计的基本方法和流程
- 学会追踪变量和识别过滤机制
- 了解常见的安全编码实践
- 培养安全意识,避免类似漏洞
通过本案例的学习,可以掌握PHP代码审计的基本技能,为后续更复杂的审计工作打下坚实基础。