Don’t Be an Accessory#

惡意行為者在網際網路上有許多藏身之處。駭客經常冒充他人身份並利用被入侵的伺服器來規避偵測。即使你的網站不是攻擊目標,你的系統仍可能在無意中幫助攻擊者進行惡意行為。

如果駭客利用你的系統作為攻擊跳板,你的網域和 IP 位址將很快被關鍵服務列入黑名單,甚至可能被託管服務商中斷服務。

本章涵蓋幾種可能讓你成為「共犯」的漏洞:email spoofing(電子郵件偽冒)、open redirects(開放式重導向)、clickjacking(點擊劫持)、server-side request forgery(伺服器端請求偽造),以及 botnets(殭屍網路)。

電子郵件詐騙(Email Fraud)#

電子郵件透過 Simple Mail Transfer Protocol (SMTP) 傳送。SMTP 設計上的一個重大疏忽是缺乏身份驗證機制——寄件者可以在 From 標頭中附上任意電子郵件地址。

Spam 與 Phishing#

  • 估計約有一半的電子郵件是垃圾郵件,每天近 150 億封
  • Spam(垃圾郵件)包含不需要的行銷內容
  • Phishing(釣魚郵件)企圖騙取密碼或信用卡等敏感資訊
  • 常見手法是發送看似密碼重設的郵件,連結指向 doppelganger domain(外觀相似的偽冒網域)
  • Spearphishing(魚叉式釣魚)針對特定對象量身打造,攻擊者會事先研究受害者
  • CEO fraud(高管詐騙)冒充高管要求員工進行電匯,2016 至 2019 年間造成超過 260 億美元損失

實作 Sender Policy Framework (SPF)#

SPF 透過在 DNS 的 .txt 記錄中列出授權發送郵件的 IP 位址白名單來驗證寄件者身份:

v=spf1 ip4:192.0.2.0/24 ip4:198.51.100.123 a -all
  • v= 定義 SPF 版本
  • ip4a 指定允許發送郵件的 IP 位址和網域
  • -all 告知郵件提供者,不符合條件的郵件應被拒絕

實作 DomainKeys Identified Mail (DKIM)#

DKIM 使用公鑰加密為外寄郵件產生數位簽章:

  • 使用 private key 簽署外寄郵件
  • 將 public key 託管在 DNS 中
  • 收件方郵件伺服器重新計算簽章並與附帶的簽章比對
  • 如果不匹配,郵件會被拒絕
k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDmzRmJRQxLEuyYiyMg4suA

實務步驟#

你的組織可能從多個來源發送郵件:網站的 transactional email(交易郵件)、webmail 服務、郵件伺服器軟體、email marketing 服務等。查閱各服務提供者的文件,了解如何產生並新增 SPF 和 DKIM 所需的 DNS 記錄。許多交易郵件和行銷服務在你註冊時就會要求設定相關 DNS 記錄。

垃圾郵件過濾演算法會檢查郵件中的連結,並維護已知有害網域的黑名單。詐騙者因此不斷發明新手法來偽裝有害連結。

Open Redirects#

Open redirect 發生在網站允許透過 URL 參數將使用者重導向到任意外部網址時。常見場景是登入頁面將目標 URL 編碼在查詢參數中:

  • 如果第二次重導向可以將使用者導向任何網站,就形成了 open redirect
  • 駭客可利用你的網域來偽裝惡意連結,就像使用 URL 縮短服務一樣
  • 這不僅讓使用者面臨釣魚風險,你的正常郵件也可能被垃圾郵件偵測演算法列入黑名單

防範 Open Redirects#

  • 確保編碼在 URL 中的重導向目標使用 relative URL(相對路徑)而非 absolute URL
  • 使用正則表達式驗證 URL 格式:
import re
def is_relative(url):
    return re.match(r"^\/[^\/\\]", url)
  • 防範 //www.google.com 這類偽裝成相對路徑的絕對 URL
  • 另一種方法是將重導向 URL 存儲在 temporary cookie 中而非查詢參數,因為攻擊者無法輕易偽造受害者瀏覽器中的 cookie

如果你的網站允許使用者張貼外部連結(例如社群新聞網站),可使用 Google Safe Browsing API 來檢查每個 URL 是否在有害網站黑名單中。

Clickjacking(點擊劫持)#

HTML 允許透過 <iframe> 標籤在網頁中嵌入另一個網頁。駭客利用 CSS 的 z-indexopacity 屬性,在 <iframe> 上方放置透明的 <div> 元素,誘騙使用者點擊他們以為的內容,實際上卻是觸發了 iframe 中的操作。

Clickjacking 的變體包括:

  • 誘騙受害者開啟網路攝影機
  • Likejacking:誘騙受害者在 Facebook 上按讚,在暗網上販售按讚數牟利

防範 Clickjacking#

使用 Content-Security-Policy header 的 frame-ancestors 指令:

Content-Security-Policy: frame-ancestors 'none'
  • 'none' — 完全禁止網站被嵌入 iframe
  • 'self' — 只允許同一網站的 iframe 嵌入
  • 指定網域名稱 — 只允許特定網站嵌入
Content-Security-Policy: frame-ancestors 'self'
Content-Security-Policy: frame-ancestors example.com google.com

Server-Side Request Forgery (SSRF)#

如果你的網頁伺服器會發出對外 HTTP 請求,且駭客能控制請求的目標 URL,你就容易受到 SSRF 攻擊。駭客可利用你的伺服器發送惡意請求。

SSRF 的發現方式#

  • 駭客透過 spidering(爬蟲)遍歷網站的每個頁面
  • 使用駭客工具替換遇到的每個 HTTP 參數為他們控制的 URL
  • 如果偵測到來自你伺服器的 HTTP 請求,就表示存在 SSRF 漏洞
  • 接受 XML 內容的端點也可能透過 XML external entity attacks 被利用於 SSRF

防範 SSRF#

  • 審計程式碼:檢查所有發出對外 HTTP 請求的部分,確保 URL 來自設定檔而非客戶端輸入
  • 使用服務提供者的 SDK 來建構 API 呼叫的 URL
  • 網路層防禦:在防火牆中設定白名單,只允許存取必要的外部網域
  • 滲透測試:使用與駭客相同的工具主動發現漏洞

遵循 defense in depth(縱深防禦)原則,在多個層面(程式碼、網路)同時防範 SSRF。

Botnets(殭屍網路)#

駭客總是在尋找額外的運算能力。如果成功入侵你的伺服器,他們通常會安裝 bot(殭屍程式)——一種可被遠端控制的惡意軟體。多個 bot 組成 botnet(殭屍網路),透過加密協定互相通訊。

Botnet 的常見用途:

  • 挖掘加密貨幣(如 Bitcoin)
  • 進行 click fraud(點擊詐騙),人為膨脹網頁瀏覽量
  • 發送垃圾郵件
  • 發動 denial-of-service 攻擊

防範惡意軟體感染#

  • 確保已修補 command injection 和檔案上傳漏洞
  • 執行最新的防毒軟體
  • 監控對外網路流量,偵測可疑活動
  • 執行 integrity checker(完整性檢查工具),監控敏感目錄的非預期檔案變更
  • 使用虛擬化服務或容器時,定期從映像檔重建系統,可清除已安裝的惡意軟體

總結#

  • 實作 SPFDKIM 保護從你網域發送的電子郵件
  • 確保網站沒有 open redirects
  • 設定 Content-Security-Policyframe-ancestors 防範 clickjacking
  • 審計程式碼確保伺服器不會被誘騙向攻擊者指定的 URL 發送 HTTP 請求,並在網路層設定白名單防範 SSRF
  • 使用虛擬化伺服器、病毒掃描工具或漏洞掃描工具來檢查並移除 bots