深度分析Struts 2 任意文件上传漏洞 CVE-2023-50164

💡 原文中文,约2600字,阅读约需7分钟。
📝

内容提要

该文章介绍了一个文件上传的逻辑漏洞,可以通过Struts 2来实现上传action。文章提供了环境搭建和代码示例。漏洞影响范围为Struts 2.0.0-2.3.37、Struts 2.5.0-2.5.32和Struts 6.0.0-6.3.0。

🔎

延伸解读

漏洞影响范围与版本确认

文章明确指出该漏洞影响 Struts 2.0.0-2.3.37、2.5.0-2.5.32 和 6.0.0-6.3.0 版本。这意味着使用这些版本且实现了文件上传 Action 的应用需重点排查。若应用未部署 Filter 或 WAF 等防护措施,被利用的风险会显著增加。建议读者先确认自身项目所用 Struts 2 版本是否在受影响区间内。

环境搭建的常见陷阱

文章提到,若按网上不完整的教程搭建环境,容易遇到很多问题。例如直接下载 6.3.0 的 Struts 2 包并在 showcase 项目中修改,对不熟悉框架的人并不友好。作者建议不熟悉的读者采用第二种方式:新建 Maven 项目并逐步配置。这提示复现漏洞时,选择适合自己熟悉度的搭建路径能减少不必要的调试成本。

上传 Action 的关键代码逻辑

示例中的 Upload 类继承 ActionSupport,包含 upload、uploadFileName 和 uploadContentType 三个属性。execute 方法将上传文件复制到 user.dir 下的 uploads 目录,并返回成功消息。这段代码未对文件名或类型做任何过滤,直接使用原始文件名保存,正是漏洞可被利用的典型场景。读者可借此理解漏洞成因,但切勿在未授权环境测试。

配置步骤与潜在报错

文章列出了完成文件上传功能所需的四个改动点:编写 Action、在 struts-fileupload.xml 中添加 result 对应的 JSP、创建 DemoUpload.jsp 前端页面,以及在 web.xml 中注册配置。作者特别指出,在 web.xml 上改动时可能会报错,且未给出具体解决方法。这意味着复现过程中可能遇到配置问题,需要读者结合框架文档自行排查。

❓

Q&A

CVE-2023-50164 影响哪些 Struts 2 版本?

影响范围包括 Struts 2.0.0-2.3.37、Struts 2.5.0-2.5.32 和 Struts 6.0.0-6.3.0。

Struts 2 任意文件上传漏洞的利用条件是什么?

需要使用 Struts 2 实现上传 action,并且上传方法没有添加任何 Filter 过滤或 WAF 防护,这样才可能被利用。

如何搭建 Struts 2 文件上传漏洞的测试环境?

建议下载 Struts 6.3.0 版本包,在 showcase 项目中进行修改;或者创建一个 Maven 项目,逐步配置 webapp 目录、struts 配置文件、上传 Action 代码以及 web.xml 注册,完成文件上传功能。

FileUploadAction 示例代码中如何处理文件上传?

示例代码中 Upload 类继承 ActionSupport,包含 upload、uploadFileName、uploadContentType 属性。execute 方法中,如果 uploadFileName 不为空,则指定上传目录为当前用户目录下的 uploads 文件夹,创建目标文件,使用 FileUtils.copyFile 复制上传文件,并添加成功消息返回 SUCCESS;否则返回 INPUT。

配置 Struts 2 文件上传功能需要修改哪些文件?

需要修改四个地方:1. 编写 FileUploadAction 类;2. 在 /resource/struts-fileupload.xml 中添加 action 对应的 jsp 界面代码;3. 在 webapp/WEB-INF/fileupload/DemoUpload.jsp 中写入前端访问代码;4. 在 web.xml 中注册配置。

这个漏洞可能导致什么后果?

这是一个文件上传的逻辑漏洞,可能导致文件上传后获取 shell,造成远程代码执行。

🏷️

标签

➡️

继续阅读