struts2文件上传步骤(struts2实现文件上传功能)

继3月6日struts2爆出漏洞S2-045后,今天又爆出一个漏洞。Struts2官方已经确认该漏洞(S2-046),并定级为高危漏洞。S2-046漏洞的报告者来自三家:qualcomm(高通)、dbappsecurity(杭州安恒)、HPE(惠普企业)。

Struts2的使用范围及其广泛,国内外均有大量厂商使用该框架。

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。

漏洞分析

使用Jakarta插件处理文件上传操作时可能导致远程代码执行漏洞。

struts2文件上传步骤(struts2实现文件上传功能)

使用恶意的Content-Disposition值或者使用不合适的Content-Length头就可能导致远程命令执行。该漏洞与S2-045(CVE-2017-5638)相似,但使用了不同的攻击向量。

触发漏洞需要满足的条件:

JakartaStreamMultipartRequest已开启。也就是说,Struts2需要通过Jakarta stream parser配置(非默认)。在Struts2配置文件中检查<constant name=”struts.multipart.parser” value=”jakarta-stream” />

上传的文件大小根据Content-Length头的声明要大于Struts2默认允许的2GB大小

文件名中包含OGNL payload

漏洞的危害

攻击者可通过修改HTTP请求头部中的Content-Length字段大于Struts2允许的最大值(2GB),并修改Content-Disposition中的filename字段构造恶意代码利用该漏洞,在受影响服务器上执行系统命令,进一步可完全控制该服务器,造成拒绝服务、数据泄露、网站遭篡改等影响。由于该漏洞利用所需组件默认启用,因此漏洞危害较为严重

漏洞检测

通过以下方式进行检测:

查看web目录下/WEB-INF/lib/目录下的struts2-core-x.x.x.jar文件,如果x代表的版本号在2.3.5到2.3.31以及2.5到2.5.10之间且未修改默认配置则存在漏洞。

解决方案

目前网上已经有人公开了漏洞POC,为了保护您的资产安全,请按照下面方法及时修复该漏洞。

S2-046PoC如下:

struts2文件上传步骤(struts2实现文件上传功能)

1. 严格过滤Content-Typefilename里的内容,严禁ognl表达式相关字段

2. 如果你正在使用基于Jakarta的文件上传Multipart解析器,请将Apache Struts升级到2.3.32或2.5.10.1。

3. 和先前的漏洞一样,也有相应的变通方案,即采用其他Mutipart解析器实施方案。Apache也提供2个插件作为解决方案(通过链接:
https://github.com/apache/struts-extras了解)——如果使用的是Apache Struts 2.3.8 – 2.5.5或者2.3.20 – 2.5.5版本,即可采用该解决方案。

4. 另外也可以从堆中移除File Upload Interceptor,定义自有堆并设为默认,该解决方案针对Struts2.5.8 – 2.5.10有效。

原创文章,作者:admin,如若转载,请注明出处:https://www.qq65hfghe5.com/tg/33722.html