74cms后台rce分析
背景
在打https://qsnctf.com/平台,给团队号刷榜,小奇师傅在群里丢了一个题目,闲客师傅直接梭哈,然后小奇师傅《骂我》,所以我就写了这篇文章
前期
74cms是基于tp框架开发的,对于tp框架开发的cms审计个人认为有2条线路
•基于tp框架本身的tp框架安全(难)
•基于tp框架开发的cms,重点审计开发者基于tp加的自定义功能
–因为有些功能需要开发者自己开发
–不推荐上手tp我们就去审计sql注入,因为他有特殊的安全写法,基本全局过滤
–一般审计对于文件和写入的审计,大多过滤和操作都是二次开发者自定义书写的
审计
首先丢到seay里面去扫一下
众所周知file_put_contents这个函数可以执行写入文件的操作
用phpstorm点进去看下
对应的定义方法是update_config发现这个方法接收两个参数$new_config, $config_file,这段代码执行的操作就是,is_file方法就是检查指定的文件是否是常规的文件,并且经行路径重写,
Figure 3:
重写到/Application/Home/Conf/目录下的config.php文件
之后$config_file变量会进入一个if判断,is_writable方法做用是判断可不可写
然后进入if语句中包含一次复制给$config变量,然后进入multimerge方法
用seay看下这个方法的定义
Figure 6:
multimerge方法接收a和b两个变量然后进入if判断,分别判断b是否为数组,并且返回数组中元素的数目,然后遍历下,然后所搜索session_options的数组值
大概意思明白了,emmm似乎没啥用
file_put_contents函数中的另外两个函数也没啥用直接跳过
截至到现在的分析可以看出,只要我们控制了$config就可以实现RCE,接下来我们看下update_config方法在哪儿有调用
我们系统的看下一set方法
发现会进入一个I的方法,我们看下I方法写的什么
图没截图全,I方法是tp框架中内置的一个方法,它主要的作用是进行tp请求格式书写,以及过滤操作
如:
正常:
$_GET['id'];
tp:
echo I('get.id')
所以上文中set方法中有个参数叫tpl_dir
并且我们发现对tpl_dir过滤很简单去除两边的空格
然后回放进_get_templates_info方法
看下_get_templates_info方法定义
这块执行的操作就是获取模板的一些信息
然后我们看下setField方法
没啥用
接下来$tpl_dir又会进入ads_init方法,我们看下
这块发现就是对模板配置信息的获取
在看tpl控制器文件
执行完操作1之后(也就是货期完配置信息)就会进入我们开头看到的东西update_config
路由
tp路由书写:
地址/index.php?m=模块&c=控制器&a=方法名
本案例路由+poc:
地址/index.php?m=Admin&c=Tpl&a=set&tpl_dir=', 'a',phpinfo(),'
原文始发于微信公众号(HashRun安全团队):74cms后台rce分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论