漏洞复现
未开启debug模式,
1 | url: |
漏洞分析:
定位关键代码:
第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.php
run()函数对请求执行调用分发
继续跟进,
调用栈:
-
param()
获取当前请求的参数 -
method()
当前的请求类型 -
server()
获取server参数 -
input()
获取变量 支持过滤和默认值 -
getFilter()
获取过滤方法
这个时候我们之前创建的请求实例的filter
方法为system
继续
-
param()
获取当前请求的参数
-
get()
设置获取GET参数
-
input()
获取变量 支持过滤和默认值
-
array_walk_recursive()
-
filterValue
递归过滤给定的值
执行结果: