semcms审计
前言
刚开始学审计 也是看了社区们师傅的文章https://forum.butian.net/share/387
可能是自己太菜了 感觉不太详细 就自己审了一下
漏洞分析
先打开cms 简单浏览一下
看起来视乎是个商城一样的网站 不管随便点点 然后来到代码
第一处
然后看到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的洞 通过这些 也学到了不少审计的思路
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!