thinkphp6.0.12漏洞复现
thinkphp:6.0.12漏洞复现
0x01 漏洞介绍
漏洞成因:由于多语言功能里面的路径拼接行为导致的目录穿越,以及此功能的没有过滤的文件包含功能
1 | 名称: vulfocus/thinkphp:6.0.12 |
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-create是pear的一个创建配置文件的命令:于是构造
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 拆解开来是这样的:
+:代表空格,用来分隔命令。config-create:这是第一个参数,告诉 pear 我要创建配置。/<?=phpinfo()?>/:这是第二个参数,也就是配置的内容。
- 为什么前后有
/? 在 pear 的config-create语法里,它需要明确参数的边界。/tmp/hello.php:这是第三个参数,也就是文件保存的路径。
0x03 exp+poc
1.构造命令+写入木马文件
写入木马文件phpinfo,写入路径为:tmp/hello.php
在url中写入命令能解析的前提是pearcmd.php被解析————让其被解析的方法就是在多语言功能lang中拼接我们的pearcmd.php文件路径,注意不要加后缀,框架自己会加上的

2.解析我们的木马文件
依然是用到多语言功能里面的文件包含和路径穿越
在cookie中改变think—lang的值为具体路径

0x04 漏洞补救
1.严格限制路径拼接非法参数
2.规范pearcmd的使用权限

