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"></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分析的更多相关文章
- struts2漏洞复现分析合集
struts2漏洞复现合集 环境准备 tomcat安装 漏洞代码取自vulhub,使用idea进行远程调试 struts2远程调试 catalina.bat jpda start 开启debug模式, ...
- 蓝牙App漏洞系列分析之一CVE-2017-0601
蓝牙App漏洞系列分析之一CVE-2017-0601 0x01 概要 2017年5月的 Android 安全公告修复了我们提交的一个蓝牙提权中危漏洞,这个漏洞尽管简单,但比较有意思,能够使本地恶意 A ...
- 蓝牙App漏洞系列分析之二CVE-2017-0639
蓝牙App漏洞系列分析之二CVE-2017-0639 0x01 漏洞简介 Android本月的安全公告,修复了我们发现的另一个蓝牙App信息泄露漏洞,该漏洞允许攻击者获取 bluetooth用户所拥有 ...
- 蓝牙App漏洞系列分析之三CVE-2017-0645
蓝牙App漏洞系列分析之三CVE-2017-0645 0x01 漏洞简介 Android 6月的安全公告,同时还修复了我们发现的一个蓝牙 App 提权中危漏洞,该漏洞允许手机本地无权限的恶意程序构造一 ...
- Struts2漏洞拉响网站安全红色警报以及把Struts2更新为最新版本Struts2.3.15.1步骤
360网站安全检测平台今日发布红色警报称,广泛应用在国内大型网站系统的Struts2框架正在遭到黑客猛烈攻击.利用Struts2“命令执行漏洞”,黑客可轻易获得网站服务器ROOT权限.执行任意命令,从 ...
- struts2漏洞-第一次入侵经历
这两天上数据库,老师给了我们一个网站,该网站是一个售花网站.是有一个师兄写的毕业设计.然后挂在内网,然后使用这个系统,然后分析网站,写个数据库设计的报告.简单的写了数据库作业后就闲来无事做,就想对这个 ...
- Struts2漏洞导致的反弹shell——青藤云安全使用的是agent进程采集器进行检测
安全老司机 | Struts2漏洞爆发后,与黑客的一次正面交锋 from:https://zhuanlan.zhihu.com/p/66122521 备注: 青藤云安全:——用的是进程信息采集器 通 ...
- Struts2漏洞利用实例
Struts2漏洞利用实例 如果存在struts2漏洞的站,administrator权限,但是无法加管理组,内网,shell访问500. 1.struts2 漏洞原理:struts2是一个框架,他在 ...
- Struts2请求处理流程及源码分析
1.1 Struts2请求处理 1. 一个请求在Struts2框架中的处理步骤: a) 客户端初始化一个指向Servlet容器的请求: b) 根据Web.xml配置,请求首先经过ActionConte ...
随机推荐
- web端跨域调用webapi(转)
在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webapi的程序,如下图所示: 由于微软已 ...
- HDU 5120 Intersection (圆的面积交)
题意:给定两个圆环,求两个圆环的面积交. 析:很容易知道,圆环面积交就是,大圆与大圆面积交 - 大圆和小圆面积交 - 小圆和大圆面积交 + 小圆和小圆面积交. 代码如下: #pragma commen ...
- UVa 247 Calling Circles (DFS+Floyd)
题意:如果两个人互通电话,那么他们就在一个电话圈里,现在给定 n 个人,并且给定 m 个通话记录,让你输出所有的电话圈. 析:刚开始没想到是Floyd算法,后来才知道是这个算法,利用这个算法进行连通性 ...
- view是视图层+action是控制层+service是业务层+dao是数据访问层。
- Send [1] times, still failed
com.alibaba.rocketmq.client.exception.MQClientException: Send [1] times, still failed, cost [696094] ...
- Oracle EBS View 视图查看没有数据
--关于看视图查看没有数据的问题 --原因OU过滤关系 --Oracle SQL*Plus --toad EXECUTE fnd_client_info.set_org_context(:ou_id ...
- TSQL--集合处理
UNION ALL 返回两个结果集中所有的行,返回结果集中会存在重复行 UNION 返回两个结果集中去重的行,返回结果集中无重复行 INTERSECT 返回两个结果集都有的行,返回结果集中无重复行 E ...
- TSQL--使用CTE完成递归查询
CREATE TABLE TB001( CategoryId INT PRIMARY KEY, ParentCategoryId INT, CategoryName NVARCHAR(200))GO ...
- linux下切换用户出现This account is currently not available
今天在一台新服务器下切换用户的时候出现“This account is currently not available”错误上网检索了一 下发现是用户的shell禁止登录的问题 解决办法:比如我是 s ...
- CI-Excel-Generation-Library php导出excel乱码。
修改 private function generate($headers, $data) { $this->set_headers(); $data = " ...