关于OAuth的state参数的作用

引用: https://blog.csdn.net/gjb724332682/article/details/54428808

在开发 OAuth认证服务器 的时候,开发者的安全意识不高的话,很可能会忽略 state 参数,从而导致 出现 csrf 漏洞。
但是在说明这个state参数前,有必要了解大部分程序员所写的绑定OAuth账号流程,由于绑定流程很多,这里挑最常见的“用户在第三方网站A上登录后,通过Authorization code方式绑定微博流程(也是这个漏洞常见的场景流程):
1、用户甲到第三方网站A登录后,到了绑定页面。此时还没绑定微博。绑定页面提供一个按钮:“绑定微博”(地址a: http://aaa.com/index.php?m=user_3rd_bind_sina )
2、用户甲点击地址a,程序生成如下地址b(为方便大家查看,参数部分均未urlencode以【】包含显示): https://api.weibo.com/oauth2/authorize?client_id=【9999999】&redirect_uri=【http://aaa.comindex.php?m=user_3rd_bind_sina_callback】&response_type=【code】
3、用户甲浏览器定向到地址b,授权该应用。
4、授权服务器根据传递的redirect_uri参数,组合认证参数code生成地址c: http://aaa.comindex.php?m=user_3rd_bind_sina_callback&code=【809ui0asduve】
5、用户甲浏览器返回到地址c,完成绑定。
咋看起来,好像没啥问题,毕竟code也是不可预测嘛。但是各开发者有没有想过,地址c实质上是和当前登录用户一点关系都没有的,因为地址c只能证明微博用户信息,但无法证明网站A的用户信息。所以漏洞就此产生了——假设有用户乙和丙,同时发起绑定请求,登录到不同的微博账号,然后在第5步后打住,互相交换地址c,会是什么结果?答案就是用户乙绑定了用户丙的微博,用户丙绑定了用户乙的微博了…...攻击者的目标,其实就是要获取自己帐号的地址c,然后诱骗已登录网站A的受害者点击,从而改变了绑定关系。变成绑定到攻击者的帐号了...
为应对这种情况,Oauth 2.0引入了state参数。这个参数在许多开放平台上也会有提及,比如新浪微博的 Oauth2/authorize(http://open.weibo.com/wiki/Oauth2/authorize ): 用于保持请求和回调的状态,在回调时,会在Query Parameter中回传该参数。开发者可以用这个参数验证请求有效性,也可以记录用户请求授权页前的位置。这个参数可用于防止跨站请求伪造(CSRF)攻击。然而大多数开发者(包括许多官方SDK),会忽略使用这个state参数。所以,大面积的网站(不乏大站)确实存在这种漏洞。
但是利用条件也有点苛刻。
攻击者必须了解第三方网站可能的绑定特性,否则攻击极可能失败。绝大多数网站都是一个网站账号只能绑定一个OAuth提供方账号(比如微博帐号)。这种特性,导致这个漏洞在绝大多数网站根本无法快速撒网,只能定向劫持未绑定的用户到攻击者OAuth账号上,而攻击一次后,这个账号必须解绑才能用于别的攻击,导致利用难度增大不少。
攻击者还必须了解被定向劫持用户的上网习惯。在这个漏洞中,绝大部分都需要受害者在第三方网站上处于登录状态,否则攻击基本失效。
攻击者还必须了解第三方网站、以及用户在该第三方网站上存在的利益。现在的攻击有许多都是带有利益的,如果是电商类的话,网站本身的金钱利益驱动可能存在,但又需要判断该用户在该网站是否存在高价值,这就增加了额外的工作量;如果只是娱乐类网站,除了言论相关和用户所拥有的网站管理权,我还想不出有什么可以吸引攻击者去定向攻击。
以上各种条件造就了在攻击实施环节更像是那种一对一的淘宝或者QQ钓鱼手段、或者放入针对高价值目标的社工(或APT)一环中。就前者而言,淘宝、QQ甚至各类热门游戏的钓鱼量之大,安全研究者们应该更清楚;就后者而言,实质还有其它更有效地手段。那么,这个漏洞,还能冠以“最大规模帐号劫持”吗?我相信,地下产业者看到后只会轻蔑的笑一下,然后继续埋头干活

对于开发者而言,要修复这个漏洞,就是必须加入state参数,这个参数既不可预测,又必须可以充分证明client和当前第三方网站的登录认证状态存在关联(如果存在过期时间更好)。其实,随机算一个字符串,然后保存在session,回调时检查state参数和session里面的值,就满足要求了。

总结

实现方式:

state生成随机算一个字符串,用guid吧,然后保存在当前用户的session,回调时检查state参数和当前用户session里面的值是否一致.

攻击者无法猜对方的state值是多少.  就无法拼出用于攻击的url.



原文地址:https://www.cnblogs.com/chencidi/p/9240521.html

时间: 2024-10-14 19:55:38

关于OAuth的state参数的作用的相关文章

php编译参数注解--不明白许多参数的作用 慎用 –with-curlwrappers参数

在Linux下安装PHP,源代码方式安装,总需要配置很多参数.这里列出常用配置参数,并详细用中文解释说明了.给大家一些参考 编译PHP的时候慎用 –with-curlwrappers参数 ./configure --prefix=/usr/local/PHP                                   php 安装目录 --with-apxs2=/usr/local/apache/bin/apxs     表示使用apache2.0以上版本,apxs表示使用的apache

中文编解码,可用于存中文或者编码具体参数的作用,防止被知道

1 BASE64Encoder base64=new BASE64Encoder(); 2 String encoderStr=base64.encode(string.getBytes("utf-8")); 3 System.out.println(encoderStr); 4 5 BASE64Decoder base64decoder=new BASE64Decoder(); 6 byte b[]=base64decoder.decodeBuffer(encoderStr); 7

jQuery ajax的traditional参数的作用///////////////////////////////////zzzzzzzzzzz

jQuery ajax的traditional参数的作用 i33 发布时间: 2013/04/03 10:05 阅读: 9859 收藏: 9 点赞: 1 评论: 0 一般的,可能有些人在一个参数有多个值的情况下,可能以某个字符分隔的形式传递,比如页面上有多个checkbox: $.ajax{ url:"xxxx", data:{ p: "123,456,789" } } 然后后台获取参数后再分隔,这种做法有很大弊端,试问如果某一个参数值中出现了分隔符所使用的字符,会

Jquery中Ajax异步请求中的async参数的作用

之前不知道这个参数的作用,上网找了前辈的博客,在此收录到自己的博客,希望能帮到更多的朋友: test.html <a href="javascript:void(0)" onmouseover="testAsync()"> asy.js function testAsync{ var temp;     $.ajax({         async: false,         type : "GET",         url :

proxy_redirect参数的作用

Nginx的代理功能太完善了,我们看看proxy_redirect参数的作用. 案例说明: 要做一个html.aslibra.com的域名处理很多网站的html内容,当然是后端的服务器了,目录分析 html.zcom.com/img.aslibra.com/ html.zcom.com/css.aslibra.com/ 访问的域名是该目录下的域名,那前端nginx的配置应该类似这样: server { server_name img.aslibra.com; location / { rewri

Linux&quot;三剑客&quot;一些常见的用法及一些参数的作用

今天分享一点Linux"三剑客"的一些用法和参数的作用grep 过滤 ""单引号 所见即所得双引号 特殊符号会被解析反引号 线运行里面命令 显示到屏幕上留下来 grep 过滤 "" -n 显示行号" . " 任意一个字符-v 排除,去反-o 逐行输出 每次匹配到了什么-l 只显示文件名 -E sed 取行 替f换 -i 修改文件的内容-a 给每一行下面追家内容sed 'a wode ' lidao.txt-r 支持正则-n 取

mysql的jdbc.url携带allowMultiQueries=true参数的作用及其原理

如下配置 jdbc.url=jdbc:mysql://127.0.0.1:3306/chubb_2?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true allowMultiQueries=true参数的作用: ①可以在sql语句后携带分号,实现多语句执行. 如:mybatis的mapper.xml文件 <select id="getAll" re

backward的gradient参数的作用

backward的gradient参数的作用 待办 https://zhuanlan.zhihu.com/p/29904755 https://zhuanlan.zhihu.com/p/29923090 讲的backward 偏导数计算的过程 https://medium.com/@zhang_yang/how-pytorch-tensors-backward-accumulates-gradient-8d1bf675579b backward计算过程 原文地址:https://www.cnbl

JavaScript window与undefined作为参数的作用

1.原函数 输出结果:1 如图: 2.加window的参数 输出结果:window对象 如图: 注意:此时的window不是全局变量,而是局部变量 3.关于形参必须传window么?当然是不需要的 输出结果:window对象 如图: 形参可以传任意字符,只要实参传的是window.函数 4.作用一    代码会被压缩,节省空间 5.作用二   提高性能 函数在执行过程中,能在参数中找到window,就不用去全局作用域中找,即效率高,提高性能. 6.是否可以实参也不传? 可以,实参形参都不传,内部