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,成功窃取用户权限。
key
lamb陽
kingkk
凌舞
心态决定人生
phith0n
@心态决定人生心态决定人生
@phith0n上杉夏缃
Nobody
phith0n
@NobodyNobody
@phith0n魂淡
phith0n
@魂淡