Struts2漏洞解析和利用方法 |

  • A+
所属分类:Seay信息安全博客

显示不全请点击全屏阅读

 

最近Struts2漏洞很火,几年前的漏洞随着工具的出现变得异常火爆!Struts2是什么有多少人知道呢?
Struts2是JavaEE的一个MVC框架,不过我更喜欢SpringMVC。为什么会有那么多人选择Struts2?因为Struts2开发效率高,封装得非常完善。缺点就是太大太臃肿,ActionContext和OGNL太那啥了。没错OGNL注入也就是漏洞源。
没错,哥就是来科普的。文章是去年写的,Struts2漏洞并不止一个的,看DEMO。
Struts2第一个HelloWorld:
准备工作:
1: 首先下载Struts2.1.6,然后查看Struts目录结构。用winrar解压struts-2.1.6文件夹apps目录下的struts2-blank-2.1.6.war
解压后得到:example、META-INF、WEB-INF、index.html,在WEB-INF文件夹下把lib里面的类库放到项目的lib里面,把WEB-INF文件夹下classes中的struts.xml复制到项目src里面。
2:修改web.xml,添加一个过滤器过滤所有修改后web.xml如下:
<?xml version=”1.0″ encoding=”UTF-8″?> <web-app version=”2.5″  xmlns=”http://java.sun.com/xml/ns/javaee”  xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”  xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd“>   <welcome-file-list>     <welcome-file>index.jsp</welcome-file>   </welcome-file-list>   <filter>         <filter-name>struts2</filter-name>         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>     </filter>
<filter-mapping>         <filter-name>struts2</filter-name>         <url-pattern>/*</url-pattern>     </filter-mapping>   </web-app>
然后修改struts.xml内容:
<?xml version=”1.0″ encoding=”UTF-8″ ?> <!DOCTYPE struts PUBLIC     “-//Apache Software Foundation//DTD Struts Configuration 2.0//EN”     “http://struts.apache.org/dtds/struts-2.0.dtd“>
<struts>
<constant name=”struts.enable.DynamicMethodInvocation” value=”true” />   <package name=”default” namespace=”/” extends=”struts-default”>         <action name=”hello”>             <result>               /Hello.jsp             </result>         </action>     </package>     <!– Add packages here –>
</struts>
其中hello为action的名, <constant name=”struts.enable.DynamicMethodInvocation” value=”true” />为开发模式,感觉应该是跟自动reloadable差不多吧 <result>    /Hello.jsp    </result> result里面是一个存在的JSP页面用于测试struts是不是OK了 Hello.jsp内如仅为测试:
<%@ page language=”java” import=”java.util.*” pageEncoding=”ISO-8859-1″%> <html>   <head>     <title>Struts2_01</title>   </head>     <body>     <font color=”pink”>Hello Struts2.1.6</font>   </body> </html> 做完以上准备工作HelloWorld就已经完成了,在浏览器内访问:

Struts2漏洞解析和利用方法 |

http://127.0.0.1:8080/Struts2_01/hello.action注:.action可不写 [b][size=6]下图来自小马哥的教程:

Struts2漏洞解析和利用方法 |

然后是小马哥的原话,一个非常牛的哥们一字不露的打出来了:[/size][/b]
1.从客服端浏览器输入的 url 后,客服端通过 http 协议发送一个请求 到服务器(tomcat) ,Tomcat 收到这个请求之后,它会查看你请求的 是哪一个 web application(一般是一个项目) ,接着将请求交给对应 的 web application 处理;
2.web application 的处理过程:首先读取 web.xml 文件,通过 filter 过 滤 url,然后调用 filter-class 对应的类 StrutsPrepareAndExecuteFilter;
3 接 着 StrutsPrepareAndExecuteFilter 被 调 用 , StrutsPrepareAndExecuteFilter 询问 ActionMapper 来决定这个请是否 需要调用某个 Action 4 如果 ActionMapper 决定需要调用某个 Action, FilterDispatcher 把请 求的处理交给 ActionProxy
5 ActionProxy 通过 Configuration Manager 询问框架的配置文件, 找到 需要调用的 Action 类
6 ActionProxy 创建一个 ActionInvocation 的实例。
7 ActionInvocation 实例使用命名模式来调用,在调用 Action 的过程 前后,涉及到相关拦截器(Intercepter)的调用。
8 一旦 Action 执行完毕, ActionInvocation 负责根据 struts.xml 中的配 置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另 外的一个 Action 链) 一个需要被表示的 JSP 或者 FreeMarker 的模版。 在表示的过程中可以使用 Struts2 框架中继承的标签。 我们要探讨任何的运行流程,一定是从 这个位置开始探讨, 这里有一个客户端 在浏览器里面输入了一个 URL 地址,当他输入这个 URL 地址之后,这个 URL 地址的请求会 通过 Http 协议发送给我们的 Tomcat,Tomcat 收到这个请求之后,它 一 看 你 请 求 的 是 哪 一 个 web application 了 , 是 Struts2_0100_Introduction 这个 web application,所以他就把这个交 给对应的程序去处理,既然是这个 web application,它就当然要读这 个 web application 里面对应的 web.xml 文件来看起内部是如何配置 的,这时候它就发现了里面的配置,这里面的配置是一个 filter,当 Tomcat 收到一个请求之后,它会发现在 Struts2_0100_Introduction 这 个 web application 里面的 web.xml 里面配置了一个 filter,而这个 filter 它会过滤所有的 URL 地址,所以当我们在地址栏敲 hell 的时 候,这个地址就会被 filter 的 这个处理类接收到,接收到它会做什么样的处理了?它会首先看 你的 namespace,我们的这种访问方式它对应的 namespace 是,我们 说 过 namespace 是 和 我 们 的 访 问 的 路 径 一 一 对 应 , http://localhost:8080/Struts2_0100_Introduction/hell 这种访问方式,它 会从 struts.xml 配置文件里面去查,这里面有一个 namespace 叫 斜 杠(/) ,就查到 这部分配置了,查到这部分操作 之后了,在这个斜杠里面的后半部分是 hell ,接下来它就会去查, 在这个斜杠里面有没有一个 action 叫做 hell 的,如果有,它就会去 找了吗对应的 result 是谁,这样就找到了 Hello.jsp 页面了,就把 Hello.jsp 的结果反馈给大家了。这就是它的执行的过程。 执行过程是这样的,我们有一个客户端,也就是我们的浏览器, 客户端,它会敲一个地址,http://xxx/webappname/xx.action 它会输入 这个地址,当它敲这个地址的时候,我们的浏览器就会把这个请求发 给 Tomcat,发送请求,实际上这个应该是要求对方有一个反馈,我 就不写这一步了,Tomcat 接收到这个请求之后了它会查是交给哪一 个 web application 去处理,它会发现时交给 webappname 这个 web application 去处理,当找到该 web application 之后,它又会去参考 里面的一个配置文件,这个配置文件就是 web.xml 文件, 这个配置 文件里面写了一个 filter,所以他会把这个请求交给我们的 Struts 2的 filter 去处理,交给这个 filter 去处理的时候,会调用它的 doFilter()方 法,在 doFilter()内部它是怎么处理的了,它也会参考一个文件,它参 考的这个文件叫做 struts.xml ,在它参考的过程当中了,首先第一 步 ,它会参考它的 namespace,这种画法了实际上是方法调用,这里 只是举例说明是什么意思,所以了不要太拘泥于这种画法,找到 了 namespace 还会找对应的 action,找到了对应的 action 之后了,还会 找对应的 result,当它终于找到了这个 result 的时候,它又会做什么 了?它会把这个请求 forward 给对应的 JSP 文件, 即我们的 /Hello.jsp 页面,当然这个 JSP 文件了就会把内容反馈给我们的客户端了。 客户端交给 Tomcat ,Tomcat 找到对应的 filter,这个 filter 会参 考一个文件叫做 struts.xml ,根据这个 xml 它会找到对应的结果,最 后把这个结果反馈给我们的客户端。 我们以前学过了设计模式,设计模式有一个特点,就是一定要把 简单的东西给复杂化,那么它为什么复杂化,它复杂化之后带来的好 处是什么?设计模式带来的好处最重要的就是可扩展性, 它能够扩展 了,能够灵活了。这个的好处也一样,它为什么要搞的这么麻烦了, 中间要经过一次中转,我的请求来了,中间要经过 filter 的中转,我 才能够拿到我请求之后的展现,也就是请求之后的结果,它的好处就 是,可以把我的请求,和我的最后的结果,也叫做视图,将其分开, 而不是像原来那样直接写死了。 分开的好处就是, 如果我要是想换成别的试图, 只需要在 strut.xml 配置文件里面配置一下,修改一下就可以,所以这样就会更灵活了, 这就是它的好处。所以 Struts 解决的问题是 ,把客户端的请求和展 现分开,就是解决的这个问题,你别管他是叫什么模式,叫 MVC , 不管它叫什么, 它其实最后处理的问题的本质就是 把你的请求 和你 最后的结果给分开,这就是 Struts 2 最核心的内容。
转自:网络大学|Network University:http://doie.net/?p=3097

 

Tags:

Struts2漏洞,

如果您喜欢我的博客,欢迎点击图片定订阅到邮箱填写您的邮件地址,订阅我们的精彩内容: 也可以点击链接【订阅到鲜果】

如果我的想法或工具帮助到了你,也可微信扫下方二维码打赏本人一杯咖啡
Struts2漏洞解析和利用方法 |