我们先看处理请求的Request类,在thinkphp/ library/think/Request.php。
Method方法来获取当前的请求类型。
isGet、isPOST、isPUT等方法都调用了method方法来做请求类型的判断。
而在默认情况下,是有表单伪装变量的
在默认情况下,该变量值为_method
在Method方法中,将表单伪装变量对该方法的变量进行覆盖,可以实现对该类的所有函数进行调用。
在Request类中,我们看一下__construct析构方法。
如果该类属性不存在,就会调用默认配置文件中的default_filter的值。
如果该类属性存在,就会对$option数组进行遍历,将该类属性赋值为$option数组中键对应的值 。
因此,我们可以构造一个Payload:s=ipconfig&_mehthod=__construct$method=&filter[]=system
这个Payload只适用于thinkphp5.0.10版本,为什么?我们来看看thinkphp5.0.23版本的改进。
ThinkPHP5.0.23版本代码执行漏洞
在5.0.23版本中,App类 在thinkphp/ library/think/App.php中,module方法新增设置了
filter属性值,初始化了filter属性值,也导致在5.0.10版本中被重新覆盖为配置文件中的默认值导致无法进行利用。
在返回到Request类中,Param方法也调用了method方法,它用于获取当前请求的参数,传入了默认值true。
再看看method