x

扫码登录

登录二维码

phith0n

2019 十一月 07

Bypassing+GitHub’s+OAuth+flow+|+Teddy+Katz’s+Blog
这个2.5w刀的漏洞值得学习一下。

简单解释一下。Github在处理OAuth的流程时,会显示一个提示框,询问用户是否同意赋予某个App以权限,当用户点击确认后,会发送一个POST请求到当前地址。

其处理逻辑如下:

if request.get?
显示询问框
else
用户点击确认,这里就赋予App权限
end

现在大部分的Web框架有默认CSRF防御,Github也不例外。默认情况下,GET以外的所有请求都会检查CSRF Token。所以,上述代码理论上是很安全的,因为如果要进入else,必须传入正确的CSRF Token。

但HEAD请求是个例外,通常来说HEAD是和GET的逻辑是完全相同的,只不过HEAD不会返回body,所以HEAD请求也不会进行CSRF检查。

那么问题来了,如果攻击者诱导用户发送一个HEAD请求到上面的逻辑,框架不会检查CSRF Token,然后request.get又是false(因为不是GET请求),最后进入else,成功窃取用户权限。


841524852215812

key

学习了 🐂

lamb陽

学习了グッ!(๑•̀ㅂ•́)و✧

kingkk

感觉这种if request.get的操作应该不少[捂脸]

凌舞

学到了。

心态决定人生

类似这种,是不是设置白名单有效,例如只允许get,post方法,实际过程中也这么在用

phith0n

@心态决定人生

不一定,有些框架,只要写了get方法,那么head也就直接支持了。

心态决定人生

@phith0n

嗯,学习了[抱拳]

上杉夏缃

学到了

Nobody

那么问题来了,如何让浏览器带身份凭证发起HEAD请求呢?表单只支持GET和POST,CORS的预检请求是OPTIONS[衰]

phith0n

@Nobody

只要mode是no-cors,就不会发options请求。可以开着控制台看下 test+fetch

Nobody

@phith0n

get,多谢p牛[强]

魂淡

那么 怎么发head请求呢……

phith0n

@魂淡

前面的评论也可以多看看,有给出一个example代码: test+fetch