SSRF绕过

$_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

流程

image-20250331170043519

若传入的私网地址被限制可以使用302重定向绕过。这需要一台公网服务器和它的公网IP,在服务器中创建重定向的代码文件,提交公网IP路径下的重定向代码文件,使SSRF漏洞服务器或主机访问从而重定向到自己内网地址或本机地址。

简单的重定向代码,将其保存在公网服务器中命名为1.php

1
2
<?php
heander('Location:http://127.0.0.1/flag.php');

提交公网地址访问重定向文件,端口可以在公网服务器设置开放哪个端口,主要是为了方便访问文件。

http://<公网IP>:<某端口>/1.php

这样公网IP不会被过滤限制,还能使ssrf漏洞服务器重定向到本地内网访问文件。

DNS重绑定绕过

看不懂

网址:rbndr.us dns rebinding service

用这个一遍就出了,不知道为什么,记录一下

image-20250331172808631

image-20250331171839899

image-20250331172121024

image-20250331172140112

[::1]

::1IPv6 的环回地址(所以如果使用gethostbyname()函数会无法被解析),功能等同于 IPv4 的 127.0.0.1

  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 的定义与作用

  1. 基本定义
    0.0.0.0 是 IPv4 的 默认路由地址,表示“监听所有本地网络接口”。
    • 当服务器绑定到0.0.0.0时,会接收来自所有网络接口 的请求,包括:
      • 环回接口(127.0.0.1,即本机内部通信)。
      • 物理网卡接口(如 192.168.1.100,用于外部网络通信)。
  2. 常见应用场景
    • 服务器配置:Web 服务(如 Nginx、Apache)默认监听 0.0.0.0:80,以便接收外部和本地的请求。
    • 开发调试:本地服务运行时可能监听 0.0.0.0,方便多设备测试。

二、利用 “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"
  • 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

三、攻击生效的关键场景

  1. 服务监听 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 发起未授权访问。
  2. 黑名单校验不完整
    • 未覆盖 0.0.0.0、IPv6 地址(::1)或内网 IP 段(如 192.168.0.0/16)。
  3. 依赖隐式解析的代码逻辑
    • 开发者未显式解析主机名,直接信任用户输入的 URL。

五、总结

  • 绕过原理
    0.0.0.0 是默认监听所有接口的 IP,而 "0" 通过解析可得到此地址。若黑名单未覆盖它,攻击者可构造 http://0/flag 访问本地服务。
  • 生效条件
    1. 服务监听 0.0.0.0
    2. 黑名单未拦截 0.0.0.0 或未校验解析后的 IP。
  • 防御核心
    显式解析主机名为 IP,并校验所有敏感地址(包括 0.0.0.0 和内网段)。

[::]

::IPv6 的环回地址(所以如果使用gethostbyname()函数会无法被解析),功能等同于 IPv4 的 0.0.0.0