最近thinkcmf爆出了一个后台登录后的远程代码执行漏洞。
非常好奇看了下决定写一个分析过程分析下如何执行代码的。如何搭建环境就不多介绍了,大家可以phpstudy或者xampp,thinkcmf
的源代码可以直接从github或者码云上下载。https://gitee.com/thinkcmf/ThinkCMF/releases/ 历史版本自己找下,下面开始我的分析。
首先先执行下漏洞,安装好后admin身份直接登陆,在后台-设置-url美化-添加url规则,设置内容 原始网址 portal/List/index 显示网址 list/:id’.file_put_contents(‘1.php’,’<?php phpinfo();’).’ 之后就保存在去public目录下查看就会发现多出了一个1.php文件
在去数据库里面搜寻会在表cmf_route里面发现一条一样的记录。
之后在去代码里寻找那个地方触发了漏洞,我们修改刚才的显示网址让他报错list/:id’.file_put_contents(‘1.php’,‘aaa’,’<?php phpinfo();’).’
然后切换左侧菜单就会报错如下
找到文件data/conf/route.php打开查看代码
<?php return array (
‘list/:id’.file_put_contents(‘1.php’,‘aaa’,’<?php phpinfo();’).’’ =>
array (
0 => ‘portal/List/index’,
1 =>
array (
),
2 =>
array (
‘id’ => ‘\d+’,
),
),
);
发现这里多了我们刚才添加进来的规则,url直接用.拼接起来,在php里面这样会直接执行内部的代码就导致触发了远程的代码直接漏洞。
那到底是什么时候触发呢,这就和cms采用的thinkphp框架有关了。
我们在用phpstorm加载目录下的代码,直接分开下断看什么时候结束
最后发现断在了这里
框架在初始化的时候会去加载规则,而thinkcmf把规则设置成了可以后台添加并且保存到数据库,之后在从数据库读取加载,加载的时候没有严格过滤导致了框架加载的时候include直接执行了。到这里一切思路就变得清楚了。由于要后台登陆修改就显得这个漏洞变得有点鸡肋了,不如thinkphp5最近爆出的直接远程代码执行漏洞来的直接。就当做练习吧。