cve-2017-5638
首页
文章
漏洞
SRC导航
内容精选
输入关键词搜索
APP 登录| 注册
【漏洞分析】S2-045 原理初步分析(CVE-2017-5638)
阅读量 52033 |
分享到: QQ空间 新浪微博 微信 QQ facebook twitter
发布时间:2017-03-07 17:25:47
http://p3.qhimg.com/t01ac754bb7df191543.png
作者:angelwhu
传送门:【重大漏洞预警】Struts 2 远程代码执行漏洞(CVE-2017-5638)(含PoC)
0x00 漏洞公告
请看https://cwiki.apache.org/confluence/display/WW/S2-045
这个漏洞应该后续会有官方详细分析。这里谈谈个人的理解,也分享下重现漏洞的思路。
首先,仔细阅读漏洞描述:
Problem
It is possible to perform a RCE attack with a malicious Content-Type value. If the Content-Type value isn't valid an exception is thrown which is then used to display an error message to a user.
描述中明确了两点:
通过Content-Type这个header头,注入OGNL语言,进而执行命令。
漏洞的点在于,由于Strus2对错误消息处理时,出现了纰漏。
0x01 关于Struts2上传机制
部分网上描述为:基于 Jakarta plugin插件。
这种描述是不对的,Struts2有其插件机制,如之前爆过S2-037漏洞的REST插件。但Struts2上传默认使用的是org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest类,对上传数据进行解析。不存在插件这个说法,只不过它最终调用了第三方组件common upload完成上传操作。
注:以下Struts2源码版本均是2.3.20。
具体可以看看源码流程,首先进入StrutsPrepareAndExecuteFilter类,这是Struts2默认配置的入口过滤器。在里面可以看到,Struts2首先对输入请求对象request的进行封装:
request = prepare.wrapRequest(request);
跟进这条语句,可以看到封装为StrutsRequestWrapper的过程:
if (request instanceof StrutsRequestWrapper) {
return request;
}
String content_type = request.getContentType();
if (content_type != null && content_type.contains("multipart/form-data")) {//判断是不是post表单
MultiPartRequest mpr = getMultiPartRequest();//默认返回JakartaMultiPartRequest类
LocaleProvider provider = getContainer().getInstance(LocaleProvider.class);
request = new MultiPartRequestWrapper(mpr, request, getSaveDir(), provider);
} else {
request = new StrutsRequestWrapper(request, disableRequestAttributeValueStackLookup);
}
return request;
上面我注释的两个地方便是关键。
multipart/form-data
网上流传的POC中有这么一部分:
#nike='multipart/form-data'
就是使content_type.contains("multipart/form-data")判断为true。 当然,完全可以在其他地方添加multipart/form-data这个字符串。
getMultiPartRequest()
这个方法可以继续追踪下去。通过配置struts.multipart.parser属性,可以指定不同的解析类,而默认的就是上面说的org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest类。
网上可以查阅得到这样的解释:
struts.multipart.parser:该属性指定处理multipart/form-data的MIME类型(文件上传)请求的框架,该属性支持cos、pell和jakarta等属性值,即分别对应使用cos的文件上传框架、pell上传及common-fileupload文件上传框架。该属性的默认值为jakarta。
更进一步的官方说明:https://cwiki.apache.org/confluence/display/WW/File+Upload#FileUpload-AlternateLibraries
0x02 漏洞补丁对比
漏洞分析必然要补丁对比了。查看struts2在git上的commit,发现描述为Uses default error key if specified key doesn't exist的修改:
2.5.10.1版本修改:
https://github.com/apache/struts/commit/b06dd50af2a3319dd896bf5c2f4972d2b772cf2b
http://p2.qhimg.com/t01c32e803b8526398a.jpg
2.3.32版本修改:
https://github.com/apache/struts/commit/352306493971e7d5a756d61780d57a76eb1f519a
http://p3.qhimg.com/t01b62d31ed4376429b.jpg
可以清晰的看到,都去掉了这样的一个方法:
LocalizedTextUtil.findText(......);
然后,就得到了第三个关键:
sink点
后面通过动态调试追踪可以发现:就是通过这个方法LocalizedTextUtil.findText,最终到达执行命令的地方。这里暂时可以看做是一个sink点。
当payload进入这里后,就可以通过OGNL执行命令了。同时,直观感觉功能是在处理error消息。
0x03 漏洞重现及调试分析
1. 简单重现
环境配置:
tomcat7
struts2.3.20
这里说一下,通过上面的原理分析。可以猜到,并不需要找个上传的地方。只需要模拟上传发包即可,危害巨大啊……
所以,我使用Struts2.3.20版本的struts2-blankwar包,直接测试漏洞:
http://p5.qhimg.com/t01eafc0a0b219de1d0.jpg
我用的POC,是之前版本的。单纯测试并验证我的想法:
Content-Type: haha~multipart/form-data %{#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,@java.lang.Runtime@getRuntime().exec('calc')};
得到的结论是:
直接在Content-Type注入OGNL语句,即可执行命令。当然,包含multipart/form-data字符串。
2. 调试分析
接下来就看看调试关键地方了,能够更进一步了解原理。通过上面补丁对比,以及对流程的掌握。在JakartaMultiPartRequest的parse和buildErrorMessage方法下断点:
http://p8.qhimg.com/t01aac8e93babc7a78a.jpg
可以看到,OGNL语句注入进去了。执行完上面的语句,就弹出计算器了。整个过程,有兴趣可以走一下。
0x04 总结
漏洞的原理就是:Struts2默认解析上传文件的Content-Type头,存在问题。在解析错误的情况下,会执行错误信息中的OGNL代码。
以上是个人分析,期待官方解析~ 研究原理很有趣~
传送门:【重大漏洞预警】Struts 2 远程代码执行漏洞(CVE-2017-5638)(含PoC)
本文转载自: Paper
如若转载,请注明出处: http://paper.seebug.org/241/
安全客 - 有思想的安全新媒体
安全知识
安全客 官方小编 分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
U2F安全协议分析
2018-11-24 10:00:48
二十年重回首——CIH病毒源码分析
2018-11-23 15:20:19
Cookie Maker:隐藏在Google Docs中的恶意网络
2018-11-23 14:30:40
情报分析与研判之图片信息挖掘(1)
2018-11-23 10:00:17
|发表评论
发表你的评论吧
昵称
土司观光团
换一个
|评论列表
还没有评论呢,快去抢个沙发吧~
安全客
有思想的安全新媒体
文章
1119
粉丝
47
TA的文章
微软11月补丁日回顾 | 在野与0day的纷纷扰扰
2018-11-14 11:04:48
乌镇大会现场发布年度领先科技成果 360安全大脑获评
2018-11-08 10:13:14
VirtualBox E1000 0day 虚拟机逃逸漏洞(全文已更新)
2018-11-07 10:48:21
假面马斯克在线发币 28个比特币花落谁家
2018-11-06 16:08:50
漏洞预警 | Gogs/Gitea 远程代码执行漏洞(CVE-2018-18925/6)
2018-11-05 17:32:17
输入关键字搜索内容
相关文章
360 | 数字货币钱包APP安全威胁概况
以太坊智能合约安全入门了解一下(下)
对恶意勒索软件Samsam多个变种的深入分析
360 | 数字货币钱包安全白皮书
Json Web Token历险记
揪出底层的幽灵:深挖寄生灵Ⅱ
简单五步教你如何绕过安全狗
热门推荐
安全客Logo
安全客
安全客
关于我们
加入我们
联系我们
用户协议
商务合作
合作内容
联系方式
友情链接
内容须知
投稿须知
转载须知
合作单位
安全客
安全客
Copyright © 360网络攻防实验室 All Rights Reserved 京ICP备08010314号-66
Loading...0daybank
文章评论