Struts2漏洞系列之S2-001分析
0x00 前⾔
最近在学习java的相关漏洞,所以Struts2的漏洞⾃然是绕不开的。为了更好的理解漏洞原理,计划把Struts2所有的漏洞⾃⼰都做⼀个复现。并且⾃⼰去实现相关的POC。相关的环境搭建,以及POC实现细节,参考⽂章我都会尽可能的写清楚。⽅便⾃⼰记录学习过程的同时,⽅便看⽂章的⼈学习。
0x01 环境搭建
⾸先我们从Struts2官⽅提供的历史版本中到Struts2.0.1的版本进⾏下载,下载地址如下:
/dist/struts/binaries/
然后在解压缩之后的⽬录中我们到,apps/struts2-showcase-2.0.1.war的包,将其放在我们已经搭建好的servlet容器中。本⽂中采⽤的Apache Tomcat 9.0.0.M26的版本。我们将整个war包部署在web的根⽬录,开启web服务器之后。我们可以看到已经⾃动部署好。我们访问,127.0.0.1:8080/struts2-showcase-2.0.1,将会跳转到
127.0.0.1:8080/struts2-showcase-2.0.1/showcase.action。访问结果如下,说明安装成功。
0x02 漏洞原理分析
我们⾸先来了解⼀下Struts2 中的validation机制。validation依靠validation和workflow两个。validation会根据配置的xml⽂件创建⼀个特殊字段错误列表。⽽workflow则会根据validation的错误对其进⾏检测,如果输⼊有值,将会把⽤户带回到原先提交表单的页⾯,并且将值返回。反之,在默认情况下,如果控制器没有得到任何的输⼊结果但是有validation验证错误。那么⽤户将会得到⼀个错误的信息提⽰。具体可以参考官⽅⽂档中validation的说明。
/core-developers/validation.html
那么这个机制到底和我们的漏洞有什么关系呢?在WebWork 2.1+ 和 Struts 2中存在⼀个altSyntax的特性,该特性允许⽤户提交OGNL请求,当⽤户提交恶意请求表单,故意触发⼀个validation错误,页⾯被workflow再次返回给⽤户的时候,默认情况下相当于返回%{return_value},我们注⼊的恶意代码,⽐如%{7*7}将会被当做%{%{7*7}}递归执⾏执⾏。
0x03 漏洞验证
我们根据系统提供的例⼦,来做验证。在浏览器中访问:127.0.0.1:8080/struts2-showcase-2.0.1/validation/quizBasic.action,然后去提交表单。
⾸先需要关⼼⼀个配置项,在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>validation框架
</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. 【官⽅漏洞公告】/confluence/display/WW/S2-001
2. 【王⼩⿓的博客】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详细介绍】/core-developers/validation.html
4. 【ONGL语⾔指导】/proper/commons-ognl/language-guide.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。