什么是SSRF
SSRF 代表服务器端请求伪造。该漏洞允许恶意用户导致网络服务器向攻击者选择的资源发出额外的或经过编辑的 HTTP 请求。
SSRF的类型
SSRF 漏洞有两种类型:第一个是常规 SSRF,其中数据返回到攻击者的屏幕。第二个是盲目 SSRF 漏洞,即发生 SSRF,但不会将任何信息返回到攻击者的屏幕。
有什么影响
成功的SSRF攻击可能会导致以下情况:
进入未经授权的区域。
访问客户/组织数据。
能够扩展到内部网络。
显示身份验证令牌/凭据。
漏洞成因
漏洞攻击方式
对外网,服务器所在内网,本地进行端口扫描(挨个试探),获取一些服务的banner信息
攻击运行在内网或本地的应用程序
对内网Web应用进行指纹识别,识别企业内部的资产信息,通过访问默认文件实现(如:readme文件)
攻击内外网的Web应用,主要是使用HTTP GET请求就可以实现的攻击(比如strust2,SQli等)
下载内网资源,利用file协议读取本地文件或资源等
内部任意主机的任意端口发送精心构造的Payload
DOS攻击(请求大文件,始终保持连接Keep-Alive Always)
进行跳板
利用Redis未授权访问,HTTP CRLF注入实现getshell
SSRF 示例
下面的示例显示了攻击者如何仍然可以通过使用目录遍历来访问/api/user
页面,而只需控制路径。当website.thm
收到../
这是一条向上移动目录的消息,该目录删除了请求的/stock
部分,并将最终请求转换为/api/user
在此示例中,攻击者可以控制向其发出请求的服务器子域
。请注意以&x=
结尾的有效负载用于阻止将剩余路径附加到攻击者URL的末尾
,并将其转换为查询字符串上的参数(?x=)
回到原始请求,攻击者可以强制Web服务器请求攻击者选择的服务器。通过这样做,我们可以捕获发送到攻击者指定域的请求标头。这些标头可能包含website.thm发送的身份验证凭据
或API密钥
(通常会向API.website.thm)
最后让我们通过url找到flag
通过#3的例子,使用&x,得到以下payload
https://website.thm/item/2?server=server.website.thm/flag?id=9&
https://website.thm/item/2
: 这是网站的基本地址部分,https://website.thm
表示访问的网站主域名,/item/2
表示访问该网站上的特定页面或资源,其中2
可能是页面的标识符或者参数。?server=server.website.thm/flag?id=9&
: 这是查询字符串部分,通常用来向服务器传递参数。在这个查询字符串中,参数以key=value
的形式出现,其中:server=server.website.thm/flag?id=9
: 这是一个参数,server
是参数的名称,server.website.thm/flag?id=9
是参数的值。
flag:THM{SSRF_MASTER}
如何发现SSRF
当地址栏中的参数使用完整 URL 时:
表单中的隐藏字段:
部分 URL,例如主机名:
或者也许只是 URL 的路径:
如果使用没有输出反射给您的盲目 SSRF,您将需要使用外部 HTTP 日志记录工具来监视请求,例如 requestbin.com、您自己的 HTTP 服务器或 Burp Suite 的 Collaborator 客户端
常见的防御
了解 SSRF 漏洞风险的更多精通安全的开发人员可能会在其应用程序中实施检查,以确保请求的资源符合特定规则。通常有两种方法,拒绝列表
或允许列表
,简单来说就是黑名单
和白名单
拒绝列表
拒绝列表是除了列表中指定的资源或与特定模式匹配的资源之外的所有请求都被接受的地方
Web 应用程序可以使用拒绝列表来保护敏感端点、IP 地址或域不被公众访问,同时仍然允许访问其他位置。限制访问的特定端点是 localhost,它可能包含服务器性能数据或其他敏感信息,因此 localhost 和 127.0.0.1 等域名将出现在拒绝列表中
绕过方法
攻击者可以通过使用替代本地主机引用(例如 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
允许列表
允许列表是拒绝所有请求的地方,除非它们出现在列表中或匹配特定模式,例如参数中使用的 URL 必须以 https://website.thm 开头的规则
绕过方法
攻击者可以通过在攻击者的域名上创建子域来快速规避此规则,例如 https://website.thm.attackers-domain.thm。应用程序逻辑现在将允许此输入并让攻击者控制内部HTTP请求
打开重定向
如果上述旁路不起作用,攻击者还有一个妙招,即打开重定向。开放重定向是服务器上的一个端点,网站访问者会自动重定向到另一个网站地址。以链接为例https://website.thm/link?url=https://tryhackme.com.创建此端点是为了记录访问者出于广告/营销目的点击此链接的次数。但想象一下,存在一个潜在的SSRF漏洞,该漏洞具有严格的规则,仅允许以开头的URLhttps://website.thm/.攻击者可以利用上述功能将内部HTTP请求重定向到攻击者选择的域
SSRF例子
登录网站,按照要求,进入https://10-10-117-122.p.thmlabs.com/customers/new-account-page
通过查看头像表单的页面源代码,将看到头像表单字段值包含图像的路径。
如果选择其中一个头像,然后单击 “更新头像” 按钮,您将看到表单发生变化,并在其上方显示您当前选择的头像。
源码显示当前头像是通过urlbase64重定向显示
现在让我们尝试再次发出请求,但将头像值更改为 私有 ,希望服务器能够访问资源并绕过 IP 地址块。为此,首先,右键单击头像表单上的单选按钮之一,然后选择“检查”:
但是被拒绝
我们仍然有一个技巧可以绕过此规则。我们可以使用目录遍历技巧来到达我们想要的端点。尝试将头像值设置为 x/../private
我们现在已经绕过了规则,并且用户更新了头像。这个技巧之所以有效,x/
的意思是选择并进入
目录不管是否存在,然后再使用x/
../
跳出x
目录,等于原地踏步,但是可以绕过识别不能已/privite
的限制
现在头像切换成功
查看头像源码,将ba64码编译得到flag
flag:THM{YOU_WORKED_OUT_THE_SSRF}
网友评论