前言

早就写了但忘了发,当笔记用了,近日闲来无事,复习一下thinkphp5的rce,顺便看看过滤_method后还有什么可以用的点

环境搭建

composer create-project topthink/think=5.0.5 thinkphp5.0.1  --prefer-dist

去compsoer.json中改一下版本

"require": {
    "php": ">=5.4.0",
    "topthink/framework": "5.0.1"
}

执行composer update

5.0.x method __contruct导致rce

thinkphp5.0.1

导致rce的原因:
通过覆盖类属性,来添加一个filter,这个filter会回调函数,导致命令执行

打个断点在起点
往下走,在检测路由时会进入method方法

里面是关键部分

Config::get('var_method')从全局变量$config中获取var_method

等于是获取$config['_sys_']['var_method'],该变量值为_method

于是我们就控制了$this->method这个变量,接下来的$this->{$this->method}($_POST)中就可以调用Request.php中的任意方法,且参数可控

我们选择调用__construct方法

在这个循环中我们可以覆盖Request类中属性,覆盖filter,值为system

之后zairequest类中的param,该方法获取获取当前请求的参数,其中调用了input方法
input中会解析过滤器,具体执行在filterValue方法中,这是thinkphp触发rce的关键

回调函数执行任意方法,至此结束rce


"孓然一身 , 了无牵挂"