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"></param>
<param name="max"></param>
<message>Only people ages to 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

Struts2 漏洞系列之S2-001分析的更多相关文章

  1. struts2漏洞复现分析合集

    struts2漏洞复现合集 环境准备 tomcat安装 漏洞代码取自vulhub,使用idea进行远程调试 struts2远程调试 catalina.bat jpda start 开启debug模式, ...

  2. 蓝牙App漏洞系列分析之一CVE-2017-0601

    蓝牙App漏洞系列分析之一CVE-2017-0601 0x01 概要 2017年5月的 Android 安全公告修复了我们提交的一个蓝牙提权中危漏洞,这个漏洞尽管简单,但比较有意思,能够使本地恶意 A ...

  3. 蓝牙App漏洞系列分析之二CVE-2017-0639

    蓝牙App漏洞系列分析之二CVE-2017-0639 0x01 漏洞简介 Android本月的安全公告,修复了我们发现的另一个蓝牙App信息泄露漏洞,该漏洞允许攻击者获取 bluetooth用户所拥有 ...

  4. 蓝牙App漏洞系列分析之三CVE-2017-0645

    蓝牙App漏洞系列分析之三CVE-2017-0645 0x01 漏洞简介 Android 6月的安全公告,同时还修复了我们发现的一个蓝牙 App 提权中危漏洞,该漏洞允许手机本地无权限的恶意程序构造一 ...

  5. Struts2漏洞拉响网站安全红色警报以及把Struts2更新为最新版本Struts2.3.15.1步骤

    360网站安全检测平台今日发布红色警报称,广泛应用在国内大型网站系统的Struts2框架正在遭到黑客猛烈攻击.利用Struts2“命令执行漏洞”,黑客可轻易获得网站服务器ROOT权限.执行任意命令,从 ...

  6. struts2漏洞-第一次入侵经历

    这两天上数据库,老师给了我们一个网站,该网站是一个售花网站.是有一个师兄写的毕业设计.然后挂在内网,然后使用这个系统,然后分析网站,写个数据库设计的报告.简单的写了数据库作业后就闲来无事做,就想对这个 ...

  7. Struts2漏洞导致的反弹shell——青藤云安全使用的是agent进程采集器进行检测

    安全老司机 | Struts2漏洞爆发后,与黑客的一次正面交锋 from:https://zhuanlan.zhihu.com/p/66122521  备注: 青藤云安全:——用的是进程信息采集器 通 ...

  8. Struts2漏洞利用实例

    Struts2漏洞利用实例 如果存在struts2漏洞的站,administrator权限,但是无法加管理组,内网,shell访问500. 1.struts2 漏洞原理:struts2是一个框架,他在 ...

  9. Struts2请求处理流程及源码分析

    1.1 Struts2请求处理 1. 一个请求在Struts2框架中的处理步骤: a) 客户端初始化一个指向Servlet容器的请求: b) 根据Web.xml配置,请求首先经过ActionConte ...

随机推荐

  1. 企业招聘:UX设计师需要满足他们哪些期望?

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具.   为了确定2017年最有价值的用户体验技能和特质,我特地参考了150多份工作要求.最后,得出了以下 ...

  2. AspNet.WebAPI.OData.ODataPQ实现WebAPI的分页查询服务-(个人拙笔)(转)

    出处:http://www.bubuko.com/infodetail-827612.html AspNet.WebAPI.OData.ODataPQ 这是针对 Asp.net WebAPI ODat ...

  3. Linux执行YUM命令报错解决方案

    Loaded plugins: rhnplugin, security This system is not registered with RHN. RHN support will be disa ...

  4. 装饰者模式及C++实现

    装饰者模式 时常会遇到这样一种情况,我已经设计好了一个接口,并且也有几个实现类,但是这时我发现我设计的时候疏忽了,忘记了一些功能,或者后来需求变动要求加入一些功能,最简单的做法就是修改接口,添加函数, ...

  5. 为方便二层升三层新增的远程方法QuerySql6()

    为了方便原来D6,D7开发的二层老程序升级为三层,新增了远程方法QuerySql6().充分地兼容原来二层SQL的写法. 1)公共方法ParamsToStr() function ParamsToSt ...

  6. TFS 2015新功能之一,当前迭代查询标记

    TFS 2015发布在即,有幸作为MVP提前获得了TFS的RTM版本,下面就TFS 2015的新功能做一些介绍:   TFS 2015新功能之一,当前迭代查询标记 在TFS的查询中,可以将" ...

  7. Replication--复制相关的作业

    复制使用下列作业来执行计划维护和按需维护 作业名称 说明 默认调度 代理历史记录清除:分发 从分发数据库中删除复制代理历史记录. 每十分钟运行一次 分发清除:分发 从分发数据库中删除复制的事务. 停用 ...

  8. 理解mvn命令

    mvn clean package依次执行了clean.resources.compile.testResources.testCompile.test.jar(打包)等7个阶段. mvn clean ...

  9. VUE 学习笔记 二 生命周期

    1.除了数据属性,Vue 实例还暴露了一些有用的实例属性与方法.它们都有前缀 $,以便与用户定义的属性区分开来 var data = { a: 1 } var vm = new Vue({ el: ' ...

  10. WebLogic 两处任意文件上传漏洞动态分析(CVE-2018-2894)

    0x01 前言 CNCERT前几天发公告称发现Oracle公司出品的基于JavaEE结构的中间件WebLogic产品存在一个远程上传漏洞,并得到了厂商的确认,危害程度评分高达9.8分.鉴于厂商已进行了 ...