前言刚开始学审计 也是看了社区们师傅的文章https//forum.butian.net/share/387可能是自己太菜了 感觉不太详细 就自己审了一下 漏洞分析先打开cms 简单浏览一下[![](https//s…
前言
刚开始学审计 也是看了社区们师傅的文章https://forum.butian.net/share/387
可能是自己太菜了 感觉不太详细 就自己审了一下
漏洞分析
看起来视乎是个商城一样的网站 不管随便点点 然后来到代码
第一处
然后看到index.php文件,发现里面用include_once 包含了3个文件
include_once() 语句是指在脚本执行期间包含并运行指定文件。
此行为和 include() 语句类似,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含。如同此语句名字暗示的那样,只会包含一次
然后打开web_inc.php 看看这个文件里面有什么
这个文件开始是一个ob_start() 函数
因为第一次审 所以不懂什么意思 百度了一下发现是打开缓冲区
但这里暂时不管它 这个文件里面也用到了include_once 函数包含了2个文件 但暂时都不管
继续往下看
在53行的时候发现了一串代码
$web_urls接收了$_SERVER["REQUEST_URI"]值然后通过explode函数分割后传入web_language_ml函数中
$_SERVER["REQUEST_URI"]函数是返回当前的url路径 我们通过
var_dump来查看返回值
保存之后来到index.php文件下查看
explode(separator,string,limit)函数是把获取到的url路径通过 / 分割为数组,第一个参数是根据什么进行分割,第二个参数是需要分割的字符串
然后看下面的web_language_ml函数 通过将$web_urls中的[1]2 传到了函数中 以及$db-conn
$db-conn则是最开是include_once 包含进来的数据库连接对象
继续跟进web_language_ml函数
发现该函数没有任何的过滤操作 直接就把传过来的值 进行了数据库查询操作 很明显存在sql注入 根据代码发现是单引号闭合 直接注就行了
这个洞有个前提 就是文件必须解压在根目录下才行 如果套了一层目录的话 就不能成功
因为分割后的数组内容就变了 添加其他的内容就没用了
第二处
后面发现在后台登录的时候会经过SEMCMS_Top_include.php 判断
然后跟进文件
发现有一个checkuser函数 从函数的命名上就可以看出 肯定和登录相关 然后跟进checkuser()函数
发现是通过cookie传值的方法 然后进行数据库查询 判断用户是否登录
这里还有两个函数test_input(),和verify_str()函数
不知道这两函数的作用 大概猜测是过滤
然后跟进函数
Test_input函数接收数据,然后通过str_replace函数将结束数据中的% 替换为percent
然后通过trim函数去掉首位的空格,stripslashes函数删去数据中的反斜杠(只去掉一个反斜杠),htmlspecialchars() 函数把双引号和单引号转为 HTML 实体。 然后返回过滤之后的数据
跟进verify_str函数
verify_str()函数接受参数然后利用if判断 将参数传给inject_check_sql函数
继续跟进inject_check_sql函数
inject_check_sql函数接受参数 然后通过 正则匹配 ,返回 pattern 的匹配次数。 它的值将是 0 次(不匹配)或 1 次,
如果匹配到了就会返回1就会进去前面的if判断 执行报错
所以还是过滤了很多相关的关键词 这里没有规定大小写 所以可以用大小写绕过
然后尝试绕过payload:
scuseradmin:aaa\
scuserpass:or 1#
然后放到sql执行的语句就是
能查出数据 所以函数执行返回的行数是大于0的,所以就会进去if判断
然后利用mysqli_fetch_assoc函数接收结果 并把user_qx返回
然后验证 但是发现了bug 不知道是本地环境还是怎么回事 就是进不去页面 但是没报错
然后我换成延时试试
延时sql是成功执行的 上面第一次没进去 就很奇怪 讲道理这里应该是能绕过登录直接进去才对 我就是进不去
第三处:
在web_inc.php的91行发现了一个sql查询语句 发现了一个language参数 是传过来的
跟进看看 怎么来的
前面太多花里胡哨的 就先不看 直接看if if里面的意思是 如果存在post的传参languageID的话 就进去if判断 然后进行过滤返回 过滤函数和前面一样 那就看前面就好了
然后写上echo 进行调试看看 因为很多页面都引用了web_inc.php这个文件 就不一一查找了 直接先访问首页看看 好家伙 直接打印了
好 接下来试试post 用bp抓包 这里有个小问题 因为搭建在本地的 如果url是127.0.0.1会抓不到包 我的解决方式是把127.0.0.1 换成ipv4的值 然后就可以抓包了
然后来到主页 刷新抓包 然后用bp改包
点击就改成post包,然后在下面加上languageID 然后放包
开始注入
第四处
在SEMCMS_Banner.php发现了sql语句
在SEMCMS_Banner.php的74行 这行sql语句没用任何参数过滤
然后上面的代码逻辑是判断type
先判断add和edit 然后才else进到下面
因为这里没看见上面过滤 就直接构造payload:
/SEMCMS_PHP_3.9/vyT4nP_Admin/SEMCMS_Banner.php?lgid=1+and+sleep(5)#
延时成功
但是在尝试select的时候却出现了问题
直接报错了 这个报错信息是前面解释过的过滤函数中的一个 但是这里没有看见使用该函数进行过滤呀 这里有点懵 这个文件虽然包含了
这个php文件是用来判断是否登录的 因为前面发现可以通过sql 绕过登录 使用banner.php也是直接进来了 但是过滤我真没找到 应该是我太菜了 毕竟都报错了
那就只能通过大小写登方式来绕过过滤 但是当我尝试的时候 发现不行 windows不区分大小写 难道是因为这样嘛 有点小懵 看来还是只能通过其他的方式注入 用其他的替换过滤掉的关键词
这处注入是简历在第二处注入绕过登录的前提下 因为这个页面相当于是后台的页面
第五处:
其实这处也不算啥 登录出可以爆破 因为没有验证码的限制 可以直接跑字典
直接来到后台页面
然后抓到包直接丢爆破模块里面
就可以开始爆破了
最后
小白第一次审计 还有很多不会 也看了很多文章 查了很多函数 师傅们轻点喷 有什么不足的地方提个建议 我学习学习 这cms还在看 感觉应该还有洞 虽然没能找到直接拿shell的洞 通过这些 也学到了不少审计的思路
- 本文作者: 永安寺
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/566
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!