【W(wǎng)EB開發(fā)】偽造X-Forwarded-For繞過服務(wù)器IP地址過濾
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
在正常的TCP/IP 通信中,是可以偽造數(shù)據(jù)包來源 IP 的,但這會讓發(fā)送出去的數(shù)據(jù)包返回到偽造的IP上,無法實現(xiàn)正常的通信。 實現(xiàn)TCP/IP層級別的偽造很難,因為很難實現(xiàn)正常的TCP連接;但是在應(yīng)用層協(xié)議HTTP上的實現(xiàn)較容易,通過偽造IP,能欺騙多數(shù)服務(wù)器應(yīng)用程序?qū)崿F(xiàn)通信。對于繞過服務(wù)器的IP地址過濾或者偽造來源IP特別有用,導(dǎo)致的后果就是非授權(quán)IP能訪問服務(wù)器,甚至能鉆服務(wù)器的漏洞。 這其中的關(guān)鍵就是偽造X-Forwarded-For。 一、X-Forwarded-For介紹 我們知道 HTTP 連接基于 TCP 連接,HTTP 協(xié)議中沒有 IP 的概念,只能通過X-Forwarded-For來實現(xiàn)。 X-Forwarded-For位于HTTP協(xié)議的請求頭, 是一個 HTTP 擴展頭部。HTTP/1.1(RFC 2616)協(xié)議并沒有對它的定義,它最開始是由 Squid 這個緩存代理軟件引入,用來表示 HTTP 請求端真實 IP。如今它已經(jīng)成為事實上的標準,被各大 HTTP 代理、負載均衡等轉(zhuǎn)發(fā)服務(wù)廣泛使用,并被寫入RFC 7239(Forwarded HTTP Extension)標準之中。 X-Forwarded-For 請求頭格式非常簡單:
可以看到,XFF 的內(nèi)容由「英文逗號 + 空格」隔開的多個部分組成,最開始的是離服務(wù)端最遠的設(shè)備 IP,然后是每一級代理設(shè)備的 IP。 如果一個 HTTP 請求到達服務(wù)器之前,經(jīng)過了三個代理 Proxy1、Proxy2、Proxy3,IP 分別為 IP1、IP2、IP3,用戶真實 IP 為 IP0,那么按照 XFF 標準,服務(wù)端最終會收到以下信息: X-Forwarded-For: IP0, IP1, IP2 Proxy3 直連服務(wù)器,它會給 XFF 追加 IP2,表示它是在幫 Proxy2 轉(zhuǎn)發(fā)請求。列表中并沒有 IP3,IP3 可以在服務(wù)端通過 Remote Address 字段獲得。Remote Address來自 TCP 連接,表示與服務(wù)端建立 TCP 連接的設(shè)備 IP,在這個例子里就是 IP3。 Remote Address 無法偽造,因為建立 TCP 連接需要三次握手,如果偽造了源 IP,無法建立 TCP 連接,更不會有后面的 HTTP 請求。不同語言獲取Remote Address的方式不一樣,例如Node.js 是req.connection.remoteAddress,原理都一樣。 一般的客戶端(例如:瀏覽器)在發(fā)送HTTP請求時,并不會設(shè)置X-Forwarded-For頭,當(dāng)請求在到達第一個代理服務(wù)器時,代理服務(wù)器會在請求字段中加上X-Forwarded-For這個字段,并將其值設(shè)置為客戶端的IP地址,后面如果還有更多的代理服務(wù)器,會依次將Ip地址追加到X-Forwarded-For這個字段中,最終當(dāng)請求到達了Web應(yīng)用服務(wù)器,應(yīng)用會通過獲取X-Forwarded-For頭取出最左邊的IP地址,即為客戶端的真實IP地址。 如果客戶端在發(fā)起請求時,請求頭上帶上一個偽造的X-Forwarded-For,由于后續(xù)每層代理只會追加而不會覆蓋,那么最終到達應(yīng)用服務(wù)器時,最左邊的IP地址就是客戶端偽造的IP地址。 這個利用方法可以繞過一些針對IP地址進行限制的應(yīng)用,例如:投票等應(yīng)用 一般在nginx中會進行如下的配置
這種如果沒有X-Forwarded-For消息頭會添加消息頭,如果存在該消息頭則會在后面追加一個IP。 二、X-Forwarded-For偽造 下面就是一種常見的獲取客戶端真實IP的方式
可以通過抓包的方式偽造X-Forwarded-For頭,如下 三、修復(fù)方式 目前很多Web 應(yīng)用(例如獲取用戶所在地區(qū),基于 IP 做訪問頻率控制,禁止某些IP訪問等等),為了獲取用戶真正的 IP,從 HTTP 請求頭中獲取 IP地址。這些情況下,必須確保獲取到的IP地址是真實可靠的。 經(jīng)過前面的分析和測試, 1.對于直接使用的 Web 應(yīng)用,必須使用從TCP連接中得到的 Remote Address,才是用戶真實的IP; 2.對于使用 nginx 反向代理服務(wù)器的Web應(yīng)用,nginx必須使用Remote Address正確配置set Headers,后端服務(wù)器則使用nginx傳過來的相應(yīng)IP地址作為用戶真實IP。 正確配置nginx的方式,就是在最外層的代理服務(wù)器強制設(shè)定X-Forwarded-For的值為REMOTE ADDRESS。配置如下
在最外層Nginx(即直接對外提供服務(wù)的Nginx)使用$remote_addr代替上面的$proxy_add_x_forwarded_for,可以防止偽造X-Forwarded-For。$proxy_add_x_forwarded_for會在原有X-Forwarded-For上追加IP,這就相當(dāng)于給了偽造X-Forwarded-For的機會。而$remote_addr是獲取的是直接TCP連接的客戶端IP,這個是無法偽造的,即使客戶端偽造也會被覆蓋掉,而不是追加。 其它一下相似的消息頭,也可以嘗試使用這些消息頭進行繞過
閱讀原文:原文鏈接 該文章在 2025/5/14 9:29:40 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |