thinkphp5RCE


参考连接:
thinkphp5 RCE漏洞复现_feng的博客-CSDN博客_rce漏洞复现
【代码审计】ThinkPHP5.x版本RCE漏洞分析与收集 | m0re的小站

加载第三方类库captcha路由。

base.php
在这里插入图片描述
Loader.php
在这里插入图片描述
helper.php在这里插入图片描述

非debug

payload:

index.php?s=captcha
post
_method=__construct&filter[]=system&method=get&get[]=whoami
2.
?s=captcha
_method=__construct&filter=system&method=get&server[REQUEST_METHOD]=dir
为什么请求?s=captcha
App.php

1.路由检测

$dispatch['type']这儿得到的(下文$idspatch用~表示)
在这里插入图片描述

1.1跟进self::routeCheck

当Route::check返回不为flase时,$result为其返回值,~为其返回值,为flase时,~为Route::parseUrl返回值。
在这里插入图片描述

1.2跟进Route::check

$rules不为空,~为self::checkRoute返回值
在这里插入图片描述
为什么请求_method=__construct&filter[]=system&method=get

1.2.1在check函数进入$request->method(),

在这里插入图片描述

1.2.2进入method()函数

会把$_POST['_method']的值赋给$ this->method,$this->{$this->method}($_POST);,相当于可以执行Request类中的任意方法,参数是$_POST。Config::get('var_method)就是_method.即__construct($_POST)。
在这里插入图片描述

1.2.3进入__construct函数

$options中遍历name和item。如果存在该name则重新赋值$name=$item导致变量覆盖。且这里$options是用户可以控制输入的。所以这里相当于可以执行危险函数。这里对filter进行了重新赋值filter[]=system,method=get,get=dir。
在这里插入图片描述

1.3跟进self::checkRoute

~为self::checkRule返回值
在这里插入图片描述

1.4 跟进self::checkRule

当self::match函数返回值不为flase时,~为self::parseRule返回值。
在这里插入图片描述
进入self::match()函数,可知self::match()函数返回值取决于$m1[$key]与$val的值
在这里插入图片描述

-$m1为调用self:match()时传入的$url

-$var$m2数组的每个值(foreach);$m2为调用self:match()传入的$rule

测试发现,$url即为?s=传入的值

对于$rule,一直倒回至Route:check()调用self::checkRoute()时传入了$rules,对$rule进行赋值。
在这里插入图片描述

在Route:check()调用self::checkRoute()往上几行,发现$rules来自Route的$rules属性

在这里插入图片描述
其中$method由于我们变量之前提到的变量覆盖,其就是get (实际上$method代表请求的方法)
刚进入Route::check()时,即发现其$rules 属性已经存在
在这里插入图片描述
实际在加载路由captcha时就定义了。

1.5跟进self::parseRule

进行判断赋值,然后返回$result.
在这里插入图片描述

2.路由检测后,进入self::exec函数

在这里插入图片描述

2.1 跟进exec函数

发现当$dispatch['type']是controller或者method的时候,会继续调用param()函数
在这里插入图片描述

2.2Request.php

在这里插入图片描述

2.3进入param函数,

在这里插入图片描述

2.4进入input函数。

在这里插入图片描述
对于数组中的每一个值,都调用filterValue函数,

为什么请求get[]=dir,

因为array_walk_recursive函数$data需要是数组或字典。
在这里插入图片描述

2.5进入filterValue函数,

在这里插入图片描述

debug模式

payload:

_method=__construct&filter=system&server[REQUEST_METHOD]=dir

1.App.php run函数

在这里插入图片描述
像非debug模式下一样进行属性覆盖。

1.1在这里插入图片描述

1.2Route.php

在这里插入图片描述

1.2.1

在这里插入图片描述

2,run函数

在这里插入图片描述

2.1Request.php

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值