内容简介:大家好,今天我要分享的是一个影响20多个Uber子域名的XSS漏洞,该漏洞存在于uberinternal.com身份验证时向uber.onelogin.com的跳转过程中,漏洞最终获得了Uber官方$2500美金奖励。文章开始前,我们需要先来了解一下安全断言标记语言SAML(Security Assertion Markup Language)。
大家好,今天我要分享的是一个影响20多个Uber子域名的XSS漏洞,该漏洞存在于uberinternal.com身份验证时向uber.onelogin.com的跳转过程中,漏洞最终获得了Uber官方$2500美金奖励。
先导概念
文章开始前,我们需要先来了解一下安全断言标记语言SAML(Security Assertion Markup Language)。
SAML是一种基于XML的开源标准数据格式,它在当事方之间交换身份验证和授权数据,尤其是在身份提供者和服务提供者之间交换。SAML规范定义了三个角色:委托人(通常为一名用户)、身份提供者(IdP),服务提供者(SP)。在用SAML解决的使用案例中,委托人从服务提供者那里请求一项服务。服务提供者请求身份提供者并从那里并获得一个身份断言。服务提供者可以基于这一断言进行访问控制的判断——即决定委托人是否有权执行某些服务。
在将身份断言发送给服务提供者之前,身份提供者也可能向委托人要求一些信息——例如用户名和密码,以验证委托人的身份。SAML规范了三方之间的断言,尤其是断言身份消息是由身份提供者传递给服务提供者。在SAML中,一个身份提供者可能提供SAML断言给许多服务提供者。同样的,一个服务提供者可以依赖并信任许多独立的身份提供者的断言。更多信息参考 SAML说明 。
信息收集
在信息收集阶段,我发现Uber的内部系统网站uberinternal.com也在测试范围之内,于是,我就开始对它执行子域名枚举,该过程,我用到了子域名枚举神器aquatone,它发现了一堆子域名网站并作了截图。
值得注意的是,uberinternal.com的大多数子域名网站在身份验证阶段,都会跳转到uber.onelogin.com,而onelogin就是使用SAML验证的一个Uber服务。有意思的是,在SAML的应用中,存在很多验证被绕过的实例,这其中就包括了影响Uber自身服务的一些漏洞,如 实例1 和 实例2 。
首先,我计划来找找是否存在SAML身份验证绕过的情况,一开始我选的目标是Uchat系统,但是有人已经早我一步发现了这个漏洞,接下来,我只有改变目标了。
在登录uberinternal.com相关服务的过程中,会涉及到SAML验证,首先,SAML机制会向uber.onelogin.com后端验证服务发送一个请求,成功登录uberinternal.com服务后,uber.onelogin.com会返回一个有效响应。在此互动中,我感兴趣的是用来接收uber.onelogin.com响应的页面。
由此,可以来看看uberinternal.com在身份验证时发生页面跳转的情况,在下图中,可以看到,它向uber.onelogin.com传递了一个base64编码的SAMLRequest参数:
为了解码这个base64请求参数,我们可以用 samltool 这个在线 工具 中的SAML Decoder功能,解码后,可以看到,其中包含了一个用来接收uber.onelogin.com响应的链接,也可称之为 SAML consume URL:
https://carbon-prototype.uberinternal.com:443/oidauth/saml_consume
如果你还想深入测试一下这种跳转过程中发生的SAML交互,BurpSuite中就有一个专门用来测试SAML的插件,非常适合用来测试SAML。不过,最终我还是自己写了一个小工具 SAMLExtractor ,可以用它来解码提取出跳转发生时,用来接收响应的那个SAML consume URL。
接下来,我们要来尝试的就是绕过上述SAML consume URL链接的SAML身份验证了,因为我不是太了解这种机制,所以我决定用以下 dirsearch 命令,来看看其oidauth目录下是否还有其它存在的子目录或文件:
./dirsearch.py -u https://carbon-prototype.uberinternal.com:443/oidauth/ -ejson
漏洞发现
在经过一番暴力枚举之后,我发现oidauth目录下存在的以下这个页面:
https://carbon-prototype.uberinternal.com:443/oidauth/logout
这是一个登录退出页面,为什么我觉得它有意思呢,因为很多web开发者会把这种退出页面用来实现重定向跳转,而且,有时候这种页面中可能会存在XSS漏洞。为此,当我在浏览器中打开上述页面链接之后,其又跳转到了以下这个页面:
URL解码之后的链接如下:
注意其中的base参数,它是用于获取另一个URL“carbon-prototype.uberinternal.com:443”的,但是,当我把它置换为经典的 javascript:alert(123) 之后,XSS出现了!不仅如此,这个页面还存在点击劫持漏洞(Clickjacking),在利用场景中,可以把XSS和Clickjacking一起配合,可更为方便地实现攻击。
延伸发现
利用之前我编写的小工具SAMLExtractor中批量发现SAML consume URL的功能,我把所有uberinternal.com的子域名网站都测试了一遍,看看是否还有其它子域名网站具备这种相同的调用机制。在我的改装脚本中,我会在验证方式中去调用存在XSS漏洞的页面 oidauth/prompt ,然后尝试javascript:alert(123) 的XSS漏洞,如果存在XSS,那么就会完美地跳出javascript:alert(123)内容了!
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)
最终,我先发现了 https://eng.uberinternal.com 这个网站存在上述XSS漏洞 作了上报 ,之后,我又用这种方式发现了uberinternal.com下 20多个子域名网站存在上述XSS漏洞 ,两次漏洞报告先后分别获得了Uber官方奖励的$500和$2000美金。
更多信息,请参考原漏洞报告- report 1 / report 2
*参考来源:fady,clouds编译,转载请注明来自FreeBuf.COM
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 挖洞姿势:浅析命令注入漏洞
- 挖洞经验 | Vine用户隐私信息泄露漏洞($7560)
- 挖洞经验 | 雅虎(Yahoo)的速率限制漏洞($2k)
- 挖洞经验 | 知名在线教育平台的IDOR漏洞
- 挖洞经验 | 不被PayPal待见的6个安全漏洞
- 挖洞经验 | 看我如何发现Paypal内部信息泄露漏洞
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Machine Learning in Action
Peter Harrington / Manning Publications / 2012-4-19 / GBP 29.99
It's been said that data is the new "dirt"—the raw material from which and on which you build the structures of the modern world. And like dirt, data can seem like a limitless, undifferentiated mass. ......一起来看看 《Machine Learning in Action》 这本书的介绍吧!