【11.18总结】从SAML出发在重定向中发现的XSS漏洞
Write-up地址:How I Discovered XSS that Affects around 20 Uber Subdomains
总算回家了,完全没想到这次要外出一个月,今天开始恢复更新。
前几天忘记在哪里看到了这个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漏洞的更多相关文章
- github javascript相关项目star数排行榜(前30,截止2016.11.18):
github javascript相关项目star数排行榜(前30,截止2016.11.18): 前端开源框架 TOP 100 前端 TOP 100:::::https://www.awesomes. ...
- 日常Java 2021/11/18
用idea实现Javaweb登录页面 <%-- Created by IntelliJ IDEA. User: Tefuir Date: 2021/11/18 Time: 18:14 To ch ...
- 沉淀再出发:java中线程池解析
沉淀再出发:java中线程池解析 一.前言 在多线程执行的环境之中,如果线程执行的时间短但是启动的线程又非常多,线程运转的时间基本上浪费在了创建和销毁上面,因此有没有一种方式能够让一个线程执行完自己的 ...
- 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 ...
- 沉淀再出发:java中的HashMap、ConcurrentHashMap和Hashtable的认识
沉淀再出发:java中的HashMap.ConcurrentHashMap和Hashtable的认识 一.前言 很多知识在学习或者使用了之后总是会忘记的,但是如果把这些只是背后的原理理解了,并且记忆下 ...
- eclipse安装activiti5.18.0工作流插件 以及安装过程中activiti插件出现的问题及解决
转: eclipse安装activiti5.18.0工作流插件 以及安装过程中activiti插件出现的问题及解决 2017年05月04日 18:44:21 JJ_nan 阅读数:2773 版权声 ...
- 沉淀再出发:在python3中导入自定义的包
沉淀再出发:在python3中导入自定义的包 一.前言 在python中如果要使用自己的定义的包,还是有一些需要注意的事项的,这里简单记录一下. 二.在python3中导入自定义的包 2.1.什么是模 ...
- 沉淀再出发:java中的CAS和ABA问题整理
沉淀再出发:java中的CAS和ABA问题整理 一.前言 在多并发程序设计之中,我们不得不面对并发.互斥.竞争.死锁.资源抢占等等问题,归根到底就是读写的问题,有了读写才有了增删改查,才有了所有的一切 ...
- 沉淀,再出发:python中的pandas包
沉淀,再出发:python中的pandas包 一.前言 python中有很多的包,正是因为这些包工具才使得python能够如此强大,无论是在数据处理还是在web开发,python都发挥着重要的作用,下 ...
随机推荐
- 关于removeChild
var a=document.body; document.body.parentNode.removeChild(a) console.log(a); a的内容还是body???whY
- java:通过Calendar类正确计算两日期之间的间隔
在开发Android应用时偶然需要用到一个提示用户已用天数的功能,从实现上来看无非就是持久化存入用户第一次使用应用的时间firstTime(通过SharedPreferences .xml.sqlit ...
- 可以触发点击事件并变色的UILabel
可以触发点击事件并变色的UILabel 谁说UILabel不能够当做button处理点击事件呢?今天,笔者就像大家提供一个改造过的,能够触发点击事件并变色的UILabel:) 效果图: 还能当做计时器 ...
- Linux 开机启动流程
Linux的开机启动流程 1.开机BIOS自检 --> 检查CPU,硬盘等硬件信息 2.MBR[Major ...
- Build path entry is missing: config 引起的 The project: configwhich is referenced by the classpath, does not exist.
运行Junit的时候报错, The project: XXXX which is referenced by the classpath, does not exist. 在Java Build Pa ...
- 如何访问WEB-INFO目录中的jsp文件
说明:应用服务器把WEB-INF指为禁访目录,即直接在浏览器里是不能访问的. 如何访问如下: 1.在项目的web.xml文件中去配置servlet <servlet> <servle ...
- zabbix的日常监控-磁盘性能监控(十二)
监控磁盘的性能 参考文章: https://wiki.enchtex.info/howto/zabbix/zabbix_iostat_monitoring https://blog.csdn.net/ ...
- Basestation函数解析(一)
---恢复内容开始--- 1._tmain _tmain()是微软操作系统(windows)提供的对unicode字符集和ANSI字符集进行自动转换用的程序入口点函数. 首先,这个_tmain() ...
- QT里使用Gsoap调用WebService
错误了很多天,今天终于搞定,并得到了服务器的结果.这里把错误的原因记录下来. 首先是这里,之前一直没有加载进来,所以一直报错 SOURCES += main.cpp\ gsoap/soapClient ...
- python第十九课——random模块中的常用函数
1.random():返回一个[0,1)的随机浮点数(双精度浮点数) 2.uniform(a,b): 返回[a,b]之间的一个随机浮点数(双精度浮点数) [注意]a和b接受的数据大小随意 例如:3.r ...