某CMS代码审计思路分享
字数 1284 2025-08-05 11:39:37
某CMS代码审计思路与实战分析
前言
本文详细分析某CMS系统的代码审计过程,重点讲解从发现漏洞到最终GetShell的完整思路。通过这个案例,我们将学习如何结合白盒与黑盒审计方法,发现并利用CMS系统中的安全漏洞。
工具准备
-
Vscode:
- 强大的代码搜索功能
- 转到定义和引用功能
- 支持正则表达式搜索
-
Seay源代码审计系统:
- 快速定位危险函数
- 辅助发现潜在漏洞
- 提供SQL注入、XSS等漏洞提示
审计过程
1. 初步探测
- 发现多个页面存在
ID参数,可能存在SQL注入 - 测试发现单引号被过滤,触发WAF防护
2. WAF分析
WAF位于Include/contorl.php文件中,工作原理:
- 收集所有GET请求参数
- 对每个参数进行正则匹配
- 发现关键字则返回错误并退出
3. 后台功能审计
发现上传点,上传正常图片后分析请求:
- 主要上传逻辑在
Upfile.php文件中 - 发现可以上传zip文件,联想到zip协议的文件包含漏洞
4. 文件包含漏洞分析
通过Seay审计发现关键函数:
file_get_contents('../'.$xxx)
关键点:
$mblujin不可控(写死或数据库获取)$mb变量可控- 函数执行流程:
- 提取模板文件数据
- 替换
<{Template}>内容为$mb的值 - 写入网站根目录
5. 路径遍历测试
利用../进行路径遍历:
index.php从Templete/default/Include读取.htaccess从Templete/default/Include/hta/d读取
6. 初始利用尝试
尝试直接修改index.php:
<?php
include_once '<{dirpaths}>Include/web_inc.php';
include_once '<{dirpaths}>Templete/<{Template}>/Include/Function.php';
$file_url="<{dirpaths}>";
include_once '<{dirpaths}>Templete/<{Template}>/Include/default.php';
?>
构造Payload:
index.php';eval($_POST[1]);//../default
失败原因:
Function.php依赖Include/contorl.php中的类定义- WAF会拦截单引号导致脚本退出
7. 替代方案:.htaccess利用
分析.htaccess内容:
RewriteEngine On
RewriteCond %{http_host} ^sem-cms.com [NC]
RewriteRule ^(.*)$ http://www.sem-cms.com/$1 [L,R=301]
<Files ~ "^.(htaccess|htpasswd)$">
deny from all
</Files>
...
构造Payload:
index.php%0aSetHandler application/x-httpd-php%0a%23/../../default
8. 完整利用步骤
- 上传图片马(如包含PHP代码的图片)
- 使用Payload修改
.htaccess:Top_include.php?CF=template&mb=index.php%0aSetHandler application/x-httpd-php%0a%23/../../default - 访问上传的图片马,触发PHP解析
关键知识点总结
-
WAF绕过:
- 理解WAF过滤机制
- 寻找不受WAF保护的入口点
-
文件包含利用:
- 识别可控变量
- 利用路径遍历(
../) - 注意文件包含的上下文环境
-
.htaccess利用:
- 使用换行符(
%0a)添加新规则 - 注释掉原有内容(
%23) SetHandler指令强制解析特定文件类型
- 使用换行符(
-
上传漏洞组合利用:
- 结合文件修改和上传功能
- 通过修改服务器配置实现代码执行
防御建议
- 对文件操作进行严格路径校验
- 禁用危险函数如
eval()、system()等 - 限制
.htaccess文件的修改权限 - 对上传文件进行内容检查而不仅是扩展名检查
- 实现更完善的WAF规则,包括换行符等特殊字符检测
结语
本案例展示了如何通过系统化的代码审计思路发现和利用CMS漏洞。关键在于:
- 全面了解系统功能
- 深入分析关键函数
- 灵活组合多种漏洞
- 不放过任何细节和可能性
这种审计方法可以应用于其他CMS系统的安全评估中。