跳转到帖子

背景服务端请求伪造(SSRF)经常出现在图片抓取、Webhook、文档转换、远程资源预览和第三方接口代理等功能中。审计时,只要看到服务端接收 URL 并发起请求,很多报告会直接标记为 SSRF。但真正有价值的分析不能停留在规则命中,而应回答三个问题:用户输入是否真正到达网络请求点;请求是否能够访问原本不应暴露的网络区域;现有防护是否会被 URL 解析差异、重定向或 DNS 变化绕过。下面以一个典型的远程资源预览功能为例,整理一套偏实战的审计方法。示例只针对本地靶场或授权测试环境,重点放在风险确认、边界识别和修复验证,不讨论对真实系统的探测或利用。一、先明确审计场景假设接口接收一个资源地址,后端下载内容后返回文件信息:POST /api/preview
Content-Type: application/json

{"url":" target = request.getParameter("url");
HttpResponse response = httpClient.get(target);
return parsePreview(response.getBody());这里至少存在四类需要确认的问题:请求是否由服务器发起,而不是由浏览器直接访问。目标地址是否完全由用户控制,还是仅允许固定域名或固定路径。请求是否会跟随 3xx 重定向,是否允许跨协议跳转。下载结果是否会被进一步解析,例如 XML、SVG、压缩包或办公文档。其中最后一点容易被忽略。SSRF 可能只是第一阶段,后续的 XML 外部实体、文件解析器缺陷或压缩包路径穿越,可能将影响面进一步扩大。二、代码审计中的数据流确认审计时建议从请求入口和网络出口两端同时追踪,而不是只搜索 get、post 或 URL 关键字。可以把数据流分成四段:输入源:HTTP 参数、JSON 字段、消息队列内容、数据库中的回调地址以及管理后台配置。变换过程:URL 解码、拼接路径、模板替换、重试封装、代理配置和重定向处理。网络出口:HTTP 客户端、图片库、浏览器自动化组件、DNS 客户端以及命令执行封装。结果使用:直接返回响应、保存到对象存储、交给解析器或写入日志。实际项目中,风险往往藏在封装层。例如业务代码调用 fetchResource,真正的请求可能在 common-http 模块中完成;又或者表面上只允许图片,底层客户端却支持任意协议。审计记录至少应包含输入变量、最终请求 URL、解析器配置、重定向策略和超时设置。三、不要只看字符串校验以下校验方式看似有效,但通常不足以构成安全边界:if (url.contains("127.0.0.1")) {
reject();
}原因在于 URL 不是普通字符串。主机名可能解析到多个地址,地址还存在 IPv4、IPv6、IPv4 映射 IPv6、不同进制表示和尾随点等差异。更重要的是,域名解析结果可能随时间变化,应用校验时得到的是一个地址,真正建立连接时却可能已经变成另一个地址。审计中应分别检查以下环节:URL 解析是否使用标准库,而不是通过字符串截取获取主机名。是否明确限制协议,仅允许 https 或业务确实需要的 http。是否拒绝用户名密码、非标准端口以及不必要的 URL 片段。DNS 解析后是否对每个地址进行内网、回环、链路本地和保留地址判断。建立连接时使用的地址是否就是经过校验的地址,避免校验和连接之间重新解析。重定向后的目标是否重新执行完整校验,而不是只校验初始 URL。四、建立可复现的安全测试环境风险确认不应依赖真实内网服务。推荐在本地或隔离测试网络中准备三个组件:业务服务:实现待审计的 URL 获取功能。外部模拟站点:返回固定内容,用于确认正常功能未被误伤。内网模拟站点:仅在测试网段监听,返回明显的测试标识,用于确认网络边界策略。同时记录应用容器、宿主机和出口代理的网络关系。一个常见误判是:应用在容器内无法访问宿主机测试服务,于是报告认为不存在 SSRF;但生产环境的网络策略可能完全不同。因此,结论应描述为某个运行环境下的可达性和限制条件,而不是简单写成存在或不存在。验证时可以使用请求日志、DNS 日志和出口防火墙日志交叉确认。不要把响应内容作为唯一证据,因为服务端可能屏蔽响应体,但请求本身仍然已经到达目标。五、推荐的修复思路1. 优先采用允许列表如果业务只需要抓取固定的合作方资源,最稳妥的方案不是维护一组禁止地址,而是维护允许的域名、协议、端口和路径。允许列表应由服务端配置控制,不能由普通用户提交后立即生效。allowedSchemes = [https]
allowedHosts = [static.example.test, cdn.example.test]
allowedPorts = [443]域名匹配应按规范化后的主机名进行,并避免使用简单的后缀判断。例如允许 example.test 不能等同于允许 evil-example.test。必要时可将合作方资源代理到内部固定接口,由代理根据资源 ID 获取内容,避免业务层直接接收任意 URL。2. 对解析结果做网络分区判断当业务确实需要访问用户提供的域名时,应在连接前解析主机名,并拒绝回环、私有、链路本地、未指定和其他不应访问的地址。判断逻辑需要同时覆盖 IPv4 和 IPv6,并对一个域名返回的所有地址执行检查。URI uri = URI.create(input);
require(uri.getScheme() == HTTPS);
require(uri.getUserInfo() == null);
require(uri.getPort() == 443);

List<IPAddress> addresses = resolver.resolve(uri.getHost());
for (IPAddress address : addresses) {
if (address.isLoopback()
|| address.isPrivate()
|| address.isLinkLocal()
|| address.isUnspecified()
|| address.isReserved()) {
reject();
}
}这段代码只是说明校验顺序,不能直接当作完整安全组件。不同语言和网络库对 isPrivate、代理解析和 IPv4 映射地址的处理并不一致,生产实现应结合所用运行时进行单元测试。3. 处理重定向和 DNS 变化安全客户端应默认关闭自动重定向,或者由业务层逐跳处理。每次跳转都要重新检查协议、主机、端口和解析地址,并设置最大跳转次数。对于 DNS 变化问题,可以让受控的出站代理负责解析和连接,应用只把经过策略校验的目标交给代理;这样比在多个业务服务中重复实现解析和连接控制更容易统一治理。4. 限制资源消耗SSRF 防护不能只关注能否访问内网,还要限制请求本身的资源消耗:设置连接超时、读取超时和整体请求超时。限制响应体大小,避免将下载功能变成内存或磁盘消耗点。限制响应头数量、重定向次数和单个请求的并发数。明确 Content-Type 和文件格式,避免将任意内容交给图片、XML 或办公文档解析器。下载文件时使用随机文件名,并在独立目录或低权限沙箱中处理。六、修复验证不能只测一个地址一份合格的回归用例至少应覆盖以下类别:正常的允许域名和允许协议。不在允许列表中的公网域名。回环、私有、链路本地和 IPv6 地址。解析到多个地址,其中一个地址不符合策略的域名。初始地址合法但重定向到不合法地址的场景。包含用户名密码、非标准端口、空主机名或异常编码的 URL。超大响应、慢响应和多次重定向。验证结果应同时检查三类日志:应用是否拒绝、DNS 是否发生解析、网络出口是否实际建立连接。对于应当被阻断的测试请求,理想状态是策略层在连接前拒绝,而不是连接成功后再依靠业务层丢弃响应。七、常见误区只禁止 127.0.0.1:没有覆盖 IPv6 回环、私有网段、链路本地地址和 DNS 解析结果。只校验初始 URL:忽略了重定向和多次跳转。只检查响应内容:请求已经到达敏感网络时,风险可能已经发生。只在业务代码中修复:其他服务可能复用了同一个不安全的 HTTP 客户端。依赖网络环境偶然阻断:测试环境不可达不等于代码具备安全约束。把 URL 编码当成安全措施:编码只能改变表示形式,不能替代规范化解析和网络策略。八、从事件复盘角度补充监控修复完成后,建议增加针对出站请求的审计日志,但不要记录完整的敏感凭据或响应内容。可以记录请求来源、规范化后的协议和主机、策略判定结果、解析地址类别、耗时、响应大小和失败原因。对于被拒绝的目标,日志中可记录哈希或脱敏后的主机信息。网络侧应配合出口白名单、分区策略和 DNS 日志。应用层校验负责业务语义,网络侧策略负责最后一道边界,两者不能互相替代。发生异常时,通过应用日志、代理日志和 DNS 日志关联同一个请求 ID,通常比单独分析某一层更快定位问题。总结SSRF 审计的核心不是寻找一个可以触发请求的参数,而是完整确认输入如何到达网络出口、请求可以触达哪些网络区域,以及重定向、DNS 和解析器是否改变了原有边界。实践中建议采用以下顺序:确认数据流和真实网络出口。明确业务允许访问的协议、域名、端口和路径。使用标准 URL 解析,并对解析后的全部地址执行网络分类判断。关闭或逐跳校验重定向,避免连接前后再次解析导致策略失效。增加超时、大小、并发和解析器隔离等资源控制。在隔离环境中用正向、负向和边界用例完成回归,并通过日志确认实际连接行为。对于长期维护的系统,最好把这些能力下沉到统一的出站请求组件和网络代理中,再由代码审计和自动化测试持续检查调用方。这样既能降低单个业务遗漏防护的概率,也能让漏洞修复从一次性补丁变成可持续的安全控制。

服务器与云环境安全示意图
服务器、云资产与权限边界梳理示意

0篇意见

推荐意见

没有意见。

游客
抱歉,你的帖子内容包括我们不允许的字词。请编辑你的帖子,删除下面高亮的屏蔽字。
添加意见…