实战 | 记一次较为详细的代码审计过程
发布日期:2024-05-19 浏览次数: 专利申请、商标注册、软件著作权、资质办理快速响应热线:4006-054-001 微信:15998557370
前言
本次审计的话是Seay+昆仑镜进行漏洞扫描
Seay的话它可以很方便的查看各个文件,而昆仑镜可以很快且扫出更多的漏洞点,将这两者进行结合起来,就可以发挥更好的效果。
昆仑镜官方地址
https://github.com/LoRexxar/Kunlun-M
环境
KKCMS环境搭建
KKCMS链接如下
https://github.com/liumengxiang/kkcms
安装的话正常步骤就好,即
1、解压至phpstudy目录下 2、访问install 3、新建kkcms数据库,然后在安装的时候用这个数据库 4、安装完成,开始审计
目录结构
常见的目录结构,简单了解一下其作用
admin 后台管理目录 css CSS样式表目录 data 系统处理数据相关目录 install 网页安装目录 images 系统图片存放目录 template 模板 system 管理目录
代码审计
对扫描出的开始进行审计
验证码重用
admin/cms_login.php
源码如下
验证码的校验代码
if ($_SESSION['verifycode'] != $_POST['verifycode']) { alert_href('验证码错误','cms_login.php'); }
不难发现这里是将$_SESSION['verifycode']与POST上传的verifycode相比较,如果不相等就会刷新跳转,重新回到登录处,此时验证码也会被更新。
我们进入前端界面看一下
发现验证码js对应处存在文件,跟进查看一下
该文件的含义是用0-9中的任意四个数字作为验证码,也就是说js引用该文件来产生验证码。这里学习过其他师傅的思路后,了解到
Burpsuite默认不解析js
因此我们这里就可以借助bp抓包,摒弃js,对用户名和密码进行爆破
抓包后发送到instruct模块,在密码处添加变量
而后添加一些常用的弱口令密码
开始爆破
成功爆破出密码
XSS
wap/shang.php
使用昆仑镜进行扫描,得到结果
结合Seay,查看该文件代码
可以看到直接输出了$_GET['fee'],因此我们这里直接传入一个xss语句尝试触发xss
payload
fee=
wap/seacher.php
昆仑镜扫描
利用seay查看源码
//这只是一部分,具体的师傅们可自行查看此文件
搜索-
可以发现这里这个变量$q直接被输出了,这个$q是POST上传的wd参数,因此我们这里POST上传wd参数,给它赋值一个xss语句的话,应该是可以进行XSS的,我们试着去构造一下
wp=
成功触发XSS
wap/movie.php
//部分源码 $b=(strpos($_GET['m'],'rank=')); $ye=substr($_GET['m'],$b+5); ?>
存在可控参数$_GET['m']和$_GET['page'],开头引用了inc.php,试着找一下输出语句。
发现输出语句
发现被函数getPageHtml包裹了,跟进查看
function getPageHtml($_var_60, $_var_61, $_var_62) { $_var_63 = 5; $_var_60 = $_var_60 < 1 ? 1 : $_var_60; $_var_60 = $_var_60 > $_var_61 ? $_var_61 : $_var_60; $_var_61 = $_var_61 < $_var_60 ? $_var_60 : $_var_61; $_var_64 = $_var_60 - floor($_var_63 / 2); $_var_64 = $_var_64 < 1 ? 1 : $_var_64; $_var_65 = $_var_60 + floor($_var_63 / 2); $_var_65 = $_var_65 > $_var_61 ? $_var_61 : $_var_65; $_var_66 = $_var_65 - $_var_64 + 1; if ($_var_66 < $_var_63 && $_var_64 > 1) { $_var_64 = $_var_64 - ($_var_63 - $_var_66); $_var_64 = $_var_64 < 1 ? 1 : $_var_64; $_var_66 = $_var_65 - $_var_64 + 1; } if ($_var_66 < $_var_63 && $_var_65 < $_var_61) { $_var_65 = $_var_65 + ($_var_63 - $_var_66); $_var_65 = $_var_65 > $_var_61 ? $_var_61 : $_var_65; } if ($_var_60 > 1) { $_var_67 .= '
'; } for ($_var_68 = $_var_64; $_var_68 <= $_var_65; $_var_68++) { if ($_var_68 == $_var_60) { $_var_67 .= '
'; } else { $_var_67 .= '
'; } } if ($_var_60 < $_var_65) { $_var_67 .= '
'; } return $_var_67; }
跟进查看后也没有发现输出点,结果网页端js代码再看看
传参
http://127.0.0.1:8080/kkcms-kkcms/wap/movie.php?m=111
查看源代码,Ctrl+f搜?m=111查找对应js代码
找到js代码
尝试直接闭合a标签执行xss语句,构造payload如下
?m=">
成功触发xss
同类XSS文件如下
wap/tv.php 其对应输出代码如下 wap/zongyi.php 其对应输出代码如下 wap/dongman.php 其对应输出代码如下
system/pcon.php(失败)
发现这里有个echo 变量的,利用Seay跟进一下这个文件
0){ $tiaourl=$cc.$_GET['play']; } else{ $tiaourl=$dd.$_GET['play']; } } } ?>
此时发现可控变量play,如果让他变为xss恶意语句,就可能会实现xss,但我们这个时候看一下最上面,发现有一个if语句
if ($xtcms_pc==1){
它这个条件为true后执行的语句,不仔细看的话甚至都找不到结尾处在哪,经过仔细查看后发现在最后
这里的话也就是说,我们只有满足了$xtcms_pc==1这个条件,才能够成功的往下执行,进而利用play参数构造xss语句,因此我们此时就需要跟进这个$xtcms_pc变量,全局搜索一下
发现变量赋值点,跟进查看
简单看一下这里的代码,发现这个结果是从SQL查询处的结果取出的,而SQL语句不存在变量,因此这里的话我们是不可控的,所以这里的话应该是不存在XSS的,G
admin/cms_ad.php
登录后台后发现有个广告管理界面
发现这里可以设置名称和广告内容,尝试在名称处插入xss语句
发现此时成功触发了xss语句,那么这里的话应该是直接将广告名称进行了输出,我们查看后端代码,验证一下
请输入广告名称 请输入广告的内容<a href="网址" target="_blank"><img src="图片地址" style="width:100%"></a>