struts2-045漏洞poc调试
来源:互联网 发布:淘宝刷销量多少钱 编辑:程序博客网 时间:2024/05/17 09:09
漏洞概述:struts2默认的上传插件Jakarta Multipart parser的文件上传模块在处理文件上传含(multipart/form-data)的请求时候对异常信息做了捕获,并对异常信息做了OGNL表达式处理。但在在判断Content-Type不正确的时候会抛出异常并且带上Content-Type属性值,可通过构造附带OGNL表达式的URL导致远程代码执行。
漏洞场景:
配置了struts2拦截:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts.dispatcher.ng.filter.strutsPrepareAndExecuteFilter
</filter-class>
</filter>
拦截目录配置的示例:
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
调试分析:
查看struts2在Github上的补丁:
可以看到,补丁版本struts2.3.32去掉了LocalizedTextUtil.findTextUtil方法。直观感觉是错误处理的时候出的问题。
编写poc的思路应该是先进入Jakarta上传插件处理的类。这个好办,构造一个上传即可。还得想办法通过Content-Type控制传入findTextUtil的参数,看起来错误信息“e”非常可疑。
使用poc调试:
在struts2入口类StrutsPrepareAndExecuteFilter处打断点,开启debug,构造请求。
首先对request进行封装:request =prepare.wrapRequest(request);
跟进去,发现了此处只是简单的用contains()来检查content-type的类型。
if(content_type!=null&& content_type.contains("multipart/form-data")){
MultiPartRequest mpr =getMultiPartRequest();//默认使用Jakarta
LocaleProvider provider = getContainer().getInstance(LocaleProvider.class);
request =newMultiPartRequestWrapper(mpr, request, getSaveDir(), provider, disableRequestAttributeValueStackLookup);//进入此函数
}else{
request =new StrutsRequestWrapper(request, disableRequestAttributeValueStackLookup);
}
跟进到
MultiPartRequestWrapper()里的multi.parse()方法,此处开始解析上传参数。明显参数不能解析,顺利的捕获到异常,执行
buildErrorMessage(e,new Object[]{})。此函数最终调用了
LocalizedTextUtil.findText()方法来对错误进行国际化处理。注意到此时参数e.getMessage中包含了OGNL表达式
而findText方法是这么写的
Anything within <code>${...}</code>
will be treated as an OGNL expression and evaluated as such.(任何形如${code}的都会被当成OGNL表达式来执行),
故触发漏洞。
危害: Poc执行成功即可拿到web服务器的权限:如果用root启动的tomcat,那么服务器直接沦陷;如果是低权限账户启动的tomcat,后面结合本地提权,或者盗取配置文件,获取数据,或者上传后门,方便后续继续渗透。
Apache官网声明:
https://struts.apache.org/docs/s2-045.html
参考文章:
http://paper.seebug.org/241/?from=timeline&isappinstalled=0
https://my.oschina.net/u/157224/blog/854364
github修改:
https://github.com/apache/struts/commit/352306493971e7d5a756d61780d57a76eb1f519a
https://github.com/apache/struts/commit/b06dd50af2a3319dd896bf5c2f4972d2b772cf2b
- struts2-045漏洞poc调试
- struts2 s2-045漏洞利用poc
- Android重大漏洞POC
- Openssl 漏洞POC学习
- Openssl 漏洞POC学习
- 使用Docker搭建Struts2-048漏洞环境及Python PoC验证
- Apache Struts2 POC & EXP
- struts2 S2-045漏洞
- Apache Struts 2 S2-045 高危漏洞利用工具poc+Exp
- PHP 5.3.6缓冲区溢出漏洞POC
- 缓冲区溢出漏洞的poc代码ruby
- 【网络安全】Bash漏洞原理POC及ShellCode
- OpenSSL 漏洞利用程序脚本 POC
- 漏洞应急响应之批量poc验证
- BlueBorne 蓝牙漏洞深入分析与PoC
- 【漏洞分析】OpenSSL HeartBleed漏洞分析及POC代码
- 【漏洞分析】Heartbleed 2014-0160漏洞Poc及规则分析
- OpenSSL重大漏洞-Heartbleed之漏洞利用脚本POC讲解
- 1041. 考试座位号(15) PAT
- 使用OpenCV FeatureDetector报错的问题
- 导入google的patch的一般方法
- Nodejs基础:stream模块入门介绍与使用
- Ubuntu安装MariaDB
- struts2-045漏洞poc调试
- Tensorflow White Paper(二)
- HTML5的页面资源预加载技术(Link prefetch)加速页面加载
- tomcat使用spring-loaded实现应用热部署
- 一个程序员的自白:我为什么写博客
- 2-Python字符串和列表
- 关于SE54视图簇的创建和维护
- 欢迎使用CSDN-markdown编辑器
- 25款实用的桌面版博客编辑器