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