返回文章列表

SSRF與XXE漏洞攻擊與防禦

本文深入探討伺服器端請求偽造(SSRF)和XML外部實體(XXE)漏洞的攻擊手法與防禦策略。SSRF 允許攻擊者利用伺服器發起未授權的網路請求,竊取敏感資訊或控制內部系統。XXE 則利用 XML 解析器的漏洞,讓攻擊者讀取伺服器檔案或執行遠端請求。文章提供實際案例和程式碼範例,闡述如何利用 DNS

資安 Web 開發

SSRF 攻擊利用伺服器作為跳板,向內網或其他受限系統傳送請求,進而竊取資料、繞過防火牆限制或執行未授權操作。文中以 DNS 解析和 Webhook 為例,展示了攻擊者如何利用 SSRF 漏洞探測內部網路和服務。XXE 攻擊則針對 XML 解析器的缺陷,透過外部實體參照,攻擊者可以讀取伺服器上的敏感檔案,甚至執行任意程式碼。理解這兩種攻擊的原理和利用方式,對於構建安全的網路環境至關重要。

伺服器端請求偽造(Server-Side Request Forgery, SSRF)漏洞詳解

伺服器端請求偽造(SSRF)是一種安全漏洞,允許攻擊者利用伺服器執行未經授權的網路請求。SSRF漏洞的嚴重性取決於攻擊者能否利用該漏洞取得敏感資訊或對伺服器進行未授權的操作。

利用DNS解析測試內部網路

在一次針對大型科技公司的測試中,安全研究人員發現了一個SSRF漏洞。他透過使用dig命令並將Name server欄位設定為127.0.0.1(即localhost),嘗試測試伺服器的DNS解析功能。結果傳回了一個錯誤訊息“Server did not respond”,這表明伺服器嘗試連線到自己的53埠進行DNS查詢。

@startuml
title SSRF Attack via DNS Forgery

actor Attacker
participant "Vulnerable Web Server" as WebServer
participant "Internal DNS Resolver" as DNS

Attacker -> WebServer: Request with malicious payload\n(e.g., DNS lookup with NS=127.0.0.1)
activate WebServer

WebServer -> DNS: Perform DNS lookup as instructed
activate DNS

alt Port 53 is open on 127.0.0.1
    DNS -> WebServer: Tries to connect to 127.0.0.1:53
    note right of DNS: Connection might time out or fail
    WebServer --> Attacker: Returns a specific error or timeout message
else Port 53 is closed on 127.0.0.1
    DNS -> WebServer: Connection refused immediately
    WebServer --> Attacker: Returns a different, faster error message
end

deactivate DNS
deactivate WebServer

note over Attacker, WebServer: By analyzing the response time and error\nmessage, the attacker can infer the state\nof internal ports (port scanning).
@enduml

圖表剖析:

此圖示展示了攻擊者如何利用SSRF漏洞對伺服器進行DNS查詢的過程。攻擊者首先傳送一個DNS查詢請求,將Name server設定為127.0.0.1,促使伺服器自身進行DNS查詢。根據伺服器的回應,攻擊者可以判斷是否存在SSRF漏洞。

利用Webhook進行內部埠掃描

在另一個案例中,一位安全研究人員發現了一個允許使用者建立Webhook的網站。該網站允許使用者定義遠端伺服器的URL,當特定事件發生時,該網站會向該URL傳送請求。研究人員嘗試將URL設定為127.0.0.1,以測試伺服器是否會與自身進行通訊。

import requests

def test_ssrf(url):
 # 測試SSRF漏洞
 payload = "http://127.0.0.1:22"
 response = requests.get(url, params={"url": payload})
 if "Could not retrieve all headers" in response.text:
 print("可能存在SSRF漏洞")
 else:
 print("未發現SSRF漏洞")

# 使用範例
test_ssrf("https://example.com/webhook")

內容解密:

此程式碼定義了一個名為test_ssrf的函式,用於測試目標網站是否存在SSRF漏洞。函式透過向目標URL傳送一個帶有內部IP位址和埠號的請求,檢查伺服器的回應是否包含特定的錯誤訊息,以此來判斷是否存在SSRF漏洞。

XML外部實體(XXE)漏洞解析

XML外部實體(XXE)漏洞是一種安全威脅,攻擊者可以利用應用程式解析XML的方式進行攻擊。這種漏洞主要利用了應用程式處理輸入中外部實體的機制。利用XXE,攻擊者可以從伺服器提取資訊或呼叫惡意伺服器。

XML基礎

XML是一種元語言,用於描述其他語言。它被開發出來以解決HTML的侷限性,HTML只能定義資料如何顯示,而XML定義了資料的結構。

XML與HTML的區別

HTML具有預定義的標籤,如<h1>用於標題,<table>用於表格資料,<p>用於段落文字。相比之下,XML沒有預定義的標籤;相反,標籤由作者定義,這些定義不一定包含在XML檔案中。

檔案型別定義(DTD)

由於XML的標籤可以由作者自定義,一個有效的XML檔案必須遵循一系列通用的XML規則,並匹配一個檔案型別定義(DTD)。DTD是一組宣告,定義了XML檔案中可以包含哪些元素,這些元素可以具有哪些屬性,以及哪些元素可以巢狀在其他元素中。

XML實體

XML檔案包含XML實體,實體類別似於資訊的佔位符。使用實體,可以在解析XML檔案時動態地插入值。

XXE漏洞的利用

攻擊者可以透過建構惡意的XML輸入,利用XXE漏洞來讀取伺服器上的檔案或發起對內部系統的請求。

防禦XXE漏洞

為了防禦XXE漏洞,可以採取以下措施:

  1. 停用外部實體:組態XML解析器以停用外部實體。
  2. 使用安全的XML解析函式庫:選擇那些預設停用外部實體或提供細粒度控制的XML解析函式庫。
  3. 輸入驗證:對使用者輸入的XML資料進行嚴格的驗證和過濾。
  4. 限制檔案存取許可權:確保伺服器上的敏感檔案對解析XML的服務不可讀。

程式碼示例:安全的XML解析

import xml.etree.ElementTree as ET
from defusedxml.ElementTree import fromstring

def safe_parse_xml(xml_content):
 try:
 # 使用defusedxml防止XXE攻擊
 root = fromstring(xml_content)
 # 處理XML內容
 except ET.ParseError as e:
 print(f"解析XML時出錯: {e}")

# 示例XML內容
xml_content = """
<root>
 <data>示例資料</data>
</root>
"""

safe_parse_xml(xml_content)

內容解密:

此程式碼示例展示瞭如何使用Python的defusedxml函式庫來安全地解析XML內容。defusedxml函式庫透過停用外部實體來防止XXE攻擊。

XML外部實體(XXE)攻擊深入解析

XML外部實體(XXE)攻擊是一種利用XML解析器漏洞的攻擊方式,攻擊者可以透過建構惡意的XML輸入來讀取伺服器上的敏感檔案、執行遠端請求等操作。

XXE攻擊的工作原理

在XXE攻擊中,攻擊者利用目標應用程式對XML輸入處理的不嚴格驗證,透過包含外部實體來執行惡意操作。

實際案例分析

Google的XXE漏洞

2014年4月,Detectify團隊發現了Google的一個XXE漏洞。該漏洞存在於Google的Toolbar按鈕函式庫中,允許開發者上傳XML檔案定義自定義按鈕。

Facebook的XXE漏洞

2014年4月,Mohamed Ramadan發現了Facebook的一個XXE漏洞。該漏洞存在於Facebook的求職頁面,允許使用者上傳.docx檔案。

防護措施

為了防範XXE攻擊,開發者應該採取以下措施:

  1. 停用外部實體:在XML解析器中停用外部實體的解析。
  2. 驗證XML輸入:對使用者上傳的XML檔案進行嚴格驗證。
  3. 使用安全的XML解析器:選擇支援停用外部實體和安全解析XML的解析器。
@startuml
title XXE Protection Flowchart

start
:Receive XML Input;
if (Is external entity processing disabled in parser?) then (yes)
  :Parse XML safely;
else (no)
  :Disable external entities in parser configuration;
  :Parse XML safely;
endif
stop

@enduml

圖表剖析:

此圖示展示了防範XXE攻擊的流程。首先,系統檢查XML輸入的合法性。如果輸入合法,則進一步檢查是否存在外部實體。如果存在外部實體,則停用外部實體解析,以防止XXE攻擊。

詳細防範措施

停用外部實體

在XML解析器中停用外部實體是防範XXE攻擊的最有效方法之一。

import xml.etree.ElementTree as ET

# 停用外部實體
ET.register_namespace("", "http://www.w3.org/2001/XMLSchema-instance")
parser = ET.XMLParser()
parser.entity = {}

try:
 tree = ET.parse('example.xml', parser)
except ET.ParseError as e:
 print(f"XML解析錯誤: {e}")

內容解密:

此程式碼展示瞭如何在Python的xml.etree.ElementTree模組中停用外部實體。

驗證XML輸入

對使用者上傳的XML檔案進行嚴格驗證是防範XXE攻擊的另一種有效方法。

from lxml import etree

# 載入XML Schema
with open('schema.xsd', 'r') as f:
 schema_doc = etree.parse(f)
schema = etree.XMLSchema(schema_doc)

# 驗證XML檔案
try:
 with open('example.xml', 'r') as f:
 doc = etree.parse(f)
 schema.assertValid(doc)
except etree.DocumentInvalid as e:
 print(f"XML驗證失敗: {e}")

內容解密:

此程式碼展示瞭如何使用lxml模組驗證XML檔案。

安全的XML解析器

選擇支援停用外部實體和安全解析XML的解析器是防範XXE攻擊的關鍵。

隨著網路攻擊日益複雜,SSRF和XXE漏洞已成為企業安全防禦的重大挑戰。深入剖析這兩種攻擊的核心原理及利用方式,可以發現它們都利用了伺服器端對使用者輸入的信任,進而操控伺服器發起未經授權的請求或讀取敏感資料。多維比較分析顯示,SSRF攻擊的影響範圍更廣,可涵蓋內網掃描、資訊洩露甚至遠端程式碼執行;而XXE攻擊則更側重於利用XML解析器的漏洞,竊取敏感資料或執行惡意程式碼。技術限制深析指出,完全杜絕這兩類別漏洞的產生相當困難,因為它們往往源於系統架構設計的缺陷或開發人員的安全意識不足。

技術演進預測顯示,未來針對SSRF和XXE的攻擊手法將更加隱蔽和複雜,例如利用更精巧的Payload繞過安全防禦機制,或結合其他漏洞發起更具破壞性的攻擊。融合趨勢洞察指出,隨著雲原生技術和微服務架構的普及,SSRF和XXE攻擊的風險將進一步加大,因為攻擊面將更加分散且難以掌控。

玄貓認為,企業應採取多層次防禦策略,包括嚴格的輸入驗證、安全的XML解析器組態、Web應用防火牆(WAF)的佈署以及持續的安全教育訓練,才能有效降低這兩類別漏洞帶來的風險。對於重視長期安全性的企業,建立完善的安全開發流程並定期進行漏洞掃描和滲透測試至關重要。