【THM】Intro to SSRF(服务器端请求伪造漏洞简介)-学习
本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/ssrfqi
通过学习相关知识点:了解如何利用服务器端请求伪造(SSRF:Server-Side Request Forgery)漏洞,该类漏洞能够允许攻击者访问目标服务器的内部资源。
简介
在本文中,你将了解什么是 SSRF,它们会产生什么样的影响,你可以看到一些 SSRF 攻击示例,了解如何发现 SSRF 漏洞,如何规避输入规则限制。
什么是SSRF?
首先要知道目标web服务器可以向其他web服务器或子域站点发出资源请求消息。SSRF代表服务器端请求伪造(Server-Side Request Forgery),是一个针对服务器端请求的漏洞:允许恶意用户操纵目标web服务器 基于攻击者所选择的资源信息发出额外的或编辑过的 HTTP 请求。
SSRF 的种类
有两种类型的 SSRF 漏洞:第一个是常规的 SSRF,完成攻击之后,数据会返回到攻击者的屏幕;第二种是 盲SSRF 漏洞,能完成SSRF攻击,但没有任何信息会返回到攻击者的屏幕。
有什么影响?
成功的 SSRF 攻击可能导致以下任何情况:
- 能访问到未经授权的区域。
- 能访问客户/组织数据。
- 能够扩展到内部网络。
- 能够获取到身份验证令牌/凭证。
答题
SSRF示例
示例
我们将带你了解一些 SSRF 攻击示例并解释它们的工作原理。
下面的示例显示了攻击者如何完全控制 Web 服务器请求的页面。预期请求是 website.thm 服务器期望接收的内容,红色部分是网站用于获取其他资源信息的 URL。
攻击者可以将红色区域修改为他们自己所选择的 URL。
下面的示例显示了攻击者如何仅通过利用目录遍历来控制路径以到达 /api/user
页面。 当 website.thm 收到 ../
时,会向上移动一级目录,这将移除原本所请求的/stock
部分并将最终请求变成/api/user
。
在下面的示例中,攻击者可以控制发出请求的服务器的子域。 请注意以 &x=
结尾的payload可用于阻止将剩余路径附加到攻击者所构造的 URL 的末尾,这能将剩余路径转换为查询字符串中的参数 (?x=
)。
回到最初的示例,攻击者还可以尝试强制目标web服务器发出请求来包含攻击者所选择的服务器。完成相关操作之后,我们就可以捕获 由目标web服务器发送到攻击者指定域的请求标头,这些标头可能包含由 website.thm 发送的身份验证凭据或 API 密钥(假设此例中的目标服务器通常会向 api.website.thm 进行身份验证)。
尝试更改以下浏览器中的地址,强制目标web服务器基于子域https://server.website.thm/flag?id=9
页面返回数据(为了使事情变得更容易,模拟浏览器底部的服务器请求栏将显示 website.thm 所请求的 URL)。
答题
提示:附加 &x= 以忽略 URL 的剩余部分。
操作:见本节的示例部分。
找到SSRF漏洞
可以通过许多不同的方式在 Web 应用程序中发现潜在的 SSRF 漏洞,以下是关于四个存在SSRF漏洞的常见位置的示例。
在浏览器地址栏的http(s)请求参数中使用完整 URL :
修改表单中的隐藏字段:
修改部分 URL,例如子域的hostname:
修改URL 的访问路径:
其中一些示例比其他示例更容易被利用,在实际环境下,我们往往需要经过大量试验和错误才能找到payload的生效位置。
如果执行的 SSRF 攻击是没有输出的 盲SSRF 类型,你还需要使用外部 HTTP 日志记录工具来监视http请求消息,例如 requestbin.com
、你自己的 HTTP 服务器或 BurpSuite 的 Collaborator
客户端。
答题
绕过常见的SSRF防御
了解 SSRF 漏洞风险的开发人员可能会在其应用程序中实施SSRF漏洞检查,以确保服务器所请求的资源符合特定规则。 防御SSRF通常有两种方法:建立拒绝列表、建立允许列表。
Deny List
建立拒绝列表之后,除了拒绝列表中指定的资源或者与列表特定模式(即规则)匹配的资源之外的所有请求都会被目标web服务器接受。Web 应用程序可以使用拒绝列表来保护敏感端点、IP 地址或域 不被公众随意访问,同时该列表将仍然允许公众访问web服务器的其他资源。限制访问的特定端点可以是localhost
,因为它可能包含服务器性能数据或其他敏感信息,因此 localhost
和 127.0.0.1
等域名将出现在拒绝列表中。
攻击者可以通过使用其他 localhost 引用来绕过(bypass)拒绝列表,例如使用 0
、0.0.0.0
、0000
、127.1
、127.*.*.*
、2130706433
、017700000001
或者使用具有解析为 IP 地址127.0.0.1
的 DNS 记录的子域如127.0.0.1.nip.io
等。
此外,在云环境中,阻止对IP地址169.254.169.254
的访问将是有益的,因为该地址包含已部署的云服务器的元数据,而元数据可能包括一些敏感信息。 攻击者可以通过在自己的域上注册一个子域来绕过此防御,将该注册子域的 DNS 记录指向 IP 地址169.254.169.254
即可。
Allow List
允许列表能用于拒绝其他任何请求,除非该请求出现在允许列表中或者能匹配允许列表所规定的特定模式(规则),例如http(s)请求参数中使用的 URL 必须以https://website.thm 开头的规则。
攻击者可以通过在自己所拥有的域名上创建一个子域来快速规避前面提到的规则,例如创建子域https://website.thm.attackers-domain.thm 之后,web应用程序的逻辑将允许此子域url输入并能让攻击者控制目标web服务器的内部 HTTP 请求。
Open Redirect(开放重定向)
如果上述绕过方法不起作用,攻击者还可以使用另一种技巧,即开放重定向。开放重定向是目标web服务器上的端点,目标网站访问者可以通过该端点自动重定向到另一个网站地址。
以链接 https://website.thm/link?url=https://tryhackme.com 为例,创建此端点是为了记录网站访问者出于广告/营销目的而点击相关页面链接的次数。但想象一下,如果目标站点具有严格的规则,只允许以 https://website.thm/ 开头的 URL,那么就可能存在一个潜在的SSRF漏洞,因为攻击者可以尝试利用开放重定向功能将目标web服务器的内部 HTTP 请求重定向到攻击者所选择的域。
答题
SSRF练习
让我们在一个虚构的场景中测试我们学到的关于 SSRF 的知识。
假设在针对 Acme IT Support 网站(目标示例站点)的内容发现练习中,我们遇到了两个新端点。第一个是 /private
,它给我们提供了一条错误消息,说明无法从我们的当前 IP 地址查看private页面内容;第二个是位于 /customers/new-account-page
的新版本客户帐户页面,此页面具有允许客户为其帐户选择头像的新功能。
首先单击该小节所对应的TryHackMe实验房间中的 Start Machine 按钮以启动 Acme IT Support 网站(目标站点)。当目标站点运行后,通过攻击机访问刷新之后的URL https://LAB_WEB_URL.p.thmlabs.com 即可,然后按照以下说明获取flag。
创建一个客户帐户并登录。登录后,立即访问 https://LAB_WEB_URL.p.thmlabs.com/customers/new-account-page 页面查看新头像选择功能。通过查看头像表单的页面源代码,你会看到头像(avatar)表单字段值中包含了图像的路径;根据下面的屏幕截图,在DIV 元素中,能找到背景图像样式(style)以证实这一点:
如果你选择其中一个头像,然后单击“更新头像”( Update Avatar )按钮,你将看到表单发生变化,在其上方会显示你当前所选择的头像。查看页面源代码将显示当前头像所对应的 URI 数据方案(data URI scheme)详情,图像内容将按照下面的屏幕截图进行 base64 编码:
现在让我们再次尝试发出请求,但此次将 avatar
值更改为 private
,以期望目标web服务器允许我们通过当前 IP 地址块来访问private
所对应的资源。 为此,首先,右键单击头像表单上的其中一个单选按钮并选择“Inspect”:
然后将单选按钮的值编辑为private
:
然后单击“更新头像”( Update Avatar )按钮。 不幸的是,Web 应用程序似乎设置了一个拒绝列表,阻止了我们对 /private
端点的访问:
正如你从上图的错误消息中看到的那样,路径不能以/private
开头,但请放心,我们仍然有办法绕过此规则。 我们可以使用目录遍历技巧来到达我们想要的端点:尝试将刚才的头像(avatar )值设置为 x/../private
我们现在绕过了规则限制,用户能够成功更新头像。 这个技巧之所以有效,是因为当目标Web服务器接收到关于 x/../private
的请求时,它知道../
字符串意味着向上移动一级目录,该级目录能够将访问请求成功转换为/private
。
查看头像表单的页面源码,你会看到当前设置的头像能够包含经过base64编码的/private
目录下的内容,对这些内容进行解码,就能得到该练习所对应的flag。
答题
启动目标机器,使用攻击机访问目标站点:https://10-10-137-108.p.thmlabs.com/
登录刚才创建的账户,访问以下页面:https://10-10-137-108.p.thmlabs.com/customers/new-account-page
查看头像表单的页面源代码,能够看到头像(avatar)表单字段值对应着图像的url资源路径(观察下图中的两个红色小框):
选中头像表单中的一个头像,然后单击“更新头像”( Update Avatar )按钮,你将看到表单发生变化,在其上方会显示你当前所选择的头像。查看当前页面源代码将显示 当前头像 所对应的 URI 数据方案(data URI scheme)详情,可以得知图像内容将进行 base64 编码处理:
现在让我们再次尝试发出请求,但此次将 avatar
值更改为 private
,以期望目标web服务器允许我们通过当前 IP 地址块来访问private
所对应的资源。 为此,首先,右键单击头像表单上的其中一个单选按钮并选择“Inspect”:
然后将单选按钮的值编辑为x/../private
:
然后单击“更新头像”( Update Avatar )按钮,接着查看头像表单的页面源码,你会看到当前设置的头像能够包含经过base64编码的/private
目录下的内容,对这些内容进行解码,得到flag:
base64码:VEhNe1lPVV9XT1JLRURfT1VUX1RIRV9TU1JGfQ==
解码:THM{YOU_WORKED_OUT_THE_SSRF} 。