0%

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

漏洞复现

未开启debug模式,

1
2
3
4
5
6
7
url: 

http://tp1-11:8888/public/index.php?s=captcha

post:

_method=__construct&filter[]=system&method=get&get[]=whoami

漏洞分析:

定位关键代码:

第525行: 读取了配置文件的var_method,

并赋值

1
$this->method = _method

第526行:

引用了外部变量$POST

1
$this->{$this->method}($_POST);  

执行结果:

将Request类的method覆盖了,这个时候将调用Request类构造函数__construct

构造函数引入了外部变量,准备创建一个新实例

这个实例的属性

  • $method被设置成了get

  • $get方法的请求参数被设置成了一个array,值为whoami

  • 全局过滤规则$filter被设置成了一个array,值为system

这个时候实例的初始化完成了。

跳回到了Route.php检测URL路由的函数check(),这个时候的method值为get

经过一连串检测之后,

App.phprun()函数对请求执行调用分发

继续跟进,

调用栈:

  • param()获取当前请求的参数

  • method()当前的请求类型

  • server()获取server参数

  • input()获取变量 支持过滤和默认值

  • getFilter()获取过滤方法

这个时候我们之前创建的请求实例的filter方法为system

继续

  • param()获取当前请求的参数

  • get()设置获取GET参数

  • input()获取变量 支持过滤和默认值

  • array_walk_recursive()

  • filterValue递归过滤给定的值

执行结果:

refs: