Struts2漏洞分析与研究之S2-005漏洞分析



转载请注明出处:http://blog.csdn.net/u011721501?viewmode=list

1、概述

S2-005是由于官方在修补S2-003不全面导致绕过补丁造成的。我们都知道访问Ognl的上下文对象必须要使用#符号,S2-003对#号进行过滤,但是没有考虑到unicode编码情况,导致\u0023或者8进制\43绕过。

S2-005则是绕过官方的安全配置(禁止静态方法调用和类方法执行),再次造成漏洞。

Payload如下:

http://www.xxxx.com/aaa.action?(‘\u0023_memberAccess[\‘allowStaticMethodAccess\‘]‘)(meh)=true&(aaa)((‘\u0023context[\‘xwork.MethodAccessor.denyMethodExecution\‘]\u003d\u0023foo‘)(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)((‘\u0023rt.exit(1)‘)(\u0023rt\[email protected]@getRuntime()))=1

提交上述URL,就会导致服务器down掉。把编码转换过来为下面三个步骤:

(1)?(‘#_memberAccess[‘allowStaticMethodAccess‘]‘)(meh)=true

(2)&(aaa)((‘#context[‘xwork.MethodAccessor.denyMethodExecution‘]=#foo‘)(#foo=new%20java.lang.Boolean("false")))

(3)&(asdf)((‘#rt.exit(1)‘)(#[email protected][email protected]untime()))=1

第一步将_memberAccess变量中的allowStaticMethod设置为true,这里payload还要加括号,并且还带个"(meh)"呢?其实是为了遵守Ognl语法树的规则,这个后面再说。第一步完成后,就可以执行静态方法了。

第二步将上下文中的xwork.MethodAccessor.denyMethodExecution  设置为false,即允许方法的执行,这里的MehodAccessor是Struts2中规定方法/属性访问策略的类,也存在与Ognl的上下文中。同样遵守Ognl语法树规则。

第三步就是真正的攻击代码,前两步就是要保证第三步成功执行,第三步就是执行了关闭服务器的代码。但是要过调用Runtime类的静态方法获取一个Runtime对象。

2、深入探讨

那么为什么攻击者只要提交这个攻击URL就能使服务器down掉呢?仅仅看这三句不要以为就懂了,要理解其中的奥妙,必须要阅读源码。

中间件处理一个用户request顺序是这样的:

首先服务器接收到请求后会读取web.xml文件,这个是网站配置文件,里面有个过滤器,叫:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

然后这个过滤器执行完之后,就可以执行我们的Action了。

这个类主要是做一些配置文件读取,以及默认拦截器栈的执行。

具体是这样的,查看struts-default.xml配置文件,这里有全部的类信息。

这里定义了一个默认的package叫struts-default,里面定义了结果集的类型以及默认的拦截器(interceptors),还有默认加载的类ActionSupport。

以及,最重要的是默认执行的拦截器栈(default-interceptor-ref),名叫defaultStack。

这个拦截器栈的结构如下:

是个栈结构,在执行我们自己的Action,这里面的拦截器会依次执行,对于我们分析来说,比较重要的一个拦截器是params,它的作用主要是用来处理URL中的参数的,类全名为:org.apache.struts2.interceptor.ActionMappingParametersInteceptor。

拦截器中的执行方法是doIntecept(),这里做了如下处理,在方法addParametersToContext:

可以看到这里获取一个值栈,并将参数(parameters)放入进去。

在setParameters方法中,其实是将请求做成了键值对,加入了新的值栈(Map结构)中。

在Ognl中,值栈(ValueStack)的实现类是OgnlValueStack,看看里面的setValue方法,发现又调用了OgnlUtil的setValue,好一个装饰模式。。。

跟进去OgnlUtil类,发现又包装了一遍,最终是调用了Ognl中的setValue方法。

注意,这里有个compile方法,用来将传入的字符串进行解析,执行完之后返回一个语法树。

执行完compile方法,再执行setValue方法,参数为四个:语法树、上下文、根对象以及传入的value值。

要解释payload中代码为啥都放到一个一个括号里,这就牵扯到Ognl的语法树的原理。由于我现在还没学过编译原理,只能看个大概。

在Ognl中,有几个类型的语法树,ASTEval、ASTAssign、ASTStaticMethod、ASTConst、ASTProperty、ASTChain等,这些在构造树的时候会应用于不同的语法格式,虽然传入的ognl仅仅是字符串。比如传入user.name就是生成ASTChain,因为这里采用了链式结构来访问user对象中的name属性。

Payload中的攻击代码有两个形式:

(1)?(‘#_memberAccess[‘allowStaticMethodAccess‘]‘)(meh)=true

(2)&(aaa)((‘#context[‘xwork.MethodAccessor.denyMethodExecution‘]=#foo‘)(#foo=new%20java.lang.Boolean("false")))

(3)&(asdf)((‘#rt.exit(1)‘)(#[email protected][email protected]untime()))=1

一种是(expression)(constant) = value,一种是(constant)((expression1)(expression2))。

Ognl解析引擎是这样处理的,每个括号对应语法树上的一个分支,并且从最右边的叶子节点开始解析执行。

比如最后一个攻击代码,解析成语法树如下:

从右枝开始执行,依次分解,并按照不同类型的子树上面的方法来执行setValueBody或者setValueBody方法,并且对每条Ognl进行执行。

总结一下,对于:

(1)(expression)(constant)= value会执行expression=value。

(2)(constant)((expression1)(expression2))会先执行expression2,然后再执行expression1。

这就是为什么payload中的攻击代码会以那么奇怪的形式用括号包裹起来。

3、总结

到这里整个漏洞机理就比较清楚了。由于参数进入了params拦截器中,这个拦截器将url参数中的Ognl表达式以键值对的方式放入值栈,Ognl解析执行引擎就会按照规定的语法规则解析字符串并执行Ognl表达式。由于拦截器中没有对特定的符号进行完全的过滤(没有过滤八进制和十六进制的unicode码),所以导致任意代码执行,任意代码执行可以的话,就是花式攻击的节奏了。

最后一句,由于本人不才,对于语法树的分析不是很到位,期待牛人对这一块的讲解与分享。

转载请注明出处:http://blog.csdn.net/u011721501?viewmode=list

时间: 2024-12-14 05:16:40

Struts2漏洞分析与研究之S2-005漏洞分析的相关文章

缓冲区溢出分析第09课:MS06-040漏洞研究——深入挖掘

前言 经过前两次的分析,我们已经对Netapi32.dll文件中所包含的漏洞成功地实现了利用.在系统未打补丁之前,这确实是一个非常严重的漏洞,那么打了补丁之后,这个动态链接库是不是就安全了呢?答案是否定的.即便是打了补丁,虽说我们之前所分析的漏洞已被补上,但是这个程序中依旧存在着其它的问题. 对漏洞函数进行静态分析 我们之前所研究的Netapi32.dll的大小为309,008 字节,补丁后的文件大小为309,760 字节.我们用IDA Pro载入打过补丁后的DLL文件,找到之前出现问题的函数位

NLP+语篇分析(五)︱中文语篇分析研究现状(CIPS2016)

摘录自:CIPS2016 中文信息处理报告<第三章 语篇分析研究进展.现状及趋势>P21 CIPS2016 中文信息处理报告下载链接:http://cips-upload.bj.bcebos.com/cips2016.pdf NLP词法.句法.语义.语篇综合系列: NLP+词法系列(一)︱中文分词技术小结.几大分词引擎的介绍与比较 NLP+词法系列(二)︱中文分词技术及词性标注研究现状(CIPS2016) NLP+句法结构(三)︱中文句法结构研究现状(CIPS2016) NLP+语义分析(四)

Irrlicht游戏引擎初步分析与研究

转载出处:http://blog.csdn.net/hellphenix/archive/2008/03/19/2198226.aspx Irrlicht游戏引擎主要是由一个名叫Nikolaus Gebhardt奥地利人所设计,是sourceforge上的一个开源项目,也是著名的开源游戏引擎.Irrlicht是一个德国神话故事中的一种动物的名字,它能够发光和飞翔,可以在大部分的沼泽地附近发现它.单词"Irrlicht"是两个德国单词("irr"意思是疯狂的:而&qu

2015.03.10,学习,论文学习笔记-“水轮机压力脉动的混频幅值置信度分析方法研究”

文献:胡江艺.水轮机压力脉动的混频幅值置信度分析方法研究.水利机械技术,2014(3).17-22 摘要:文章根据IEC试验规程要求,对常见的用于计算压力脉动混频幅值置信度方法进行了分析.结合模型试验结果对压力脉动随机变量的分布进行了讨论.分析了计算方法的实用性,提出了符合要求的计算方法. 关键词:压力脉动 混频幅值 置信度 正态分布 笔记: 国内压力脉动测量采用混频压力脉动相对幅值,即时域内压力脉动的峰峰值与净水头H的幅值,其中峰峰值采用了置信度方法计算.IEC规程定义的混频压力脉动幅值称为宽

《面向微博的社会情绪词典构建及情绪分析方法研究》学习笔记

1. 目的: 探索一种面向微博的社会情绪词典构建方法: 2. 步骤: 1)通过手工方法建立小规模的基准情绪词典: 2)利用深度学习工具 Word2vec对社会热点事件的微博语料通过增量式学习方法来扩展基准词典,并结合 HowNet词典匹配和人工筛选生成最终的情绪词典: 3. 试验阶段: 分别利用基于情绪词典和基于SVM的情绪方法对实验标注语料进行情绪分析: 4. 结果分析: 结果对比分析表明基于词典的情绪分析方法优于基于SVM的情绪分析方法,前者的平均准确率和召回率比后者分别高13.9%和1.5

安卓APP漏洞有哪些?在线免费App漏洞检测!

       针对智能手机的恶意软件早在几年前就已经出现了,不过直到2012年,手机安全问题才忽然成为了大众谈论的焦点.作为专业的移动互联网APP安全服务提供商爱加密来说,很早就开始着手于APP安全领域,为开发者们提供安全检测.应用保护.渠道检测等专业服务,全方位的保护APP安全,防止盗版.山寨.二次打包.注入恶意代码等现象的出现. 据了解,打包党通过APP应用存在的漏洞进行破解打包,形成山寨产品,流入市场给用户和开发者造成利益损害.我们所了解的Android应用程序存在的漏洞主要有:源代码存在

OpenStack_Swift源码分析——Ring的rebalance算法源代码详细分析

今天有同学去百度,带回一道面试题,和大家分享一下: 打印: n=1 1 n=2 3 3 2 4 1 1 4 5 5 n=3 7 7 7 7 6 8 3 3 2 6 8 4 1 1 6 8 4 5 5 5 8 9 9 9 9 提供一段参考程序: <pre name="code" class="cpp">// ConsoleApplication1.cpp: 主项目文件. #include "stdafx.h" #include &quo

Spring源码分析——BeanFactory体系之抽象类、类分析(二)

上一篇分析了BeanFactory体系的2个类,SimpleAliasRegistry和DefaultSingletonBeanRegistry——Spring源码分析——BeanFactory体系之抽象类.类分析(一),今天继续分析. 一.工厂Bean注册支持——FactoryBeanRegistrySupport 废话不多说,直接看我注释的源码: /* * Copyright 2002-2012 the original author or authors. * * Licensed und

文《关于c++与java中文乱码问题分析与解决》中一个bug分析

文<关于c++与java中文乱码问题分析与解决>中一个bug分析 DionysosLai([email protected]) 2014/10/21 在前几篇一博客<关于c++与java中文乱码问题分析与解决>,地址如下:http://blog.csdn.net/dionysos_lai/article/details/38389765.文中详细介绍了c++与java数据传递时,为何会出现中文乱码的原因,并提出了适当的解决方法.方法如下: int CCDirector::GBKTo

PHP漏洞全解(九)-文件上传漏洞

本文主要介绍针对PHP网站文件上传漏洞.由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过 Web 访问的目录上传任意PHP文件,并能够将这些文件传递给 PHP解释器,就可以在远程服务器上执行任意PHP脚本,即文件上传漏洞. 一套web应用程序,一般都会提供文件上传的功能,方便来访者上传一些文件. 下面是一个简单的文件上传表单 <form action="upload.php" method="post" encty