目錄
一、SSRF
二、數字IP原理
1、IP多進制
(1)十進制整數格式 (Dword / 長整數格式)
(2)八進制格式 (Octal IP)
(3)十六進制格式 (Hex IP)
2、SSRF繞過
三、滲透實戰
1、打開靶場
2、嘗試127.0.0.1訪問flag
3、十進制繞過訪問flag
4、總結
本文講解CTFHub的SSRF數字IP繞過關卡的滲透實戰。數字IP轉換技術通過不同進制(十進制、八進制、十六進制)表示IP地址,可繞過基于字符串匹配的SSRF防御機制。實戰案例中,將127.0.0.1轉換為十進制2130706433,成功繞過黑名單攔截,獲取flag。關鍵在于利用IP格式多樣性,制造過濾邏輯與解析邏輯的差異,實現內網探測和數據訪問。防御應避免簡單字符串匹配,改用URL解析庫提取標準IP地址進行驗證。
一、SSRF
SSRF(服務器端請求偽造)的原理是攻擊者利用應用程序中發起網絡請求的功能,通過篡改請求參數(如URL),使服務器向非預期的內部或受限系統發起請求。由于請求源自受信任的服務器本身,因此能夠繞過網絡訪問控制(如防火墻),從而探測內網、訪問元數據服務或讀取本地文件,將服務器變為攻擊內網的跳板。
特點維度 | 具體描述 |
---|---|
本質 | 攻擊者能夠欺騙服務器應用程序代表其向任意內部或外部系統發起非預期的網絡請求。 |
原理 | 利用應用程序中代發網絡請求的功能(如圖片抓取、數據導入),通過篡改輸入參數(如URL)來控制請求目標。 |
請求來源 | 請求由受信任的服務器進程發起,而非來自不受信任的客戶端網絡。這是其能繞過防御的關鍵。 |
核心危害 | 繞過網絡邊界。將外部攻擊者無法直接訪問的內網資源暴露出來,使服務器成為攻擊內網的跳板或代理。 |
利用手段 | 使用多種協議(如?http /https 、file 、dict 、gopher )和繞過技巧(如IP進制轉換、域名重綁定、@ 語法歧義)來攻擊不同目標。 |
主要攻擊目標 | 1.?內網應用:數據庫、緩存服務(Redis)、管理后臺。 2.?本地資源:服務器本身上的文件 ( file:///etc/passwd )。3.?云元數據:云平臺元數據服務 ( 169.254.169.254 )。4.?端口掃描:探測內網哪些端口開放。 |
二、數字IP原理
1、IP多進制
IPv4 地址本質是32 位二進制數,點分十進制(如 127.0.0.1)只是人類易讀的表示形式。根據 TCP/IP 協議規范,IP 地址還支持十進制、八進制、十六進制等數字格式,且所有網絡設備 / 服務器會自動解析這些格式為正確的 32 位 IP。
常見 IP 格式轉換(以 127.0.0.1 為例),具體轉換關系如下表所示。
IP 表示形式 | 轉換邏輯 | 對應格式示例 | 說明 |
---|---|---|---|
點分十進制 | 4 個 0-255 的十進制數,用 “.” 分隔 | 127.0.0.1 | 最常用格式,易被攔截 |
純十進制 | 將 32 位二進制 IP 直接轉為十進制整數 | 2130706433 | 無 “.”,易繞過字符攔截 |
八進制 | 每個 IP 段(0-255)轉為八進制,前綴加 “0” | 0177.0.0.01 | 注意:八進制數不能包含 8/9,否則解析失敗 |
十六進制 | 將 32 位二進制 IP 轉為十六進制,前綴加 “0x” | 0x7F000001 | 十六進制字母不區分大小寫(0x7f000001 也可) |
混合進制 | 不同 IP 段用不同進制(如前兩段十進制,后兩段八進制) | 127.0.00.01 | 服務器通常也能正常解析 |
(1)十進制整數格式 (Dword / 長整數格式)
原理說明:這種格式將 IP 地址視為一個 32 位的整數進行計算。每個 IP 地址由 4 個字節組成,通過數學公式將這 4 個字節的數值合并為一個完整的十進制數字。
計算公式:(第一字節 × 2563) + (第二字節 × 2562) + (第三字節 × 2561) + (第四字節 × 256?)
以 127.0.0.1 為例:
127 × 16,777,216 (2563) + 0 × 65,536 (2562) + 0 × 256 (2561) + 1 × 1 (256?) = 2,130,706,433
技術特點:大多數網絡請求庫(如 curl、Python 的 requests 庫等)都內置支持識別這種數字格式,能夠自動將其轉換回標準的點分十進制格式。當應用程序檢測到這樣的純數字時,過濾系統往往無法識別其真實含義,而底層網絡庫卻能正確解析并發起請求。
(2)八進制格式 (Octal IP)
原理說明:這種格式將 IP 地址每個字節的十進制數轉換為八進制數表示。在編程語言中,八進制數通常以數字 0 開頭作為前綴標識。
轉換方法:將每個十進制字節轉換為對應的八進制數,然后用點號分隔保持 IP 地址格式,或者直接將四個字節的八進制數連接成一個長數字。
以 127.0.0.1 為例:
127 的八進制是 177,加上前綴 0 成為 0177;
0 的八進制仍然是 0;
1 的八進制仍然是 1;
最終形成 0177.0.0.1 或 017700000001
技術特點:八進制格式利用了數字表示方法的多樣性,過濾系統通常只檢測常見的十進制點分格式,而忽略了其他進制表示的可能性。
(3)十六進制格式 (Hex IP)
原理說明:這種格式將 IP 地址的每個字節轉換為十六進制數表示。十六進制數通常以 0x 前綴標識,可以保持點分格式或合并為一個完整的十六進制數。
轉換方法:將每個十進制字節轉換為對應的十六進制數,保留點號分隔符,或者將四個字節的十六進制值連在一起。
以 127.0.0.1 為例:
127 的十六進制是 7f,加上前綴成為 0x7f;
0 的十六進制是 0x0;
1 的十六進制是 0x1;
最終形成 0x7f.0x0.0x0.0x1 或 0x7f000001
技術特點:十六進制格式提供了另一種數字表示方式,進一步增加了檢測的難度。網絡庫在解析時會自動處理這些前綴標識,將其轉換回標準的 IP 地址格式。
總結來說,?這三種數字 IP 格式的共同原理是:利用 IP 地址不同表示形式之間的差異,繞過基于字符串模式匹配的簡單過濾機制,同時依賴底層網絡庫強大的自動格式轉換能力,最終實現訪問內部網絡資源的目的。這種繞過手法的有效性完全建立在"過濾邏輯與解析邏輯不一致"的基礎上。
2、SSRF繞過
數字IP(Decimal IP/Octal IP/Hexadecimal IP)的核心原理是:利用IP地址格式的多樣性,來繞過基于字符串匹配(正則表達式)的SSRF防御規則。許多應用程序的防護代碼會使用簡單的黑名單來過濾輸入,例如檢查URL中是否包含?127.0.0.1,
192.168.
、10.
、172.16.
?等字符串。數字IP繞過技術的本質就是,將點分十進制的IP格式轉換成其他格式,使得過濾規則無法識別,而底層的網絡請求庫卻能自動將其轉換回正確的IP地址并發起請求。
方面 | 說明 |
---|---|
目標 | 繞過基于字符串匹配的SSRF過濾規則。 |
手段 | 利用IP地址的多種表示格式(十進制、八進制、十六進制)。 |
關鍵 | 制造過濾邏輯(簡單字符串匹配)與解析邏輯(網絡庫自動轉換)之間的差異。 |
利用條件 | 底層網絡庫支持這些數字格式的自動轉換。 |
防御方法 | 不要使用字符串匹配!?應使用URL解析庫提取出Host,將其解析為標準IP地址,再判斷該IP是否屬于內網網段。 |
三、滲透實戰
1、打開靶場
?打開關卡(?“SSRF - 數字 IP Bypass”)如下所示,,觀察頁面交互邏輯,提示信息為“這次ban掉了127以及172.不能使用點分十進制的IP了。但是又要訪問127.0.0.1。該怎么辦呢”,提示本關卡的URL對數字127和172做了過濾,不能使用10進制的IP地址。點擊打開題目,此時系統自動創建Docker環境,下圖藍色部分的URL地址就是靶場環境。
復制靶場鏈接(challenge-61733642fa1afeb0.sandbox.ctfhub.com:10800)并訪問,如下所示被重定向到了?url=_中,這提示我們此URL的參數為url。
http://challenge-61733642fa1afeb0.sandbox.ctfhub.com:10800/?url=_
2、嘗試127.0.0.1訪問flag
嘗試?url=http://127.0.0.1/flag.php,構造 “點分十進制 IP” 的 Payload,驗證是否被攔截,構造的完整URL鏈接如下所示。
http://challenge-61733642fa1afeb0.sandbox.ctfhub.com:10800/?url=http://127.0.0.1/flag.php
但是有提示**“Hack ban Intranet IP”**,效果如下所示,說明服務器已將 “127.0.0.1”等常見本地 IP的特征加入到黑名單中,這與我們在靶場開啟時的提示是一致的,故而考慮通過 “數字 IP 格式轉換” 繞過。
3、十進制繞過訪問flag
IPv4 地址本質是 32 位二進制數,除了點分十進制,還支持純十進制、八進制、十六進制等格式,服務器會自動解析為正確 IP。使用在線進制轉換工具對127.0.0.1進行進制轉換,運行結果如下所示。
若需手動驗證,按以下步驟計算:
- 將 IP 的 4 個段(127、0、0、1)分別轉為 8 位二進制:
127 → 01111111,0→00000000,0→00000000,1→00000001; - 拼接為 32 位二進制數:
01111111000000000000000000000001
; - 將 32 位二進制轉為十進制:
01111111000000000000000000000001
?= 2130706433。
以十進制為例,用十進制2130706433代替127.0.0.1即可(?url=http://2130706433/flag.php),此時完整的URL地址具體如下所示。
http://challenge-61733642fa1afeb0.sandbox.ctfhub.com:10800/?url=http://2130706433/flag.php
將構造好的 URL 復制到瀏覽器地址欄,按下回車發送請求 —— 服務器會自動將 “2130706433” 解析為 127.0.0.1,繞過黑名單攔截,具體效果如下所示,已經成功獲取flag,滲透成功。
將獲取到的 Flag值ctfhub{f31fd5126981e9621b1432ab}復制到 CTFHub 關卡的提交框,點擊提交 ,如下所示提示 “正確”,滲透流程結束。
4、總結
總結數字IP關卡滲透流程,核心是 “利用 IP 多進制特性繞過黑名單”,關鍵在于 “準確轉換 IP 格式 + 正確構造 Payload”,具體過程如下表所示。
階段 | 核心操作 | 關鍵注意事項 |
---|---|---|
場景識別 | 測試點分十進制 IP 是否被攔截 | 確認目標 IP(通常是 127.0.0.1)和資源路徑(flag.php) |
IP 轉換 | 優先轉純十進制,其次八進制 / 十六進制 | 工具計算避免手動錯誤,八進制不包含 8/9 |
Payload 構造 | 數字 IP 代入 url 參數,拼接完整 URL | 替換關卡實際地址,確認資源路徑和端口 |
請求與驗證 | 瀏覽器訪問或 Burp 抓包發送,查看響應 | 無響應時用 Burp 排查請求是否被攔截 |
Flag 獲取 | 頁面或源代碼中搜索 flag,提交驗證 | 路徑 / 端口錯誤時調整 Payload,重試備選 IP 格式 |