0x00简介
Apache Struts是美国阿帕奇(Apache)软件基金会负责维护的一个开源项目Struts2框架是一个用于开发Java EE网络应用程序的开放源代码网页应用程序架构。它利用并延伸了Java Servlet API,鼓励开发者采用MVC架构。Struts2以WebWork优秀的设计思想为核心,吸收了Struts框架的部分优点,提供了一个更加整洁的MVC设计模式实现的Web应用程序框架。
0x01漏洞概述
漏洞产生于网站配置XML时如果没有设置namespace的值,并且上层动作配置中并没有设置或使用通配符namespace时,可能会导致远程代码执行漏洞的发生。同样也可能因为url标签没有设置value和action的值,并且上层动作并没有设置或使用通配符namespace,从而导致远程代码执行漏洞的发生。
0x02影响版本
Apache Struts 2.3–Struts 2.3.34
Apache Struts 2.5–Struts 2.5.16
0x03环境搭建
1. 这里使用vulhub的docker环境进行搭建,vulhub下载地址:
https://github.com/vulhub/vulhub
2. 下载完成后安装docker-compose //安装方法自行搜索,安装完成后进入vulhub cd /home/demo/vulhub-master/struts2/s2-057/目录下使用
docker-compose up -d 拉取镜像
3.底下显示done表示拉取成功,在浏览器访问http://IP:8080/struts2-showcase可以看到Struts2测试页面表示搭建成功。
4.漏洞利用条件
4.1 alwaysSelectFullNamespace被设置为true,此时namespace的值是从URL中获取的。URL是可控的,所以namespace也是可控的。
4.2 action元素没有名称空间属性集,或者使用通配符。该名称空间将由用户从URL传递并解析为OGNL表达式,最终导致远程代码执行的脆弱性。
0x04漏洞复现
1.在url处输入http://IP:8080/struts2-showcase/${(123+123)}/actionChain1.action后刷新可以看到中间数字位置相加了。
2.修改中间${(123+123)}位置的payload替换用代码执行编写成命令执行的exp,这一步使用burp抓包修改可以直观的看到结果
Payload: //注:payload需要使用url编码
3.抓包发送到Repeater(重放)模块,在url加上url编码的paylaod,然后发送即可在头部看到回显结果
0x05修复建议
1. 临时解决方案:上层动作配置中没有设置或使用通配符namespace时,验证所有XML配置中的namespace,同时在JSP中验证所有url标签的value和action。
2. 官方已发布最新版本来修复此漏洞,受影响的用户请尽快升级到Apache Struts 2.3.35 或 Struts 2.5.17版