SSRF绕过

SSRF绕过
FLYFISH$_SEVER['REMOTE_ADD']=='127.0.0.1'
要求REMOTE_ADD地址是127.0.0.1才会显示,但是127.0.0.1常常会被限制
环回地址绕过
IP地址
| 十进制 | 127.0.0.1 | 点分十分制 |
|---|---|---|
| 十进制连续 | 2130706433 | |
| 0b | 01111111000000000000000000000001 | 数据包中实际是32位bit二进制 |
| 0 | 17700000001 | 八进制 |
| 0x | 7F000001 | 16进制 |
302重定向绕过
要服务器?不会用zzzz
流程
若传入的私网地址被限制可以使用302重定向绕过。这需要一台公网服务器和它的公网IP,在服务器中创建重定向的代码文件,提交公网IP路径下的重定向代码文件,使SSRF漏洞服务器或主机访问从而重定向到自己内网地址或本机地址。
简单的重定向代码,将其保存在公网服务器中命名为1.php
1 |
|
提交公网地址访问重定向文件,端口可以在公网服务器设置开放哪个端口,主要是为了方便访问文件。
http://<公网IP>:<某端口>/1.php
这样公网IP不会被过滤限制,还能使ssrf漏洞服务器重定向到本地内网访问文件。
DNS重绑定绕过
看不懂
网址:rbndr.us dns rebinding service
用这个一遍就出了,不知道为什么,记录一下
[::1]
::1 是 IPv6 的环回地址(所以如果使用gethostbyname()函数会无法被解析),功能等同于 IPv4 的 127.0.0.1。
绕过 IPv4 黑名单:
如果防御代码仅拦截127.0.0.1,攻击者可以通过 IPv6 地址绕过限制。1
2
3
4
5$forbidden_ips = ['127.0.0.1']; // 未包含 ::1
$ip = '::1';
if (!in_array($ip, $forbidden_ips)) { // 绕过成功
// 发起请求到本地服务
}
0?0!
一、0.0.0.0 的定义与作用
- 基本定义
0.0.0.0是 IPv4 的 默认路由地址,表示“监听所有本地网络接口”。- 当服务器绑定到
0.0.0.0时,会接收来自所有网络接口 的请求,包括:- 环回接口(
127.0.0.1,即本机内部通信)。 - 物理网卡接口(如
192.168.1.100,用于外部网络通信)。
- 环回接口(
- 当服务器绑定到
- 常见应用场景
- 服务器配置:Web 服务(如 Nginx、Apache)默认监听
0.0.0.0:80,以便接收外部和本地的请求。 - 开发调试:本地服务运行时可能监听
0.0.0.0,方便多设备测试。
- 服务器配置:Web 服务(如 Nginx、Apache)默认监听
二、利用 “0” 绕过黑名单的核心原理
1. 解析逻辑:从 “0” 到 0.0.0.0
gethostbyname()函数的行为:
该函数用于将主机名解析为 IPv4 地址。当输入为特殊值"0"时:- 在 Unix/Linux 系统中,
"0"可能被隐式映射到/etc/hosts中的条目,直接返回0.0.0.0。 - 若
"0"无法通过 DNS 解析,函数可能默认返回0.0.0.0(依赖系统实现)。
示例(PHP 环境):
1
echo gethostbyname("0"); // 输出 "0.0.0.0"
- 在 Unix/Linux 系统中,
URL 解析与网络请求的差异:
parse_url()仅提取 URL 中的host字段(如"0"),不进行 DNS 解析。实际发起请求时(如
file_get_contents()),底层网络库会自动解析主机名1
2// 即使未显式调用 gethostbyname(),请求仍会解析为 0.0.0.0
file_get_contents("http://0/flag");
2. 绕过黑名单的条件
黑名单设计缺陷:
若黑名单仅拦截127.0.0.1和::1,但未包含0.0.0.0,则攻击可通过以下两种方式绕过:场景 1:校验原始主机名(未解析)
1
2
3
4
5$host = parse_url($_GET['url'], PHP_URL_HOST); // 获取 "0"
$forbidden_hosts = ['127.0.0.1', 'localhost'];
if (!in_array($host, $forbidden_hosts)) {
file_get_contents($_GET['url']); // 实际解析为 0.0.0.0,请求成功
}- 绕过原因:黑名单未包含
"0",但底层请求解析为0.0.0.0。
场景 2:校验解析后的 IP(但未覆盖 0.0.0.0)
1
2
3
4
5
6$host = parse_url($_GET['url'], PHP_URL_HOST); // 获取 "0"
$ip = gethostbyname($host); // 解析为 "0.0.0.0"
$forbidden_ips = ['127.0.0.1', '::1'];
if (!in_array($ip, $forbidden_ips)) {
file_get_contents($_GET['url']); // 请求成功(0.0.0.0 未被拦截)
}- 绕过原因:黑名单未包含
0.0.0.0。
- 绕过原因:黑名单未包含
三、攻击生效的关键场景
- 服务监听 0.0.0.0
- 若目标服务(如 Web 服务器、数据库)监听
0.0.0.0,则请求0.0.0.0可访问其内容。 - 示例
- Web 服务运行在
0.0.0.0:80→ 访问http://0/flag可获取敏感数据。 - Redis 服务运行在
0.0.0.0:6379→ 攻击者通过http://0:6379发起未授权访问。
- Web 服务运行在
- 若目标服务(如 Web 服务器、数据库)监听
- 黑名单校验不完整
- 未覆盖
0.0.0.0、IPv6 地址(::1)或内网 IP 段(如192.168.0.0/16)。
- 未覆盖
- 依赖隐式解析的代码逻辑
- 开发者未显式解析主机名,直接信任用户输入的 URL。
五、总结
- 绕过原理:
0.0.0.0是默认监听所有接口的 IP,而"0"通过解析可得到此地址。若黑名单未覆盖它,攻击者可构造http://0/flag访问本地服务。 - 生效条件
- 服务监听
0.0.0.0。 - 黑名单未拦截
0.0.0.0或未校验解析后的 IP。
- 服务监听
- 防御核心:
显式解析主机名为 IP,并校验所有敏感地址(包括0.0.0.0和内网段)。
[::]
:: 是 IPv6 的环回地址(所以如果使用gethostbyname()函数会无法被解析),功能等同于 IPv4 的 0.0.0.0。

















