简析struts2漏洞CVE-2017-5638,S02-45 (形成原理,解决方法)
2017-03-21 13:11
337 查看
简单说一下Struts2基于“commons-fileupload”组件实现文件上传的漏洞,漏洞编号CVE-2017-5638,S02-45.
1. 漏洞重现:
通过发包模拟器或其它你能修改请求头Content-Type字段的客户端,可以把 Content-Type 修改成诸如haha~multipart/form-data %{#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,@java.lang.Runtime@getRuntime().exec('calc')}; 的形式。
自己搭个web服务器,MVC框架使用struts2 (使用有问题的版本),实现一个文件上传的功能。
然后发包模拟器发包,结果发现在服务端电脑上弹出一个计算器的程序,谁让你动我电脑上的东西了吗?但就是动了,流氓会武术谁也档不住~~ OMG!!!
2. 漏洞形成原理:
由于请求对象的头字段Content-Type内容是非法的,不符合格式的,所以上传肯定是会出错的,commons-fileupload组件的ServletFileUpload#parseRequest(RequestContext)方法会抛出异常,其中异常信息就包含ognl格式的字符串%{#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,@java.lang.Runtime@getRuntime().exec('calc')};
重点来了,struts2会对异常信息执行国际化的功能,它会使用ognl去解析这个符合ognl语法格式的字符串,然后就悲剧了,成功弹出一个计算器。
3. 漏洞解决方法
a. 使用官方补丁.
b. 对于懒得替换struts2版本的朋友,可以自己在StrutsPrepareAndExecuteFilter过滤器前增加一个过滤器,如果发现Content-Type有非法字符,就不再调用struts2的过滤器就行.
补充一句,为什么不能使用struts2拦截器来过滤这种请求呢,因为漏洞执行的时候还没到strus2的拦截器,在StrutsPrepareAndExecuteFilter类的doFilter方法中,
request = prepare.wrapRequest(request);
包装请求对象的时候漏洞就执行了,也就是说如果是文件上传请求,在包装请求对象的时候文件就已被保存到服务器了。
1. 漏洞重现:
通过发包模拟器或其它你能修改请求头Content-Type字段的客户端,可以把 Content-Type 修改成诸如haha~multipart/form-data %{#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,@java.lang.Runtime@getRuntime().exec('calc')}; 的形式。
自己搭个web服务器,MVC框架使用struts2 (使用有问题的版本),实现一个文件上传的功能。
然后发包模拟器发包,结果发现在服务端电脑上弹出一个计算器的程序,谁让你动我电脑上的东西了吗?但就是动了,流氓会武术谁也档不住~~ OMG!!!
2. 漏洞形成原理:
由于请求对象的头字段Content-Type内容是非法的,不符合格式的,所以上传肯定是会出错的,commons-fileupload组件的ServletFileUpload#parseRequest(RequestContext)方法会抛出异常,其中异常信息就包含ognl格式的字符串%{#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,@java.lang.Runtime@getRuntime().exec('calc')};
重点来了,struts2会对异常信息执行国际化的功能,它会使用ognl去解析这个符合ognl语法格式的字符串,然后就悲剧了,成功弹出一个计算器。
3. 漏洞解决方法
a. 使用官方补丁.
b. 对于懒得替换struts2版本的朋友,可以自己在StrutsPrepareAndExecuteFilter过滤器前增加一个过滤器,如果发现Content-Type有非法字符,就不再调用struts2的过滤器就行.
补充一句,为什么不能使用struts2拦截器来过滤这种请求呢,因为漏洞执行的时候还没到strus2的拦截器,在StrutsPrepareAndExecuteFilter类的doFilter方法中,
request = prepare.wrapRequest(request);
包装请求对象的时候漏洞就执行了,也就是说如果是文件上传请求,在包装请求对象的时候文件就已被保存到服务器了。
相关文章推荐
- 简析struts2漏洞CVE-2017-5638,S02-45 (形成原理,解决方法)
- Struts2 漏洞编号为CVE-2017-5638 临时 解决方法
- [附POC]Apache Struts2最新(CVE-2017-5638,S02-45)POC
- struts2漏洞原理及解决的方法
- Nginx range filter模块数字错误漏洞(CVE-2017-7529)解决方法
- Tomcat中文乱码问题的原理和解决方法
- ARP***原理及解决方法与CMD命令分类
- ARP攻击原理及解决方法
- Servlet + Tomcat 中文乱码的原理和解决方法
- heap space 和 permgen space 溢出的简单解决方法和原理笔记
- Tomcat中文乱码问题的原理和解决方法
- UI thread client callback和UI thread WCF Service一起工作时死锁的形成原因及解决方法
- Tomcat中文乱码问题的原理和解决方法
- Tomcat中文乱码问题的原理和解决方法
- ARP攻击原理及解决方法
- 物理方法解决数学问题(三):神奇的Fermat原理
- 拒绝服务***原理及解决方法详解
- ARP攻击的原理与解决方法
- Tomcat中文乱码问题的原理和解决方法
- 数据库日志文件太大的解决方法及原理