远程抓图接口为什么会被用来探测内网,导入图片时该挡什么
「按 URL 抓取远程图片并保存到站内」这类功能,被用来探测内网的原因很直接:发请求的不是用户的浏览器,而是你自己的服务器。服务器在内网里,它能访问的地址范围远大于公网访客能访问的范围。同行开源程序的一次版本更新里就有这样一条加固——远程抓图接口新增连接超时、大小上限、域名重绑定防护与内网地址拦截,四项限制对应的正是这类调用可能被滥用的四个面。
替你发请求的功能有哪些
先把范围认清。凡是接受一个地址、由服务端去取内容的功能,都落在同一类里:
- 按地址导入图片、按地址抓取正文里的图片;
- 内容采集,从别的站点取回页面与资源;
- 网页摘要预览、缩略图生成;
- webhook 回调、第三方地址校验;
- 从外部地址批量导入文件。
这些功能在正常业务里都合理,问题只出在取值边界没设:地址是否被解析、解析到哪个网段、返回多大、多久超时、是否跟随跳转。
为什么一个图片地址能探测内网
攻击者的输入是一个地址,比如指向内部管理服务的那个内网名。服务器发出请求后,会有三种可被区分的结果:连接成功并返回内容、连接成功但返回错误页、连接被拒绝或超时。这三种差异足够用来判断内网某个端口有没有服务在听,也就是所谓的端口探测。
再往前一步,同一套能力可以读取内网服务的响应内容,把内部接口返回的数据搬回图片目录里。所以这类问题不该按「抓图接口被滥用」来看,要按「内网边界被借用了一条通道」来看。
加固的四道限制各挡什么
| 限制 | 挡在哪一步 | 挡住的用法 | 单独的不足 |
|---|---|---|---|
| 连接超时 | 发起阶段 | 拖死进程的慢响应 | 不改变能访问哪些地址 |
| 响应大小上限 | 读取阶段 | 超大文件占满磁盘与内存 | 小体积的内部数据仍能返回 |
| 解析后校验与内网地址拦截 | 建立连接前 | 直接写内网名或私有地址 | 只查一次会被重绑定绕过 |
| 重绑定防护与跳转后再校验 | 域名解析与跟随跳转时 | 先解析到公网、请求时变内网;跳转后再落内网 | 需要与前面三条同时生效 |
其中最容易被漏的是最后一条。只做一次地址检查是不够的:域名可以第一次解析成公网地址、第二次解析成内网地址;跟随跳转之后目标也可能已经换到内网。所以校验要在真正建立连接的那一刻再确认一次,跳转后的每一跳都要重新校验。
批量导入与采集时的取值边界
站内两条链路共用这套边界。ZIP 压缩包与 Excel 表格的批量导入,资源随包进来,风险点在包内路径与文件大小,而不是外部地址;内容采集则相反,它天然要访问外部地址,因此必须落在这四条限制里。接口侧的导入能力按 archive 与 import 这条路径提供,写外部地址字段时同样要走校验,避免出现「页面写入有校验、接口写入没校验」的分裂。
一个实用判断:同一份校验代码要被两条链路调用。如果接口和后台各写一套,加固通常只落在其中一处。
自查清单
按这个顺序过一遍:把站内所有接受地址输入的功能列出来;逐个确认有没有超时和大小上限;确认地址是否先解析再判断网段,私有地址段是否直接拒绝;确认跟随跳转时是否重新校验;确认失败时返回的错误信息会不会把内网结构说出来——把连接失败原因原样回显给前端,本身就是一种探测反馈通道。
常见问题
问:只允许图片后缀和指定端口够不够? 答:不够。后缀和端口不是网段控制,攻击者可以让内网地址返回一个伪装成图片的响应。
问:直接关掉远程抓图会不会更省事? 答:如果业务流程不依赖它,关掉是最干净的方案;需要保留时,才走四条限制同时生效的做法。
问:怎么确认自己的站点有没有被这样用过? 答:查访问日志里由服务端发起的异常请求记录,重点看目标是内网名或私有地址的那几条,以及响应体积很小但耗时接近超时上限的请求。