SSRF是一种能让攻击者通过有漏洞的服务器来间接攻击内部系统的危险漏洞。是将服务器变成一个攻击跳板,利用服务器本身的权限和网络位置,对一般无法从外部访问的内部网络或服务发起非法请求。攻击者提供指令(一个经过特殊构造的URL),被执行命令的服务器则会执行。
SSRF的危害从信息泄露到系统失陷
SSRF的危害超过简单的信息收集,严重时可导致整个系统被控制。
窃取敏感信息:攻击者可以使用 file:// 协议读取服务器本地文件,获取数据库配置、应用源码等机密信息。
攻击内网服务:通过扫描和探测,攻击者可以发现并攻击那些隐藏在内部网络中、缺乏防护的数据库、缓存服务或管理后台,进而实现更深入的控制。
云上攻击放大器:在云环境中,SSRF的危害被极度放大。攻击者可以访问云平台的元数据服务,直接窃取临时访问证据,进而接管整个云账号下的所有资源。
远程代码执行:利用gopher等协议,SSRF可以和Redis、MySQL等内网服务进行交互,在特定条件下甚至能实现远程代码执行,完全控制目的服务器。
SSRF的攻防测试和绕过
测试SSRF漏洞,需要识别应用中所有接受URL或IP的功能点,如远程图片加载、文件下载等。
黑白盒测试:黑盒测试主要是构造并注入Payload。除了尝试 http://127.0.0.1:8080,更复杂的是盲SSRF测试,需要利用外带数据(Out-of-Band)通道。一种方法是在测试点插入一个我们能监控的远程域名(如Burp Collaborator生成的地址),如果目的服务器反向请求了该域名,则证明漏洞存在。白盒测试则是在代码方面直接审查,查找使用了如 curl_exec()、file_get_contents() 等函数且未对用户输入进行过滤的地方。
绕过防御:开发者常用的防御手段(黑名单、白名单)往往可以被绕过。
IP混淆:通过八进制、十进制或十六进制形式代替点分十进制IP(如,0x7f.0.0.1 或 2130706433 都代表 127.0.0.1)。
URL分析差别:利用不同语言或库在URL分析上的细微差别进行绕过。如,Java中 url:file:// 可能被分析为 file:// 从而绕过对 file:// 的检查。
重定向:如果目的服务器会跟随HTTP 302重定向,攻击者可以先提供一个指向合法白名单域名的URL,然后让其重定向至真正的内网目的。
IPv6攻击:当防御只针对IPv4地址时,使用IPv6地址即可轻松绕过。
DNS重绑定:通过一个TTL极短的DNS分析记录,让同一域名在两次查询中分别分析到外部合法IP和内部IP,从而骗过防御系统。
创建SSRF的防御体系
有效的SSRF防御应采取多层纵深方法,不是依赖单一手段。
方法:默认拒绝 + 白名单:最安全的方式是默认拒绝所有请求,只允许访问设定义的白名单域名。如,只允许访问 api.trusted-partner.com 及其子域名。
输入测试和协议限制:对用户输入的URL进行严格的格式和协议证实,只允许HTTP/HTTPS协议,并拒绝所有不安全的协议。
网络层隔离:使用防火墙方法严格限制应用服务器对内网的访问,即使发生SSRF漏洞,攻击者也无法连接到核心的服务。
加固云环境:在云环境中,启用IMDSv2并设置最小权限原则,可以有效阻止攻击者从元数据服务窃取证据。