Struts2 漏洞系列之S2-001分析

0x00 前言

  最近在学习java的相关漏洞,所以Struts2的漏洞自然是绕不开的。为了更好的理解漏洞原理,计划把Struts2所有的漏洞自己都做一个复现。并且自己去实现相关的POC。相关的环境搭建,以及POC实现细节,参考文章我都会尽可能的写清楚。方便自己记录学习过程的同时,方便看文章的人学习。

0x01 环境搭建

  首先我们从Struts2官方提供的历史版本中找到Struts2.0.1的版本进行下载,下载地址如下:

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 漏洞原理分析

  我们首先来了解一下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}}递归执行执行。

0x03 漏洞验证

  我们根据系统提供的例子,来做验证。在浏览器中访问:http://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>
    </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

转载于:https://www.cnblogs.com/magic-zero/p/8214034.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值