ThinkphpRCE

  • 加载第三方类库captcha路由。
  • 非debug
    • payload:
    • 1.路由检测
      • 1.1跟进self::routeCheck
      • 1.2跟进Route::check
        • 1.2.1在check函数进入$request->method(),
        • 1.2.2进入method()函数
        • 1.2.3进入__construct函数
      • 1.3跟进self::checkRoute
      • 1.4 跟进self::checkRule
      • 1.5跟进self::parseRule
    • 2.路由检测后,进入self::exec函数
      • 2.1 跟进exec函数
      • 2.2Request.php
      • 2.3进入param函数,
      • 2.4进入input函数。
      • 2.5进入filterValue函数,
  • debug模式
    • payload:
    • 1.App.php run函数
      • 1.1![在这里插入图片描述](https://img-blog.csdnimg.cn/10aab713d64b4e9f90d4fb27640175fa.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAPz9AX0A=,size_20,color_FFFFFF,t_70,g_se,x_16)
      • 1.2Route.php
        • 1.2.1
    • 2,run函数
      • 2.1Request.php

参考连接:
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

thinkphp5RCE相关推荐

  1. ThinkPHP5RCE漏洞复现

    Payload:/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]= ...

  2. 漏洞复现-渗透原理与挖掘ThinkPHP系列

    ThinkPHP poc链挖掘与复现 ThinkPHP5-rce 5.0.22/5.1.29 远程代码执行漏洞 6.0.12LTS反序列化 准备工作 composer下载 thinkphp框架 打开 ...

最新文章

  1. CentOS 6.5/6.6 安装mysql 5.7 最完整版教程
  2. html的闪烁字,HTML最简单的文字闪烁代码
  3. HDU-1151 Air Raid
  4. c 提示错误expected) before ; token_NLP.TM[33] | 纠错:pycorrector的错误检测
  5. 如何使用Keras功能API进行深度学习
  6. Windows程序设计的第一个实例
  7. IDEA2019开发WebService实例
  8. urllib.request.urlopen()出现的程序超时假死问题
  9. 【lphtw】第三弹笔记ex24-ex35
  10. 天善智能网络爬虫学习~
  11. 【内推】阿里云 云原生团队 2022 届秋招
  12. matlab毕业答辩会问什么,论文答辩必备:自述模板和注意问题
  13. 八数码 问题 BFS+Cantor
  14. 网络工程专业就业方向
  15. Vue常用的内置指令的底层细节分析
  16. 量子信息 量子计算机的新闻,应用挑战知多少?美国学界公布量子信息路线图...
  17. 32位程序在64位系统上运行
  18. 电脑和电话能通话?简单
  19. 蚂蚁金服崔恒斌:金融智能——对话机器人新形态
  20. 3. 链路层(学习笔记)

热门文章

  1. 图形学基础|基于LTC的面光源渲染
  2. 我的创业故事(一)团队成立
  3. 惠普服务器安装 CentOS 7
  4. 是黑客驱动着汽车网络安全市场的趋势?听听大佬们怎么说
  5. 21日汉字改革圆桌论坛 畅谈44个汉字“整形”
  6. ScriptManager.RegisterStartupScript()的使用
  7. 数据分析—03数据分析绘图库
  8. 标准差分进化算法(DE)
  9. DataWhale数据挖掘实践_智慧海洋(二)
  10. C语言sleep函数与usleep函数