漏洞复现
未开启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.phprun()函数对请求执行调用分发


继续跟进,

调用栈:

-
param()获取当前请求的参数 -
method()当前的请求类型 -
server()获取server参数 -
input()获取变量 支持过滤和默认值 -
getFilter()获取过滤方法

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

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

-
get()设置获取GET参数


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

-
array_walk_recursive() -
filterValue递归过滤给定的值

执行结果:
