thinkphp:6.0.12漏洞复现

0x01 漏洞介绍

漏洞成因:由于多语言功能里面的路径拼接行为导致的目录穿越,以及此功能的没有过滤的文件包含功能

1
2
3
4
5
6
7
8
9
10
11
 名称: vulfocus/thinkphp:6.0.12

描述:

ThinkPHP 是一个快速、简单的面向对象的轻量级 PHP 开发框架,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。

如果 Thinkphp 程序开启了多语言功能,攻击者可以通过 get、header、cookie 等位置传入参数,实现目录穿越+文件包含,通过 pearcmd 文件包含这个 trick 即可实现 RCE。

访问路径诶:/public/index.php


0x02 思路

想实现一个带有木马的文件被解析这个目标,首先我们要存在木马文件(没有的话写入一个),当然还要具备解析能力——也就是文件包含,其次我们需要这个文件的路径:

1.关于路径和文件包含:多语言功能实现目录穿越

多语言功能是通过包含语言文件来实现功能的。也就是会需要:include $file;(include一个文件将会解析并运行此文件,然后我们就可以实行中文语言包了)

假设我们需要中文语言文件,我们可以在 get、header、cookie 等位置传入参数 zh-cn,然后框架(thinkphp)就会把 此参数 拼接到路径里面,变成......../src/lang/zh-cn.php

那如果我们借 目录穿越 往上面找到我们需要的文件呢:比如,拼接进去../../../../../../../../我们想要的文件.php

拼接后:

1
>......../src/lang/../../../../../../../../我们想要的文件.php

那么我们就可以让框架解析并运行我们想要的文件了————这也就是目录穿越

2.关于写入木马文件

已知 pearcmd.php 文件是 PHP 自带的一个命令行工具包:只要他被解析,你就能在url里面传入命令。然后被执行

我们写入一个木马在 tmp/1.php 里面,然后让刚刚讲的 目录穿越和文件包含 读取我们写入的木马文件。

怎么在url里面传入命令?格式是什么样的?

又知道config-createpear 的一个创建配置文件的命令:于是构造

1
>/index.php?+config-create+/<?=phpinfo()?>+/tmp/1.php

创建一个配置文件,内容是 <?=phpinfo()?>,保存路径是 /tmp/hello.php

斜杠是为了闭合占位

3.pear语法解析

在正 Linux 里想用 pear 创建一个配置,语法是:

1
pear config-create [文件内容] [文件路径]

但在 Web 环境下是通过 include "pearcmd.php" 来调用的,pearcmd 会去读取全局变量 $_SERVER['QUERY_STRING'](也就是 URL 问号后面的内容)作为它的命令行参数。

pearcmd 解析参数时,它靠 加号 (+) 或者 空格 来拆分参数的。

pearcmd 内部处理参数会把 $_SERVER['QUERY_STRING']+ 分割成数组。 URL 传过去后数组长这样:

array(0 => 'config-create', 1 => '/<?=phpinfo()?>/', 2 => '/tmp/hello.php')

所以,这个 URL 拆解开来是这样的:

  1. +:代表空格,用来分隔命令。
  2. config-create:这是第一个参数,告诉 pear 我要创建配置。
  3. /<?=phpinfo()?>/:这是第二个参数,也就是配置的内容
    • 为什么前后有 / 在 pear 的 config-create 语法里,它需要明确参数的边界。
  4. /tmp/hello.php:这是第三个参数,也就是文件保存的路径

0x03 exp+poc

1.构造命令+写入木马文件

写入木马文件phpinfo,写入路径为:tmp/hello.php

在url中写入命令能解析的前提是pearcmd.php被解析————让其被解析的方法就是在多语言功能lang中拼接我们的pearcmd.php文件路径,注意不要加后缀,框架自己会加上的

image-20260413162809977

2.解析我们的木马文件

依然是用到多语言功能里面的文件包含和路径穿越

在cookie中改变think—lang的值为具体路径

image-20260413162731729

0x04 漏洞补救

1.严格限制路径拼接非法参数

2.规范pearcmd的使用权限