Server-side request forgery(SSRF)
文章目录
简介
服务器端请求伪造(也称为 SSRF)是一种 Web 安全漏洞,允许攻击者诱导服务器端应用程序向非预期位置发出请求。在典型的 SSRF 攻击中,攻击者可能会导致服务器连接到组织基础设施内的仅供内部使用的服务。在其他情况下,他们可能会强制服务器连接到任意外部系统,从而可能泄露授权凭证等敏感数据。
如果攻击者能够将url
参数更改为localhost
,这可能允许他们查看服务器上托管的本地资源,从而使其容易受到服务器端请求伪造的攻击。
如果攻击者可以控制服务器端请求的目的地,这将开启一系列攻击活动,可能允许他们:
- 滥用易受攻击的服务器与其他系统之间的信任关系
- 绕过 IP 白名单
- 绕过基于主机的身份验证服务
- 阅读网络资源和其他人无法访问的有用资产,例如 AWS 环境或
trace.axd
ASP.NET中的元数据 API - 在服务器连接到的内部网络上执行端口扫描
- 从网络服务器读取文件
- 查看状态页面并作为 Web 服务器与 API 交互
- 检索敏感信息,例如在反向代理后面运行的 Web 服务器的 IP 地址
OWASP Top 10 中的 SSRF
服务器端请求伪造是一个众所周知的漏洞,也是Open Web Application Security Project十大 Web 应用程序安全风险列表中的常规项目。在2021 年的 OWASP 前 10 名中,它第一次获得了自己的类别 A10:2021 – 服务器端请求伪造 (SSRF)。
随着现代 Web 应用程序变得越来越复杂和相互关联,获取 URI 已成为交付内容和功能的基本操作。随着服务器端请求的增加,SSRF 漏洞也变得越来越普遍。同时,由于云服务和复杂的基于云的应用程序架构的日益普及,它们的范围和影响正在扩大,这可能允许攻击者通过受感染的服务器访问 Web 基础设施和云数据源。
SSRF的典型利用
在典型的 SSRF 场景中,想要访问内部服务器的外部攻击者无法使用直接请求,因为它们会被防火墙阻止。相反,恶意行为者可以利用 SSRF 漏洞通过易受攻击的 Web 服务器进行攻击:
- 攻击者向易受 SSRF 攻击且与目标服务器位于同一内部网络的 Web 服务器发送伪造请求。
- 易受攻击的 Web 服务器将攻击者控制的请求发送到受害者的服务器,绕过防火墙。
- 受害者的服务器用请求的数据响应网络服务器。
- 如果特定的 SSRF 漏洞允许,数据将被发送回攻击者。在大多数情况下,攻击者需要通过其他方式(带外)泄露或推断此信息。
常见的 SSRF 攻击
SSRF 攻击通常利用信任关系升级来自易受攻击的应用程序的攻击并执行未经授权的操作。这些信任关系可能与服务器本身有关,或者与同一组织内的其他后端系统有关。
针对服务器本身的 SSRF 攻击
在针对服务器本身的 SSRF 攻击中,攻击者诱导应用程序通过127.0.0.1
或localhost
向托管应用程序的服务器发出 HTTP 请求。攻击者可以直接访问/admin
URL。但管理功能通常只能由合适的经过身份验证的用户访问。因此,直接访问 URL 的攻击者不会看到任何感兴趣的内容。但是,当对/admin
URL 的请求来自本地机器本身时,正常的访问控制就会被绕过。该应用程序授予对管理功能的完全访问权限,因为该请求似乎来自受信任的位置。
首先进入到商品页面观察,点击Check stock
观察burpsuite拦截到的请求,找到一段url,我们尝试修改url为http://localhost/admin
并使用url编码后发送
在Check stock下面出现**/admin**页面
虽然这里已经进入到管理员页面,但是并不能执行管理员操作,可以尝试点击Delete,获取删除操作的url
再次点击Check stock,在burpsuite更改stockApi为:http%3a%2f%2flocalhost%2fadmin%2fdelete%3fusername%3dcarlos
成功删除用户
针对其他后端系统的 SSRF 攻击
服务器端请求伪造经常出现的另一种信任关系是应用程序服务器能够与用户无法直接访问的其他后端系统进行交互。这些系统通常具有不可路由的私有 IP 地址。由于后端系统通常受到网络拓扑的保护,因此它们的安全状况通常较弱。在许多情况下,内部后端系统包含敏感功能,任何能够与系统交互的人无需身份验证即可访问这些功能。
首先进入web页面,访问商品详情页
点击Check stock进入burpsuite拦截界面
按照描述所说,我们要在192.168.0.X范围查找目标ip,所以这里我们在1左右添加’§’
设置Payload type为Numbers,并且数字范围为1-255,步长为1
开始爆破,爆破完成后,按照状态码大小排序,得到ip最后一位为239时的状态码为404
接下来到Repeater模块尝试SSRF攻击,更改stockApi为http%3A%2F%2F192.168.0.239%3A8080%2Fadmin
进入到管理员页面,在response这一栏给出了删除用户的url
直接更改stockApi为http%3a%2f%2f192.168.0.239%3a8080%2fadmin%2fdelete%3fusername%3dcarlos
,发送该请求即可删除用户carlos
具有基于黑名单的输入过滤器的 SSRF攻击
某些应用程序会阻止包含主机名(如127.0.0.1
和localhost
)或敏感 URL(如/admin
). 在这种情况下,您通常可以使用各种技术来绕过过滤器:
- 使用 的替代 IP 表示形式
127.0.0.1
,例如2130706433
、017700000001
或127.1
。 - 注册您自己的解析为
127.0.0.1
. 您可以spoofed.burpcollaborator.net
用于此目的。 - 使用 URL 编码或大小写变体混淆被阻止的字符串。
进入到商品详情页,点击check stock进入burpsuite拦截界面
这里看到访问的域名为stock.weliketoshop.net
尝试更改目标地址为localhost和127.0.0.1,即stockApi为http%3a%2f%2flocalhost%3a8080%2f%2Fproduct%2Fstock%2Fcheck%3FproductId%3D1%26storeId%3D1
,这里得到一个提示,要访问的地址被过滤
尝试更换目标ip为127.1(这里换成其他地址也可以,只要最终指向的是127.0.0.1就行),得到200响应
接下来修改stockApi尝试访问admin页面,再次被过滤到
对admin进行url编码,第一次编码为%61%64%6d%69%6e
,尝试访问仍然不成功,进行二次编码为%25%36%31%25%36%34%25%36%64%25%36%39%25%36%65
成功进入到admin页面
同理,再对admin/delete?username=carlos
进行两次url编码,修改stockApi,删除用户carlos
针对 ftp 服务器的SSRF攻击
通过命令nmap 10.10.11.111 -p- -v --min-rate=10000
扫描得到,靶场开启22和80端口,再使用命令
nmap 10.10.11.111 -A -sC -sV -T4 -p 22,80
查看开启端口的详细信息
这里观察到80端口会重定向到http://forge.htb,将forge.htb添加到/etc/hosts中,访问域名,点击右上角的上传图片路径
这里尝试上传url:http://forge.htb或http://127.0.0.1,弹出提示说上传的URL中包含黑名单地址
尝试上传本地ip,监听到访问
使用burpsuite大小写混淆可以得到输出,得到一个URL,但在浏览器中访问该URL返回404
尝试curl访问URL,可以得到该页面源代码,我们考虑这个地方可能存在SSRF漏洞
使用命令file:///etc/passwd获取passwd文件内容,得到响应上传的url仅支持http或https协议
这里写一个重定向语句,尝试访问Lab本地ftp服务器
并不支持直接访问ftp服务器
接下来使用gobuster进行子域名枚举,用grep筛选可以成功访问的域名(grep用法看这篇)
访问admin.forge.htb(记得添加/etc/hosts)
提示我们仅本地允许访问,这回应该能用SSRF了,上传子域名URL
使用curl查看返回的内容(注:上传的URL最后要有/,否则curl会报404)
接着再继续访问刚得到的announcements链接,得到一个用户凭据user:heightofsecurity123!,并且它说/upload支持ftp上传,使用**?u=**添加参数
构造访问内部ftp服务器URL:http://adMin.ForGe.htb/upload?u=ftp://user:heightofsecurity123!@127.0.0.1/
提示URL中包含黑名单地址,修改ftp大小写,但仍然是这个结果,可能是127.0.0.1需要修改,试一下127.1,这里用0x7f000001也可以
上传修改后URL成功进入到ftp服务器内部
防范SSRF攻击
为防止 Web 应用程序中出现 SSRF 漏洞,我们应该对 Web 服务器获取的远程资源使用允许域和协议的白名单。甚至还应该避免在任何可以代表服务器发出请求的函数中直接使用用户输入。虽然清理和过滤用户输入是比较有效的措施,但我们不应将此作为唯一的保护措施,因为它几乎不可能涵盖所有不同的场景。
攻击者可以使用多种技巧来绕过 URL 过滤:
- 使用编码的 IP 地址,这些地址将被转换为内部网络中的 IP:
-
- 1-> 与本地主机相同
- 0x7f000001 -> 与本地主机相同
-
- 提供解析为内部 IP 地址的主机名
- 通过在主机名末尾应用点来绕过主机黑名单
这只是攻击者武器库中的一小部分绕过方法,因此最保险的做法是避免用户在代表服务器发出请求的函数中输入。