SSRF (Server Side Request Forgery;服务端请求伪造)

1. URL 的结构

URL 的结构如下:

URI = scheme:[//authority]path[?query][#fragment]

其中 authority 组件又分为 3 部分:

[userinfo@]host[:port]
  • schema 由一串大小写不敏感的字符组成,表示获取资源所需要的协议。
  • authority 中, userinfo 遇到的比较少,这时一个可选项,一般 HTTP 使用匿名形式来获取数据,如果需要进行身份验证,格式为 username:password,以 @ 结尾。
  • host 表示在哪个服务器上获取资源,一般所见的是以域名形式呈现,如 baidu.com,也有以 IPv4、IPv6 地址形式呈现。
  • port 为服务器端口。各协议都有默认端口,如 HTTP 的为 80、FTP 的为 21。使用默认端口时,可以将端口省略。
  • path 为指向资源的路径,一般使用 / 进行分层。
  • query 为查询字符串,用户将用户输入数据传递给服务端,以 ? 作为标识。例如,向服务端传递用户名密码为 ?username=admin&password=admin123
  • fragment 为片段 ID,与 query 不同的是,其内容不会被传递到服务端,一般用于表示页面的锚点。

2. SSRF 介绍

SSRF形成的原因大都是由于服务端提供了从其他服务器或应用中获取数据的功能,但没有对目标地址、协议等重要参数做出有效的过滤与限制,从而导致攻击者可以自由构造参数,而发起预期外的请求。

3. 绕过

3.1 IP的限制

  • 封闭式字母数字 (Enclosed Alphanumerics) 代替IP中的数字或网址中的字母。例如:用 ① 代替 1
  • 使用句号代替点
  • IP地址转为进制(八进制、十进制、十六进制)及IP地址省略写法。
    127.0.0.1 为例:
    0177000001 (八进制)
    2130706433 (十进制)
    0x7f000001 (十六进制)
    127.1 (IP地址省略写法)
  • IP地址的特殊写法,在Windows下,0 代表 0.0.0.0,而在Linux下,0 代表 127.0.0.1 。某些情况下 http://0 可以用来请求 127.0.0.1
  • 配置域名。如果我们手中有可控域名,则可将域名A记录只想欲请求的IP进行绕过:
    evil.com => 10.0.18.3

3.2 302跳转

  • 网络上存在一个名叫xip.io的服务,当访问这个服务的任意子域名时,都会重定向到这个子域名,如 127.0.0.1.xip.io 将解析为 127.0.0.1
  • 上面的方式存在的问题是传入的URL中存在关键字 127.0.0.1 ,一般会被过滤,可以使用短网址将其重定向到指定的IP地址。
  • 有时服务端可能过滤了很多协议,如传入的URL中只允许出现 http 或 https ,那么可以在自己的服务器上写一个 302 跳转,利用 Gopher 协议攻击内网的 Redis 。

3.3 URL的解析问题

使用http://example.com@evil.comhttp://a@127.0.0.1:80@baidu.com。可能实现的结果是检测IP时是正常的一个网站域名而实际请求的确实构造的evil.com或127.0.0.1,以此实现了SSRF攻击。

3.4 DNS Rebinding

在某些情况下,针对 SSRF 的过滤可能出现下述情况:通过传入的 URL 提取出 host ,随即进行 DNS 解析,获取 IP 地址,对此 IP 地址进行检验,判断是否合法,如果检测通过,则再使用 curl 进行请求。那么,这里再使用 curl 请求的时候会做第二次请求,即对 DNS 服务器重新请求,如果在第一次请求时其 DNS 解析返回正常地址,第二次请求时的 DNS 解析却返回了恶意地址,那么就完成了 DNS Rebinding 攻击。

DNS 重绑定的攻击首先需要攻击者自己有一个域名,通常有两种方式。第一种是绑定两条记录。这时解析是随机的,但不一定会交替返回。所以,这种方式需要一定的概率才能成功。第二种方式则比较稳定,自己搭建一个 DNS Server ,在上面运行自编的解析服务,使其每次返回的都不同。先给域名添加两条解析,一条 A 记录指向服务器地址,一条 NS 记录指向上条记录地址。

4. 危害

  • 端口扫描
    如: http://example.com/ssrf.php?url=http://192.168.252.130:21/
    可以通过应用响应时间、返回的错误信息、返回的服务 Banner 来判断端口是否开放。

  • 攻击内网或本地存在漏洞的服务
    值得注意的是 Gopher 协议(分布式的文档传递服务):Gopher 协议是 HTTP 出现之前。在 Internet 上常见且常用的一种协议。当然现在 Gopher 协议已经慢慢淡出历史。 Gopher协议可以做很多事情,特别是在 SSRF 中可以发挥很多重要的作用。利用此协议既可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求。这无疑极大地拓宽了 SSRF 的攻击面。——《利用 Gopher 协议拓展攻击面》-长亭科技

    补充:Gopher 协议还可以用来攻击 MySQL、PHP-FPM 攻击、攻击内网中的脆弱 Web 应用(如任意命令执行漏洞的 Web 应用)。

    自动组装Gopher。目前已经有人总结出多种协议并写出自动转化的脚本:https://github.com/tarunkant/Gopherus

  • 文件读取 (file协议)

  • 命令执行 (expect协议)

  • 访问字典源(dict协议,字典服务器协议)。在SSRF中可以获取目标服务器上运行的服务版本等信息。

References:

《从0到1 CTFer成长之路》
《CTF特训营》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值