SSO单点惹了一个问题

0x00 前言

遇到一个很奇葩的站,为什么说奇葩尼?因为某家公司开发了几个系统,而且都不算小,它居然使用cookie作为验证手段,导致出了一些漏洞?它为什么使用cookie登陆尼?

0x01 SSO单点登陆三种方式

现在基本上只要涉及几个系统,都会采用SSO的模式,实现快捷登陆。因为各个系统不处于同一台服务器上,导致SESSION无法共享,所以SSO使用ticket、JWT、共享Cookie的方式进行验证。其中最常见的就是使用ticket,JWT和共享Cookie使用比较少。

0x02 SSO使用共享cookie的流程

1、用户访问某个子系统a.test.com,发现如果未登录,则引导用户跳转到SSO登录页面login.test.com;
2、用户输入账号密码登录,登陆成功设置test.com域的Cookie。
3、跳转到a.test.com系统。

最开始提到了,因为a.test.com、login.test.com两个系统处于不同的服务器,session是无法共享的,他是如何判断是否登陆了?
他设计一个算法,验证一个value和另外一个value之间关系。如果通过这个算法匹配上,则登陆成功。
比如a用户的cookie如下:
userid=1&name=lufei1&hashcode=c4ca4238a0b923820dcc509a6f75849b&group=2
每次操作都会验证hashcode==hash(userid)

0x03 安全问题

对于cookie验证,各位都应该碰到过。
1、伪造cookie任意用户登陆,通过猜或者看源码,伪造 cookie userid=1&name=lufei1&hashcode=c4ca4238a0b923820dcc509a6f75849b&group=2,则别人就盗用了我的账户了。
2、越权,修改group字段为1,userid=1&name=lufei1&hashcode=c4ca4238a0b923820dcc509a6f75849b&group=1,则自己的用户处于管理员组。

0x04 总结

软件漏洞的本质是开发。如果熟悉开发,就会熟悉软件的薄弱点,哪里最容易出问题。
这个漏洞属于系统设计的问题,只要在后端加上一个redis存储session就可以了。