如果攻击者操控了 redirect_uri,会怎样?
读者在看这篇文章之前,请先了解 Oauth2.0 的 Authorization Code 授权流程,可以看 Authorization Code 授权原理和实现方法
在 Token Enpoint 中,按照 Oauth2.0 的标准,需要传递一个 redirect_uri 参数。然而,代码却只对这个参数做检查,没有其他处理逻辑,这背后的原因是什么呢?这里,涉及到一种针对 redirect_uri 的攻击方法。
我们还是用 A 来代表合作方,用 B 来代表鉴权方。我们知道,在合作开始之前,A 需要向 B 注册 redirect_uri 。假如 A 注册的是 a.com/*,也就是说,a.com 域名下的所有 path 都可以作为合法的 redirect_uri。而实际使用的时候,A 传递的是 a.com/recieve_code 这个 path。
但是,攻击者通过某种方式,控制了 a.com 域名下的一个 path,比如 a.com/attacker,此时会发生什么呢?
攻击者可以做以下事情:
1,攻击者访问 a.com,登录,然后通过点击,触发授权流程
2,此时 A 会打开授权页面,攻击者通过浏览器的地址栏,获取到了整个 url
3,攻击者将 url 中的 redirect_uri 替换成 a.com/attacker,构建出一个新的 url
4,攻击者通过某种方式,诱骗真正的用户点击新的 url
5,用户打开授权页面,看到的都是正常的信息(B 即将授权给 A,以便 A 访问你在 B 的资源),因此点击授权
6,code 被发送到 a.com/attacker,攻击者拿到 code
7,攻击者手动通过浏览器访问 a.com/recieve_code?code=xxxx ,此时 A 会去兑换 access token,然后将这个 access token 跟攻击者的账号绑定在一起(A 可能把 access token 存在 session 里,也可能放在 db 里,不管怎么样,肯定是和当前登录的账号关联起来的)
8,到这里,攻击者就可以访问真正的用户在 B 的资源
下面用图来解释。
首先,在授权之前,用户在 a.com 和 b.com 都是有账号的:

正常的授权流程完成后,应该是这个样子:

但是,经过攻击者这一波操作后,变成了这个样子:

那么,怎么防御这种攻击呢?
方法就是,B 在生成 code 的时候,记录下来,这个 code 是发送给 a.com/attacker 的:
code -> a.com/attacker
然后,当 A 用 code 来兑换 access token 的时候,告诉 B,我这个 code,是从 a.com/recieve_code 收到的:
code <- a.com/recieve_code
B 一比较,就发现这个 code 被人为搬动过,于是拒绝兑换,就可以了。
以上,就是 redirect_uri 这个参数背后的考量。有问题可以直接评论。
如果攻击者操控了 redirect_uri,会怎样?的更多相关文章
- the security of smart contract- 1
https://blog.zeppelin.solutions/the-hitchhikers-guide-to-smart-contracts-in-ethereum-848f08001f05 这个 ...
- Sandworm Attack小结
这个漏洞刚出来时就分析过,当时大致弄明白了原理,但对很多细节和原理还是一知半解.后来开始找工作……今天终于有时间来把欠的这部分功课补上. 这个漏洞网上的各种中英文分析已经很多了,因此这里我只根据自己的 ...
- WebApp 安全风险与防护课堂(第二讲)开课了!
本文由葡萄城技术团队于原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 在昨天的公开课中,由于参与的小伙伴们积极性和热情非常高,我们的讲师Carl ...
- 通过BGP实现流量劫持
BGP BGP全称是Border Gateway Protocol,翻译成中文是边界网关协议,用于全球各个AS之间的路由.它的地位是毋庸置疑的,如果没有它就没有全球的因特网.因为全球各个AS都等价的维 ...
- 【漏洞学习】HOST 头攻击漏洞
日期:2018-03-06 14:32:51 作者:Bay0net 0x01. 前言 在一般情况下,几个网站可能会放在同一个服务器上,或者几个 web 系统共享一个服务器,host 头来指定应该由哪个 ...
- [转]Ethereum-智能合约最佳实践
主要章节如下: Solidity安全贴士 已知的攻击手段 竞态 可重入 交易顺序依赖 针对Gas的攻击 上溢/下溢 工程技术 参考文献 这篇文档旨在为Solidity开发人员提供一些智能合约的secu ...
- Android App加固原理与技术历程
App为什么会被破解入侵 随着黑客技术的普及化平民化,App,这个承载我们移动数字工作和生活的重要工具,不仅是黑客眼中的肥肉,也获得更多网友的关注.百度一下"App破解"就有529 ...
- ASP.NET Aries 入门开发教程3:开发一个列表页面及操控查询区
前言: Aries框架毕竟是开发框架,所以重点还是要写代码的,这样开发人员才不会失业,哈. 步骤1:新建html 建一个Html,主要有三步: 1:引入Aries.Loader.js 2:弄一个tab ...
- 【微信开发】公众号后台设置错误导致的微信redirect_uri参数错误【图】
在微信开发中,如微信网页授权登录,分享到朋友圈自定义内容,微信h5支付时 可能会遇到微信redirect_uri参数错误的情况. 此时除了检查自己代码正确性外,还要检查一下是否正确地设置了公众号后台的 ...
随机推荐
- 【python】Leetcode每日一题-二叉搜索迭代器
[python]Leetcode每日一题-二叉搜索迭代器 [题目描述] 实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterator(T ...
- 仅用 CSS 实现多彩、智能的阴影
背景 有没有想过如何创建从前景元素中继承某些颜色的阴影效果?阅读本文并找出如何实现方法吧! 前几天我经过家得宝(Home Depot,美国家得宝公司,全球领先的家居建材用品零售商),他们正在大规模展销 ...
- 使用C#进行数据库增删改查ADO.NET(一)
这节讲一下如何使用C#进行数据库的增删改查操作,本节以SQL Server数据库为例. .NET 平台,使用ADO.NET 作为与数据库服务器的桥梁,我们通过ADO.NET就可以使用C#语言操作数据库 ...
- MySQL备份脚本,应该这么写
前言: 数据库备份的重要性不言而喻,特别是在生产环境,任何数据的丢失都可能产生严重的后果.所以,无论什么环境,我们都应该有相应的备份策略来定时备份数据库.在 MySQL 中,比较常用的逻辑备份工具是 ...
- InnoDB存储引擎简介
前言: 存储引擎是数据库的核心,对于 MySQL 来说,存储引擎是以插件的形式运行的.虽然 MySQL 支持种类繁多的存储引擎,但最常用的当属 InnoDB 了,本篇文章将主要介绍 InnoDB 存储 ...
- Kubernetes入门,使用minikube 搭建本地k8s 环境
这是一篇 K8S 的 HelloWorld,在学习K8S官方文档时搭建环境搭建的一个记录,照着文档下来还是比较顺利的. 一.安装kubectl 下载 kubectl curl -LO "ht ...
- 软负载Nginx和硬负载F5的优缺点对比
对于数据流量过大的网络中,往往单一设备无法承担,需要多台设备进行数据分流,而负载均衡器就是用来将数据分流到多台设备的一个转发器. a.软件负载均衡解决方案 在一台服务器的操作系统上,安装一个附加软件 ...
- Spring事务明明开启了,为什么没起作用???
一.事务的特性(ACID) 1.原子性(Atomicity):事务是一个原子操作,由一系列动作组成.事务的原子性确保动作要么全部完成,要么完全不起作用. 2.一致性(Consistency):执行事务 ...
- 缓存架构中的服务详解!SpringBoot中二级缓存服务的实现
创建缓存服务 创建缓存服务接口项目 创建myshop-service-redis-api项目,该项目只负责定义接口 创建项目的pom.xml: <?xml version="1.0&q ...
- Windows系统下consul的安装、启动、配置
阅读时长:3分钟 操作系统:Windows10 一.consul的安装 首先在consul.exe文件目录下的地址栏中输入cmd. 接着输入consul指令,敲击回车安装consul. 安装成功后会有 ...