S2-019、S2-020_weixin_30564901的博客-程序员宅基地

技术标签: python  java  web.xml  

前言

    “Struts2系列起始篇”是我整各系列的核心,希望大家能花些时间先看看。

正文

    我发现关于一些早期的Struts2的漏洞,网上的分析文章并不多,不知道是不是我打开浏览器的方式不对,唯一看到的两篇文章也仅有poc,没有细节分析。于是我在官方上看了下漏洞详情,如下:

 

    大概意思是动态方法调用开启了会导致安全问题,给出的信息太少了,于是我又看了下网上的poc(我做了一点修改):

http://127.0.0.1:8080/struts2-showcase-2.1.6/showcase.action?debug=command&expression=%23p%3d%23context.get(%27com.opensymphony.xwork2.dispatcher.HttpServletResponse%27).getWriter()%2c%23p.println(%22hacker%22)%2c%23p.close()

    老实说根据这个poc我还是什么都看不出来(并且公告中说和动态方法调用有关,但是这里并没有用到类似xxx.action!method啊),但运行它确实能执行代码,没办法我只好一步步调试了。由于过程有点坎坷,这里就只说下我自己的思路吧,我先是在StrutsPrepareFilter的doFilter方法中下断点(当然也有可能是StrutsPrepareAndExecuteFilter,看大家在web.xml中是怎么配置的了,详细情况参考系列文章的第一篇),然后就是一步步往下走了:

 

    关于这段代码DefaultActionInvocation.invoke(),在第一篇文章中介绍过了,在执行action之前会先循环调用Struts2的默认拦截器栈。说明Ognl表达式是在某个自带的拦截器中执行的,看下此时的变量栈,发现此时的拦截器是DebuggingInterceptor(实际上我测试的时候是根据poc后带的参数猜出来了,哈哈哈嗝~),进入DebuggingInterceptor.intercept方法中:

方法看起来很长,但实际上流程很简单,首先判断“org.apache.struts2.interceptor.debugging.DebuggingInterceptor.devMode”这个常量是否被设置为true了,如果是true说明项目开启了开发者模式(此漏洞的鸡肋之处),DebuggingInterceptor才会工作,进入if语句中,162行处获取请求中的“debug”参数,随后根据“debug”参数的值进入不同的分支中。总共有四个分支,但是很明显后面两个分支中调用了OgnlValueStack.findValue方法,熟悉Struts2的同学都知道该方法中会执行ognl表达式(第二篇文章中在分析S2-016时跟进过这个函数),而findValue方法的参数也是直接使用的请求中的另一个参数。这样构造poc起来也很简单(另外表达式也要url编码下):

?debug=command&expression=exp

?debug=browser&object=exp

    到这里就S2-019就分析完了,问题是官网上说和动态方法调用有关,为什么我在struts.xml中配置了<constant name="struts.enable.DynamicMethodInvocation" value="false"/>,但是还是可以RCE啊,且分析过程中并没涉及动态方法调用~~~ 

S2-20

    我不准备详细分析这个漏洞了,主要是因为漏洞较难利用起来,不过我觉得思路有独特之处,所以还是要介绍下。漏洞出现的地方是Struts2的另一个默认拦截器ParametersInterceptor,该拦截器其主要功能是把ActionContext中的请求参数设置到ValueStack中,看下他的代码:

跟进setParameters方法中:

 

    先对请求参数名做判断是否合法,合法才会加入到acceptableParameters中,循环acceptableParameters中的实体,调用OgnlValueStack.setValue,我调试的时候最先想到的就是Ognl表达式注入,但是失败了原因一言难尽~

    看下acceptableName方法,该方法就是为了防范一些安全问题:

    isExcluded用于将参数名和配置文件中的一些特殊参数进行对比,禁止访问一些特殊参数,不过从下图可以看到,配置文件中的正则一直在修改,因为经常被绕过,S2-20之后就禁用了class开头的参数。。。

 

    isAccepted方法也是做正则,防止ognl表达式注入,使用的正则如下图:

 

禁用了一些特殊字符,我尝试FUZZ了一下,都没成功,不过这里我说下我测试的结果吧。

禁用逗号是防止执行多条语句,例如我们之前使用的poc中

new java.lang.ProcessBuilder(new java.lang.String[]{'cmd.exe', '/c','calc'})).start()  但是我们使用

new java.lang.ProcessBuilder(new java.lang.String[]{'calc'})).start() 还是可以弹出计算机的

至于#,rce的poc中不使用#也是可以的,如下图(以S2-019为例)

 

    冒号不让用我不知道是为什么,还有等号,大家可以看上面我并没有使用等号,而是用的“-”,实际上我fuzz了一下,逗号、点号、减号还有加号在这里有时候也可以,为什么是有时候呢,因为感觉像六脉神功似的,时灵时不灵。但大多数时候都能成功,也有可能是tomcat缓存的原因?大家感兴趣可以自己尝试下,希望不要误导大家,最后我觉得使用“ ?a%2d(new+java.lang.ProcessBuilder(new+java.lang.String%5b%5d%7b%27calc%27%7d)).start()=xxx”应该能成功,然而并不行。

 

    算了不浪费大家的时间了,这里直接说别人的利用方法吧。这是百度src的一位师傅写的文章(https://www.freebuf.com/articles/web/31039.html)。写的很清楚,大概意思是可以通过class.xx这种方式遍历属性,通过修改web容器的日志文件的路径和文件名,写入一句话木马。细节上文章中写的很清楚了,我就不赘述了。

 

修复方法   

     针对S2-20,Struts2在isExcluded方法中过滤了class关键字。

参考文章:

https://www.freebuf.com/articles/web/31039.html

https://cwiki.apache.org/confluence/display/WW/Security+Bulletins

转载于:https://www.cnblogs.com/jinqi520/p/10814738.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30564901/article/details/96390779

智能推荐

session.put() 和 session.setAttribute()_yuliangliang092的博客-程序员宅基地

session.put()是一个map集合session.setAttribute()是一个HttpServlet请求两个是不一样的如果你用到框架,struts2什么的,用session.put()最好,这个可以脱离web进行测试是通过模拟来实现的,非常好如果你就用jsp什么的,用第二个最好,简单,在web中测试也简单,因为不要其它的jar包嘛如果你用了struts2框架,那么这个session已

easyui-textbox设置背景色的问题_素剑步青尘的博客-程序员宅基地

今天项目中有一个地方需要设置背景色,但是查了好多资料,都没有,easyui官网就是一个坑,很多东西都没有,最后查看easyui源码发现了这么addClass,然后就在easyui源码中添加了这么一段源代码,使用方法同setText,setValue这些,好,下面是改造后的代码,非常简单就几行,项目中引用一下就可以了,支持自定义class,如果不传的话,默认的是我自己在easyui.css里面添加的

ARM汇编中^、!、cxsf符号和movs等指令使用_arm汇编 movs_wyt357359的博客-程序员宅基地

转载来自 http://www.sohu.com/a/74272814_119709.macro restore_user_regsldr r1,[sp, #S_PSR]ldr lr,[sp, #S_PC]! @ !用来控制基址变址寻址的最终新地址是否进行回写操作,@ 执行ldr之后sp被回写成sp+#S_PC基址变址寻址的新地址msrspsr,r1 @ 把cpsr的值保存到s...

JSP,Servlet,JSF 的区别_taxueguilai1992的博客-程序员宅基地

1.JSPJSP(JavaServer Pages) 是一种java视图技术,它运行在服务器上,允许我们写入模版文本(例如:客户端语言:HTML,CSS,JavaScript等)。JSP支持taglibs,通过java代码片可以控制页面流和动态输出。其中一个大家熟知的taglib 是JSTL.JSP也支持解释语言(它能够用来访问后端数据,通过在page,request,application sco

python3使用saml2.0协议接入SSO_集成saml的web应用 python_yangjiajia123456的博客-程序员宅基地

SAML(Security Assertion Markup Language)是一个 XML 框架,也就是一组协议,可以用来传输安全声明。比如,两台远程机器之间要通讯,为了保证安全,我们可以采用加密等措施,也可以采用 SAML 来传输,传输的数据以 XML 形式,符合 SAML 规范,这样我们就可以不要求两台机器采用什么样的系统,只要求能理解 SAML 规范即可。其核心是: IDP和SP通过...

随便推点

待看_. . . . .的博客-程序员宅基地

五分钟看懂Performance性能监控工具统计网页标签元素,使用次数,排序,递归骚操

周学习报告2019/5/17_yixi_mo_bingshu的博客-程序员宅基地

最近一段时间写了几个静态的网页,打算暑假学习一下做高级一些的网页。&lt;!doctype html&gt;&lt;html&gt;&lt;head&gt; &lt;meta charset="utf-8"&gt;&lt;title&gt;个性&lt;/title&gt; &lt;style&gt; &lt;/style&gt; &lt;style type="text/c...

vs2005.net web应用程发布问题及解决方法_sxf_zero的博客-程序员宅基地

最近用vs2005写asp.net程序,发布时遇到很多麻烦,觉得和vs2003有很多的不同,以前还一直抱怨Boland 的 Delphi 2005难用,满口称赞vs2005呢,现在觉得vs2005也有很多不尽人意的地方。早知道当初还选择dotnet1.1了,现在用vs2005+dotnet2.0,发布时真是多花了好多力气,且听一一道来。       首先,一开始我还以为vs2005和v

SOTA排行榜大变天!MIT研究十个CV测试集,平均错误率超3.4%_3D视觉工坊的博客-程序员宅基地

编辑:LRS转载自:新智元如果测试集不靠谱,那测出来的模型性能会靠谱吗?MIT研究了10个流行的CV的数据集,平均测试集的错误率超过3.4%,最多的竟然错误超10%。「clean code...

功能材料与计算机,功能材料结构与性能若干问题的计算机模拟研究_胡佳恒的博客-程序员宅基地

摘要:与计算机技术相结合的计算材料和材料设计是现代材料科学研究的重要方面,本论文应用计算机模拟方法对功能材料的结构和性能等若干问题进行了研究,具体包括以下三个内容:运用第一性原理的方法研究了锂离子电池正极材料的电子结构,导电性能以及它们之间的关系;运用分子动力学方法研究了嵌入轻质小原子或者分子层状石墨体系的热学行为;运用第一性原理的方法研究了单分子科学领域内人工控制化学键的形成及其特性. 一.能源...

vue中eslint语法验证规则修改与关闭_vue关闭rules校验_alsoAm的博客-程序员宅基地

 在vscode中编写vue程序,对于语法什么的还是需要插件来帮助初学者养成良好的变成规范。eslint加上prettier确实是很棒的插件。但是在编码的过程中,总会有一些烦人的验证,但在开发中其实并没有什么太大的影响,所以我们可以根据自己的需要对规则进行一下设置或者取消。我们只需要修改打开根目录下的eslintrc.js在rules下添加相应的规则就好 'semi': 0...

推荐文章

热门文章

相关标签