web安全/渗透测试--61--Struts2远程命令执行漏洞

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wutianxu123/article/details/82819691

1、漏洞描述:

Struts2是在struts和WebWork的技术基础上进行了合并的全新的框架。Struts2漏洞类型分为两种,一种是使用缩写的导航参数前缀时的远程代码执行漏洞,另一种是使用缩写的重定向参数前缀时的开放式重定向漏洞,Struts2远程命令执行,属于高危安全漏洞,可使黑客取得网站服务器的权限。这里我们重点描述相关远程命令执行漏洞。Struts2的DefaultActionMapper支持一种方法,可以使用”action:”,“redirect:”,“redirectAction:”对输入信息进行处理,从而改变前缀参数,这样操作的目的是方便表单中的操作。在2.3.15.1版本以前的struts2中,没有对“action:”,“redirect:”,“redirectAction:”等进行处理,导致ongl表达式可以被执行,如s2-020的漏洞中,利用ognl的class.xx这种方式来遍历属性。

2、检测条件:

已知Web网站用了struts 2的框架。

3、检测方法

1、在了解网站所采用的结构框架后,除去伪静态页面,抓包或者读取页面源代码方式,查找到网站系统url为.do和.action结尾类型后,添加相应的远程命令执行代码进行判断。

2、例如用户可以在http://host.com/X.action?后添加相对应struts2漏洞的远程命令执行代码,或者直接利用工具K8 Struts2 Exploit.exe进行检测。

4、修复方案

建议及时更新struts2的版本到最新,如果暂时不能更新,则提供以下方案进行修复:

1、除了升级以外:Struts2远程代码执行漏洞(S2-013)临时解决方案:

以下是S2-013的临时解决方案:

修改文件:org.apache.struts2.views.util.DefaultUrlHelper的281–284行:

private String translateVariable(String input)  { 
	ValueStack valueStack = ServletActionContext.getContext().getValueStack(); 
	return TextParseUtil.translateVariables(input, valueStack); 
}

修改成

private String translateVariable(String input)  { 
	return input; 
}

2、Struts2 s2-016/s2-017漏洞官网漏洞说明:

http://struts.apache.org/release/2.3.x/docs/s2-016.html

解决方案(以struts 2.1.8.1版本为例):

1.下载struts 2.1.8.1 源码struts-2.1.8.1-src.zip下载完成后,记得进行MD5验证

2.eclipse建立一个war项目

3.将struts-2.1.8.1-src.zip内的源码拖到项目的src目录下

4.找到对应struts-2.1.8.1的xwork-core-2.1.6.jar放入war项目的WEB-INF/lib目录下此目的就是为了避免java文件带红叉

5.修改org.apache.struts2.dispatcher.mapper.DefaultActionMapper.java此时文件应该没有红叉.有红叉主要是缺乏servlet-api.jar和xwork-core-2.1.6.jar在buildpath中改动如下:这里采用网上jason.zhou的修改

找到handleSpecialParameters方法,做下面红色字的修改:
public void handleSpecialParameters(HttpServletRequest request,ActionMapping mapping)  {
    Set uniqueParameters = new HashSet();
    Map parameterMap = request.getParameterMap();
	for (Iterator iterator = parameterMap.keySet().iterator(); iterator.hasNext();) {
        String key = (String) iterator.next();
        if (key.endsWith(".x") || key.endsWith(".y"))  {
            key = key.substring(0, key.length() - 2);
        }
        if ((key.contains("redirect:"))||(key.contains("redirectAction:"))||(key.contains("action:"))) {
			return;
        }
        if (!uniqueParameters.contains(key)) {
            ParameterAction parameterAction = (ParameterAction) prefixTrie.get(key);
            if (parameterAction != null)  {
                parameterAction.execute(key, mapping);
                uniqueParameters.add(key);
                break;
            }
        }
	}
}

6.点中org.apache.struts2.dispatcher.mapper.DefaultActionMapper.java,右键,导出(export),导出为JAR file存盘为test.jar

DefaultActionMapper$1.class
DefaultActionMapper$2$1.class
DefaultActionMapper$2$2.class
DefaultActionMapper$2$3.class
DefaultActionMapper$2$4.class
DefaultActionMapper$2.class
DefaultActionMapper.clas

7.用winrar打开test.jar,拷贝出org/apache/struts2/dispatcher/mapper/下的DefaultActionMapper类,一共有7个文件

8.用winrar打开struts2-core-2.1.8.1.jar进入org/apache/struts2/dispatcher/mapper/目录,将将上面拷贝出的7个文件拷贝入,覆盖原来的同名文件

9.将struts2-core-2.1.8.1.jar拷贝入你自己的项目,覆盖原来的struts2-core-2.1.8.1.jar

10.启动你的项目,重新s2-016漏洞进行测试如果发现测试结果正常(不响应.do?action:,.do?redrect:,.do?redirectAction),则证明补丁打好,漏洞被堵住了

展开阅读全文

没有更多推荐了,返回首页