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 -allv=定義 SPF 版本ip4和a指定允許發送郵件的 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 記錄。
偽裝電子郵件中的惡意連結(Disguising Malicious Links in Email)#
垃圾郵件過濾演算法會檢查郵件中的連結,並維護已知有害網域的黑名單。詐騙者因此不斷發明新手法來偽裝有害連結。
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-index 和 opacity 屬性,在 <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.comServer-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(完整性檢查工具),監控敏感目錄的非預期檔案變更
- 使用虛擬化服務或容器時,定期從映像檔重建系統,可清除已安裝的惡意軟體
總結#
- 實作 SPF 和 DKIM 保護從你網域發送的電子郵件
- 確保網站沒有 open redirects
- 設定
Content-Security-Policy的frame-ancestors防範 clickjacking - 審計程式碼確保伺服器不會被誘騙向攻擊者指定的 URL 發送 HTTP 請求,並在網路層設定白名單防範 SSRF
- 使用虛擬化伺服器、病毒掃描工具或漏洞掃描工具來檢查並移除 bots