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. Nginx 配置多站点vhost

    假设你想在Linux Nginx中用不同的域名访问不同的目录,这时就要配置多个vhost,具体配置如下,假设网站根目录设定在/var/www/ 1.在/var/www/下新建两个目录 /var/www ...

  2. 如何让你的Ssh连接,更加安全?

    希望你会涨姿势. First: vim /etc/ssh/sshd_config 在Port 22下面加一行,以端口1438为例,Port 1438 然后保存,重启ssh服务 systemctl re ...

  3. 【MySQL】Linux下mysql安装全过程——小白入门篇(含有问题详解)

    本次安装操作在申请的腾讯云上实现(版本:CentOS Linux release 7.4.1708 (Core) ). 根据教程实现(中途各种挖坑,填坑...),地址:http://www.runoo ...

  4. Flask 参数简介

    我们都知道学习了Flask的时候它里面的参数是有很多种的参数  都是需要相互进行调用传递的  今天就简要分析一些常见的参数 首先导入Flask之后看 源码 from flask import Flas ...

  5. iOS设计模式 - 迭代器

    iOS设计模式 - 迭代器 原理图 说明 提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 源码 https://github.com/YouXianMing/iOS-Des ...

  6. 【转】什么是JavaScript

    转自mdn学习网站-什么是JavaScript 什么是JavaScript? 欢迎来到 MDN JavaScript 初学者的课程! 在第一篇文章中,我们将会站在一定的高度来俯看 JavaScript ...

  7. 设计一套砝码要求能称量出1 ~ 100g之间的任意重量,请问至少需要多少个砝码?以及每个砝码各自的重量是多少?

    解析: 1g => 1g 2g => 1g 1g => 1 ~ 2g之间的重量 => 1g 2g => 1 ~ 3g之间的重量 4g => 1g 2g 1g =&g ...

  8. ord 字符转code chr : code转字符

    print(ord('刀')) # ord 字符转Unicode # 20992 print(chr(20992)) # Unicode 转成chr(字符)

  9. C++11新特性之十:enable_shared_from_this

    enable_shared_from_this是一个模板类,定义于头文件<memory>,其原型为: template< class T > class enable_shar ...

  10. jQuery实现简易轮播图的效果

    (图片素材取自于小米官网) 刚开始接触jQuery的学习,个人觉得如果为了实现多数的动态效果,jQuery的确很简易方便. 下面简易的轮播图效果,还请前辈多多指教~ (努力学习react vue an ...