[Web 安全]SSRF 服务器端请求伪造

漏洞原理

SSRF 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)

形成原因:其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制。

SSRF 涉及到的危险函数主要是网络访问,支持伪协议的网络读取。以PHP为例,涉及到的函数有 file_get_contents()/fsockopen()/curl_exec() 等。

漏洞危害

SSRF 可以造成服务器所在内网扫描、端口扫描、读取敏感文件等危害

利用场景

  1. 社交分享功能

  1. 在线翻译(调用 api)

  1. 图片下载、加载

  1. 收藏功能

  1. 邮件系统

  1. 第三方支付

  1. 内网服务

  1. redis

写 ssh 公钥、写 crontab、写WebShell、Windows 写启动项、主从复制加载 .so 文件

检测方法

  1. 直接访问内网地址

  1. 可以使用 file、dict、gopher、ftp 协议进行请求访问响应的文件

  1. 攻击内网 Web 应用

  1. 检测内网主机是否存活

防御方案


SSRF 所有攻防都是针对 check_ssrf 函数进行研究的(绕过、更新)

添加白名单(过滤特殊字符)或限制内网 ip 访问、禁止跳转、过滤返回信息:统一错误信息(根据返回信息判断端口是否开放)、禁用不需要的协议(如 file)

绕过手段

  1. 使用解析到内网的域名如果服务端没有先解析 IP 再过滤内网地址,我们就可以使用 localhost 等解析到内网的域名。

  1. 在某些情况下,后端程序可能会对访问的 URL 进行解析,对解析出来的 host 地址进行过滤。这时候可能会出现对 URL 参数解析不当,导致可以绕过过滤。

  1. 短链接绕过

  1. 通过非 http 协议绕过

  1. ipv6

  1. 127。0。0。1 相当于 127.0.0.1

  1. 利用 Enclosed alphanumerics 一些网络访问工具如 Curl 等支持国际化域名(Internationalized Domain Name),国际化域名又称特殊字符域名,是指部分或完全使用特殊的文字或字母组成的互联网域名。

在这些字符中,部分字符会在访问时做一个等价转换,例如 ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ 和 example.com 等同。利用这种方式,可以用 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ 等字符绕过内网限制。

  1. DNS Rebinding 一个常用的防护思路是:对于用户请求的 URL 参数,首先服务器端会对其进行 DNS 解析,然后对于 DNS 服务器返回的 IP地址进行判断,如果在黑名单中,就禁止该次请求。

但是在整个过程中,第一次去请求 DNS 服务进行域名解析到第二次服务端去请求 URL 之间存在一个时间差,利用这个时间差,可以进行 DNS 重绑定攻击。

要完成 DNS 重绑定攻击,我们需要一个域名,并且将这个域名的解析指定到我们自己的 DNS Server,在我们的可控的 DNS Server 上编写解析服务,设置TTL时间为 0。这样就可以进行攻击了,完整的攻击流程为:服务器端获得 URL 参数,进行第一次 DNS 解析,获得了一个非内网的 IP 对于获得的 IP 进行判断,发现为非黑名单 IP,则通过验证服务器端对于 URL 进行访问,由于 DNS 服务器设置的 TTL 为 0,所以再次进行 DNS 解析,这一次 DNS 服务器返回的是内网地址。由于已经绕过验证,所以服务器端返回访问内网资源的结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值