声明:由于传播、利用本公众号湘安无事所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。如有侵权烦请告知,我们会立即删除并致歉。谢谢!
本文作者为星球成员: NO师傅
原文地址:
https://www.freebuf.com/vuls/377453.html
文章价值300稿费!!!
前言
本次审计用到的工具有:seay+昆仑镜进行漏洞扫描
本次审计kkcms
搭建步骤
常见的目录结构,简单了解一下其作用
admin 后台管理目录
css CSS样式表目录
data 系统处理数据相关目录
install 网页安装目录
images 系统图片存放目录
template 模板
system 管理目录
代码审计
验证码重用
admin/cms_login.php
源码如下
<?php
require_once('../system/inc.php');
if(isset($_POST['submit'])){
if ($_SESSION['verifycode'] != $_POST['verifycode']) {
alert_href('验证码错误','cms_login.php');
}
null_back($_POST['a_name'],'请输入用户名');
null_back($_POST['a_password'],'请输入密码');
null_back($_POST['verifycode'],'请输入验证码');
$a_name = $_POST['a_name'];
$a_password = $_POST['a_password'];
$sql = 'select * from xtcms_manager where m_name = "'.$a_name.'" and m_password = "'.md5($a_password).'"';
$result = mysql_query($sql);
if(!! $row = mysql_fetch_array($result)){
setcookie('admin_name',$row['m_name']);
setcookie('admin_password',$row['m_password']);
header('location:cms_welcome.php');
}else{
alert_href('用户名或密码错误','cms_login.php');
}
}
?>
验证码的校验代码
if ($_SESSION['verifycode'] != $_POST['verifycode']) {
alert_href('验证码错误','cms_login.php');
}
不难发现这里是将$_SESSION['verifycode']与POST上传的verifycode相比较,如果不相等就会刷新跳转,重新回到登录处,此时验证码也会被更新。
我们进入前端界面看一下
发现验证码js对应处存在文件,跟进查看一下
<?php
session_start();
$image = imagecreate(50, 34);
$bcolor = imagecolorallocate($image, 0, 0, 0);
$fcolor = imagecolorallocate($image, 255, 255, 255);
$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;
imagefill($image, 0, 0, $bcolor);
imagestring($image, 7, 7, 10, $rand_str, $fcolor);
header('content-type:image/png');
imagepng($image);
?>
该php文件的含义是0-9的任意四个数字作为验证码,也就是说js引用该文件来生产验证码
Burpsuite默认不解析js
因此我们这里就可以借助bp抓包,摒弃js对用户名和密码进行爆破
开始爆破
成功爆破出密码
前端SQL注入
输入一个引号发现回显不一样,审计此文件 /vlist.php
可以的清楚的看到没有任何防护措施,而由于传参方法为数字型,因此也没有使用双引号进行包裹,直接进入sql语句进行拼接
看到没有任何防护的措施直接上Sqlmap
另外此处其实是有上了如采坑点所说的addslashes的,但是由于没有使用双引号将$c_id包裹起来,所以我们无需使用双引号进行闭合,addslashes也就没有起到作用了。
(这里手工注入的时候,不好进行判断,因为他默认c_id会等于0,这会给我们的输入造成一定的的干扰)
$result = mysql_query('select * from xtcms_vod_class where c_pid=0 order by c_id asc');
上传漏洞
此cms默认存在kindetior,并且sasy代码审计显示存在文件上传
查看upload_json.php发现可以上传html和txt文件
前端sql注入
正常页面
加个单引号 页面回显就不正常了
全局搜索vlist.php
echo '<a href="./vlist.php?cid='.$row['c_id'].'" class="acat" style="white-space: pre-wrap;margin-bottom: 4px;">'.$row['c_name'].'</a>';
发现get传参cid没有进行任何的防护措施,直接传入数字型参数到sql语句
此处其实是有上了addslashes的,但是由于没有使用双引号将$c_id包裹起来,所以我们无需使用双引号进行闭合,addslashes也就没有起到作用了。(这里手工注入的时候,不好进行判断,因为他默认c_id会等于0,这会给我们的输入造成一定的的干扰)
sqlmap可以直接跑出数据库
留言板处xss
book.php
需要注意的是,我们传入的内容需要存在汉字,如果不存在汉字,则弹出内容不合法此处的验证码无法显示,为了好做审计,把相应代码注释
content 参数有 addslsashes 的过滤,然而这样无法阻止XSS,直接进入数据库,并且包含了template下的book.php文件
总结
1:新手在入门审计CMS的时候,要有思路的去寻找漏洞点,不要看到一个点觉得存在,然后就跳跃性-的转移文件审计代码,这样会导致效率很低。
2:在审计CMS的时候,多注意一下是否默认存在开源软件或编辑器。
3:seay代码审计工具里的MYSQL查询语句监控真的非常好用!
4:注意一些非HTML或者PHP后缀的文件,可能存在信息泄露漏洞。
5:审计CMS时,可以先从重装文件入手,因为这是整个CMS的开端。
6:一个十分寻常的XSS背后可能经过了多层跟进,代码审计的魅力就在于此
推荐阅读
渗透实战|记一次简单的Docker逃逸+反编译jar接管云主机