CTFHub SSRF通关笔记8:数字IP Bypass 原理详解与渗透实战
目录
一、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 个字节的数值合并为一个完整的十进制数字。
计算公式:(第一字节 × 256³) + (第二字节 × 256²) + (第三字节 × 256¹) + (第四字节 × 256⁰)
以 127.0.0.1 为例:
127 × 16,777,216 (256³) + 0 × 65,536 (256²) + 0 × 256 (256¹) + 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 格式 |