骑士cms < 6.0.48任意文件包含漏洞简记
0x00 漏洞简介
骑士CMS是一套基于PHP+MYSQL的免费网站管理系统。骑士CMS官方发布安全更新,修复了一处远程代码执行漏洞。由于骑士CMS某些函数存在过滤不严格,攻击者通过构造恶意请求,配合文件包含漏洞可在无需登录的情况下执行任意代码,控制服务器。
上引自阿里云发的安全公告,实际上这个漏洞底层是文件包含漏洞,所以自我理解定位成任意文件包含漏洞更为妥当。
影响版本:
骑士CMS < 6.0.48
漏洞等级:
高危
0x01 漏洞细节
panda师傅发在先知的文章(https://xz.aliyun.com/t/8520)说的挺清晰的了,盗张图
细节我就不一一细说,主要解答一下根据panda师傅文章遇到的几个问题点:(以下复现环境在windows+phpstudy php5.4.5环境下)
1,是否一定需要注册一个账号才可以利用?
2,是否一定要包含骑士模版文件的标签才能解析,为什么?
答:
不用,可以用日志文件进行包含,并且并不需要骑士模板文件标签。
日志文件包含这个思路记得是在p神的代码审计圈子里看到其他师傅说的,当然骑士基于tp二开的cms,不难想到利用日志的方式进行包含。利用日志包含,好处是减少了注册登陆上传文件的步骤,减少限制条件(虽然作为人才系统,普通用户注册登陆是必然开放的),利于自动化脚本的编写。
由于骑士cms默认不开debug,日志记录是error级别的,需要报错才能把信息记录到日志文件,而其实我们的漏洞点就是一个很出色的报错点,当模板文件不存在的时候会将模板路径写进日志。
一开始的思路是直接把写到图片的东西写到日志里面去,但发现行不通
利用的payload:
<?php phpinfo(); ?> <qscms:company_show 列表名="info" 企业id="$_GET['id']"/
标签中的冒号会被转成/
payload打出去包含之后没有返回,一开始以为是没有执行成功。
后来通过跟踪发现,其实是包含成功了(漏洞首先是将我们传进去对应路径的文件进行了模版解析,之后保存到cache目录下的php文件,最后包含的是生成在cache目录下的php文件)
代码都是写进去了的。
但为什么包含之后没有输出呢?
主要是因为ThinkPHP/Library/Think/View.class.php 进行了缓存导致没法输出
所以我们在代码后面加一个die();就可以拿到输出了。
测试之后也发现骑士cms的标签在不在与否都没有任何影响,代码里面也没有看到有明显限制需要有骑士cms标签的代码。
所以最终的利用,直接用日志进行包含即可
第一步发送日志: POST /index.php?m=home&a=assign_resume_tpl HTTP/1.1 Host: 192.168.0.9 variable=1&tpl=<?php phpinfo();die();?> 第二步包含日志:(路径也不需要绝对路径,相对路径足以) POST /index.php?m=home&a=assign_resume_tpl HTTP/1.1 Host: 192.168.0.9 variable=1&tpl=./data/Runtime/Logs/Home/20_11_23.log
题外话,在windows phpstudy的特定一些版本下也可以用bmp,参考我之前发的文章:https://www.cnblogs.com/r00tuser/p/11312212.html
#define test_width 16 #define test_height 7 <?php phpinfo();die();?> static char test_bits[] = { 0x13, 0x00, 0x15, 0x00, 0x93, 0xcd, 0x55, 0xa5, 0x93, 0xc5, 0x00, 0x80, 0x00, 0x60 };
0x02 总结
很久不发blog了,除草记录文。