手把手搞懂 SSRF:服务器为什么会帮攻击者访问内网?
大家在学习 Web 安全时经常会听到一个词SSRF很多人第一次看到这个漏洞都会疑惑“攻击者不是在互联网吗为什么能访问公司的内网服务器”实际上SSRF 最核心的思想只有一句话让服务器替攻击者发送请求。理解了这句话SSRF 就不再神秘了。一、什么是 SSRFSSRF 全称 Server Side Request Forgery中文叫服务器请求伪造。原理是服务器提供了从其他服务器应用获取数据的功能但没有对目标地址做严格过滤限制导致攻击者通过外网访问内网造成攻击。简单来说本来应该由用户自己访问的网址变成了服务器帮用户访问。例如网站提供了一个图片抓取功能https://example.com/fetch?urlhttps://test.com/a.jpg服务器收到参数后requests.get(url)然后再把图片返回给用户。正常情况下urlhttps://test.com/a.jpg服务器会去访问https://test.com/a.jpg但如果攻击者把参数改成https://test.com/a.jpg服务器就会去访问自己。这就产生了 SSRF。二、SSRF 为什么危险攻击者无法直接访问企业内网攻击者↓互联网↓公司防火墙↓内网服务器但是企业服务器可以访问内网。于是攻击流程变成攻击者↓存在SSRF漏洞的网站↓内网服务器服务器变成了“中间人”攻击者借助服务器身份进入内网。三、一个典型案例假设网站存在接口GET /api/image?url后台代码requests.get(url)攻击者输入http://127.0.0.1服务器访问http://127.0.0.1如果返回内容Apache Default Page说明服务器本机开启了 Web 服务。攻击者成功访问到本机资源。四、SSRF 能做什么1. 探测内网尝试访问http://192.168.1.1http://192.168.1.2http://192.168.1.3根据响应结果判断主机是否存在端口是否开放服务是否运行这就是内网探测。2. 扫描端口尝试访问http://127.0.0.1:22http://127.0.0.1:80http://127.0.0.1:3306观察超时拒绝连接返回数据判断目标端口状态。3. 访问管理后台很多后台只允许内网访问http://127.0.0.1/admin外部用户打不开。但服务器自己能打开。于是 SSRF 可以帮助攻击者访问这些页面。4. 获取云平台元数据云服务器通常提供169.254.169.254这样的特殊地址。用于获取* 实例信息* Access Key* Token* 云平台配置这也是云环境中 SSRF 最经典的利用方式之一。五、SSRF 常见危险函数1.Pythonrequests.get()urllib.request.urlopen()2.PHPfile_get_contents()curl_exec()fopen()3.JavaHttpURLConnection只要程序允许用户控制访问地址就需要警惕 SSRF。六、如何发现 SSRF观察网站是否存在图片抓取输入图片URL文件导入导入远程文件在线预览预览远程网页RSS订阅导入RSS地址第三方资源同步同步远程数据这些功能都可能成为 SSRF 的入口。七、SSRF 防御思路白名单只允许访问指定域名cdn.example.comimg.example.com禁止访问其他地址。禁止内网地址过滤127.0.0.1localhost192.168.x.x10.x.x.x172.16.x.xDNS解析校验防止evil.com解析后指向127.0.0.1从而绕过检测。网络隔离服务器权限最小化。限制访问内网数据库管理后台云平台接口即使发生 SSRF 也难以进一步利用。八、总结SSRF 的本质并不复杂攻击者自己访问不了目标于是让服务器替自己访问。漏洞核心可以概括为学习 SSRF 时不必一开始就研究复杂绕过技巧。先理解为什么服务器会帮我们访问为什么能探测内网为什么云环境害怕 SSRF把这三个问题想明白后面的内网扫描、云平台利用、绕过技巧都会容易很多。