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