Write-up地址:How I Discovered XSS that Affects around 20 Uber Subdomains

作者:fady mohammed osman

总算回家了,完全没想到这次要外出一个月,今天开始恢复更新。


前几天忘记在哪里看到了这个write up的中文翻译了,当时也没看,今天打算写总结的时候刚好发现了这篇write-up,决定就是这篇了。

这个在uber发现的漏洞实现上是由logout时重定向引起的反射型XSS,是作者在分析uber的SAML功能时发现的,本来作者是打算做bypass SAML authentication的,但是没有成功,之后才转向分析其他可能的漏洞。

什么是SAML

在说SAML(Security Assertion Markup Language)之前,要先说一下什么是SSO(Single Sign-On),SAML是SSO的一种解决方案。

所有使用互联网的用户应该都知道登录是怎么回事,通过注册并登录一个网站应用,你就可以享受专门针对你个人的网站应用服务了。由于HTTP的无状态性,为了避免对一个网站应用的多次登录,网站应用会使用session ID(例如cookies)来标识用户,这样你只要登录一次该网站应用,在session ID有效期间就不需要再次登录了。但存在一个问题——cookies只在同一个domain下才有效。对于一个大型的网站,它可能有多个应用,而不同应用有不用的domain,这个时候使用cookies就不合适了。

于是就出现了一个解决办法,网站单独建立一个身份提供者(Identity Provider),该应用创建、维护并管理用户认证,而不同的应用作为服务提供者(Service Provider),当用户登录一个应用时,应用会根据用户的origin将其重定向到身份提供者那里,身份提供者验证用户身份,返回一个响应,告诉服务提供者用户是否验证通过,若验证通过,用户就可以使用该应用了。提供一个典型的应用场景,打开淘宝(https://www.taobao.com/)和天猫(https://www.tmall.com/)页面,这时候两个都是未登录状态,如果你这时候登陆淘宝,再刷新天猫页面,会发现天猫页面也是登陆状态。

实现SSO有多重方式,OpenID、Oauth和SAML等,这里要说的就是SAML,顾名思义,SAML是一个基于XML的开源标准数据格式,它规定了身份提供者和服务提供者之间交换认证信息等数据的数据格式,也就是说使用SAML,在应用向身份提供者请求验证用户时,两者之间是通过xml传递信息的。

漏洞发现过程

在作者对uber的子域名进行扫描收集时,发现很多内部域名都会被重定向到uber.onelogin.com进行身份验证,onelogin是一个统一访问管理平台,提供基于SAML的SSO,而之前在使用SAML的应用中已经存在一些身份认证绕过的漏洞,所以作者尝试寻找uber中是否存在这些漏洞,但是发现已经有人提交过了。

根据上面对于SSO的介绍,我们知道当用户访问一个uber的内部网站(https://carbon-prototype.uberinternal.com:443/)时,会被重定向到uber.onelogin.com,即有一个请求发向uber.onelogin.com,而登陆后uber.onelogin.com又会向内部网站返回一个响应,作者观察了发向uber.onelogin.com的请求,里面有一个使用base64编码SAMLRequest的参数,通过解码可以获得接收响应的URL(https://carbon-prototype.uberinternal.com:443/oidauth/saml_consume),这时作者再一次试图绕过身份认证,但是失败了,因此作者对oidauth/这个目录进行扫描,想看一下有没有其他有趣的文件或目录

./dirsearch.py -u https://carbon-prototype.uberinternal.com:443/oidauth/ -ejson

然后

https://carbon-prototype.uberinternal.com:443/oidauth/logout

这个页面吸引了作者的注意力,因为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。

最后作者通过脚本,找到所有接收SAML响应的网址,然后请求该域名下的oidauth/prompt目录,看是否存在该反射型XSS漏洞


1. 对一个新的应用进行测试时,可以看是否存在在其他应用中已经发现的漏洞

2. 为什么会想到目录扫描:在请求包的数据中发现一个oidauth/目录

3. logout功能可能存在XSS漏洞,值得进一步测试

【11.18总结】从SAML出发在重定向中发现的XSS漏洞的更多相关文章

  1. github javascript相关项目star数排行榜(前30,截止2016.11.18):

    github javascript相关项目star数排行榜(前30,截止2016.11.18): 前端开源框架 TOP 100 前端 TOP 100:::::https://www.awesomes. ...

  2. 日常Java 2021/11/18

    用idea实现Javaweb登录页面 <%-- Created by IntelliJ IDEA. User: Tefuir Date: 2021/11/18 Time: 18:14 To ch ...

  3. 沉淀再出发:java中线程池解析

    沉淀再出发:java中线程池解析 一.前言 在多线程执行的环境之中,如果线程执行的时间短但是启动的线程又非常多,线程运转的时间基本上浪费在了创建和销毁上面,因此有没有一种方式能够让一个线程执行完自己的 ...

  4. 18.翻译系列:EF 6 Code-First 中的Seed Data(种子数据或原始测试数据)【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/seed-database-in-code-first.aspx EF 6 Code-F ...

  5. 沉淀再出发:java中的HashMap、ConcurrentHashMap和Hashtable的认识

    沉淀再出发:java中的HashMap.ConcurrentHashMap和Hashtable的认识 一.前言 很多知识在学习或者使用了之后总是会忘记的,但是如果把这些只是背后的原理理解了,并且记忆下 ...

  6. eclipse安装activiti5.18.0工作流插件 以及安装过程中activiti插件出现的问题及解决

    转: eclipse安装activiti5.18.0工作流插件 以及安装过程中activiti插件出现的问题及解决 2017年05月04日 18:44:21 JJ_nan 阅读数:2773   版权声 ...

  7. 沉淀再出发:在python3中导入自定义的包

    沉淀再出发:在python3中导入自定义的包 一.前言 在python中如果要使用自己的定义的包,还是有一些需要注意的事项的,这里简单记录一下. 二.在python3中导入自定义的包 2.1.什么是模 ...

  8. 沉淀再出发:java中的CAS和ABA问题整理

    沉淀再出发:java中的CAS和ABA问题整理 一.前言 在多并发程序设计之中,我们不得不面对并发.互斥.竞争.死锁.资源抢占等等问题,归根到底就是读写的问题,有了读写才有了增删改查,才有了所有的一切 ...

  9. 沉淀,再出发:python中的pandas包

    沉淀,再出发:python中的pandas包 一.前言 python中有很多的包,正是因为这些包工具才使得python能够如此强大,无论是在数据处理还是在web开发,python都发挥着重要的作用,下 ...

随机推荐

  1. SQL Server的优点与缺点

    一般来说索引会加快查询速度,但会影响插入,修改,删除的数据,且占用物理空间;所以我们应该合理的创建索引,而且应该先创建聚合索引,再创建非聚合索引.要在经常进行查询的列上创建索引,而且如果表列较少的话要 ...

  2. Leetcode 回文数字判断

    一.问题描述 判断一个integer 型的数字是否是回文,空间复杂度应该是常数级别的 . 二.问题分析 首先,负数不是回文,10的整数倍不会是回文,个位数一定是回文. 三.代码实现 思路:将一个数字翻 ...

  3. JVM参数简述

    java虚拟机启动时会带有很多的启动参数,Java命令本身就是一个多参数的启动命令.那么具体JVM启动包含哪些参数呢?这篇文章针对java8的情况做一篇汇总解读,包含大多数常见和不常见的命令参数,过于 ...

  4. STL标签与EL表达式之间的微妙关系

    很高兴,今天能和大家分享刚学的一些新知识.我们在java开发过程中经常会在jsp中嵌入一些java代码,比如<%=request.getParameter("id")%> ...

  5. AFNetworking 2.5.x 网络请求的封装

    AFNetworking 2.5.x 网络请求的封装 源码地址 https://github.com/YouXianMing/Networking 说明 1. 将block形式的请求转换成用代理来处理 ...

  6. python 使用exchange发送邮件(三)

    FYI: https://blog.csdn.net/LeoForBest/article/details/79429955

  7. django 实用工具dj-database-url 快速配置数据库

    dj-database-url Github>>> django快速配置多种数据库 $ pip install dj-database-url Configure your data ...

  8. Redis学习---Redis操作之List

    List操作,redis中的List在在内存中按照一个name对应一个List来存储 lpush(name,values) --> 实际上是左添加 # 在name对应的list中添加元素,每个新 ...

  9. ZT 80-90年代港台300部电视剧 你看过多少?

    80-90年代港台300部电视剧 你看过多少? [复制链接]     噗噗 738主题 18精华 万家金领 发消息   发表于 2010-4-27 09:01:02 |显示全部楼层 1.(珍珠传奇) ...

  10. 解决数据库自增ID的问题

    (1)设置主键自增为何不可取这样的话,数据库本身是单点,不可拆库,因为id会重复. (2)依赖数据库自增机制达到全局ID唯一使用如下语句:REPLACE INTO Tickets64 (stub) V ...