0x00 前言html
最近在学习java的相关漏洞,因此Struts2的漏洞天然是绕不开的。为了更好的理解漏洞原理,计划把Struts2全部的漏洞本身都作一个复现。而且本身去实现相关的POC。相关的环境搭建,以及POC实现细节,参考文章我都会尽量的写清楚。方便本身记录学习过程的同时,方便看文章的人学习。java
0x01 环境搭建web
首先咱们从Struts2官方提供的历史版本中找到Struts2.0.1的版本进行下载,下载地址以下:apache
https://archive.apache.org/dist/struts/binaries/
而后在解压缩以后的目录中咱们找到,apps/struts2-showcase-2.0.1.war的包,将其放在咱们已经搭建好的servlet容器中。本文中采用的Apache Tomcat 9.0.0.M26的版本。咱们将整个war包部署在web的根目录,开启web服务器以后。咱们能够看到已经自动部署好。咱们访问,http://127.0.0.1:8080/struts2-showcase-2.0.1,将会跳转到http://127.0.0.1:8080/struts2-showcase-2.0.1/showcase.action。访问结果以下,说明安装成功。浏览器
0x02 漏洞原理分析tomcat
咱们首先来了解一下Struts2 中的validation机制。validation依靠validation和workflow两个拦截器。validation会根据配置的xml文件建立一个特殊字段错误列表。而workflow则会根据validation的错误对其进行检测,若是输入有值,将会把用户带回到原先提交表单的页面,而且将值返回。反之,在默认状况下,若是控制器没有获得任何的输入结果可是有validation验证错误。那么用户将会获得一个错误的信息提示。具体能够参考官方文档中validation的说明。
服务器
https://struts.apache.org/core-developers/validation.html
那么这个机制到底和咱们的漏洞有什么关系呢?在WebWork 2.1+ 和 Struts 2中存在一个altSyntax的特性,该特性容许用户提交OGNL请求,当用户提交恶意请求表单,故意触发一个validation错误,页面被workflow再次返回给用户的时候,默认状况下至关于返回%{return_value},咱们注入的恶意代码,好比%{7*7}将会被当作%{%{7*7}}递归执行执行。app
0x03 漏洞验证框架
咱们根据系统提供的例子,来作验证。在浏览器中访问:http://127.0.0.1:8080/struts2-showcase-2.0.1/validation/quizBasic.action,而后去提交表单。ide
首先须要关心一个配置项,在validation验证的配置文件中,配置以下:
<validators> <field name="name"> <field-validator type="requiredstring"> <message>You must enter a name</message> </field-validator> </field> <field name="age"> <field-validator type="int"> <param name="min">13</param> <param name="max">19</param> <message>Only people ages 13 to 19 may take this quiz</message> </field-validator> </field> </validators>
意思是提交的name字段必须是String类型,不然会提示message节点中的内容。age必须是int类型,而且大小在13到19岁之间。咱们用age来故意触发一个错误。而后用name来进行代码注入。
咱们能够看到咱们提交的name=%{7*7},age=12触发了错误,而后name被解析成了49.尝试获取tomcat路径。name=%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}结果以下:
0x04 反思
Struts2爆出了50多个漏洞了,不少的漏洞利用和挖掘思路都十分有意思。从侧面来看,这些也反映出了java生态的混乱和脆弱。从挖掘思路来看,对于框架的细节不了解,是挖不到这样的好漏洞的。研究必需要深刻到每一行代码。
0x05 参考连接
1. 【官方漏洞公告】https://cwiki.apache.org/confluence/display/WW/S2-001
2. 【王小龍的博客】http://bruce.wang/2017/12/01/Struts%202%20%E6%BC%8F%E6%B4%9E%E7%B3%BB%E5%88%97%E4%B9%8B%20S2-001/
3. 【validation详细介绍】https://struts.apache.org/core-developers/validation.html
4. 【ONGL语言指导】http://commons.apache.org/proper/commons-ognl/language-guide.html