对SessionId会话攻击的简单理解与分析

写在前面:no doubt I shall emerge from it all a different man, but quite who I’ve not found out.—— 图灵 首先我们要明白什么是SessionId 和什么是 Session:

1,如果我们要想了解SessionId和Session,我们必须先了解Cookies。当我们首次登录某网站时,输入用户名密码后会得到一个cookie,这个cookie会保存在你登录的浏览器(or客户端)中。当你下次重新访问这个页面(网站)的时候首先会判断你的cookies是否过期,如果过期则会让你重新登录,如果没有过期则会直接登录。但是cookie并不是一个很安全的东西,如果B获取到A登录的cookie,在B的PC上依然可以不输入账号和密码进行登入操作。

2,所以部分网站会采用Session与SessionId配合的方式进行登陆判断。我们首先要了解Session是如何产生的,Session与SessionId之间有什么关系:

2.1 Session的产生过程:我么可以简单的理解为<合法用户访问→产生Session→判断SessionId合法性→确定/拒绝返回Session>我么可以简单的理解为如果用户提交的SessionId在服务器的内存中存在,即判断这个用户是合法的。就会返回用户的数据以及可以进行一系列的操作。我们可以简单的理解为:有SessionId就可以或缺到Session内容

2.2 如何产生SessionId?

2.2.1本地产生SessionId且不变:这是一种最常见的产生SessionId的方式,即用户首次访问时,本地产生一个SessionId_A。如果用户输入的账号和密码正确,这个SessionId_A将会存储进服务器。那么拥有这个SessionId_A的所有人都拥有这个账号的操作权限。我们可以简单的理解为:张三家的门第一次用钥匙打开后的一段时间内,可以允许穿白衬衫的人进入。所以如果你穿白衬衫,即使没有要钥匙你依然可以进入张三家。

2.2.2服务器产生SessionId:当用户输入账号和密码的时候,如果输入的账号密码合法,则会返回一个有效的SessionId。用户在一定的时间段内访问这个网站,依旧可以保持登录。同样的,这个也会造成一个问题就是如果你的SessionId泄露,其他人依旧可以拿到Session的内容。这里我们可以理解为和上一种方法有相同的弊端:穿着白衬衫就可以进入张三家,但是不同的是这次的白衬衫牌子只有张三一个人知道,其他人穿着白衬衫还是无法进入张三家。

2.2.3你可能会想开发者是不是吃饱了撑的,为什么要使用2.2.2中的方法产生SessionId?因为这样可以避免一个简单的SessionId会话攻击,下面我们模拟一个场景:

1.Attacker先打开一个网站http://www.baidu.com,然后服务器会回复他一个session id。比如SID=abcdefg。Attacker把这个id记下了。 2.Attacker给UserA发送一个电子邮件,他假装是什么推销什么,诱导UserA点击链接http://unsafe/?SID=abcdefg,SID后面是Attacker自己的session id。 3.UserA被吸引了,点击了http://unsafe/?SID=abcdefg,像往常一样,输入了自己的帐号和口令从而登录到银行网站。 4.因为服务器的session id不改变,现在Attacker点击http://unsafe/?SID=abcdefg后,他就拥有了Alice的身份。可以为所欲为了。

来源:https://blog.csdn.net/du_chao_qun/article/details/51966169

2.3 SessionId的存储:前面我们提到使用单纯的cookies存储登录信息不是一个安全的所以我们使用了SessionId和Session配合的方法。与此同时,但是我们的SessionId终究要存储到本地客户端,所以我们一般采用以下几种存储方法:

2.3.1 使用cookie保存SessionId,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。 2.3.2 由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。 2.3.3 另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。

来源:https://www.cnblogs.com/yaowen/p/4819018.html

2.4 如何伪造SessionId?伪造SessionId的办法大同小异,这里只讲其中一种:【伪造在cookies中存储的SessionId】

在客户端(这里使用Chromel浏览器)按F12进入开发者模式,在console中输入:document.cookies=”key=value”(注:其中的key和value就是SessionId和SessionId的值,即document.cookies=”SessionId=value”)。

2.5 如果我要进行SessionId会话攻击那么难点在哪?

获取有效的SessionId。

3 如何防止“我”变成“张三”,说实话一旦使用SessionId,你就一定会有可能变成“张三”。区别就是这个可能性的高低而已。(如果你不知道什么是“张三”请回看上文。)

3.1 对于普通用户:

3.3.1 不轻易点击陌生人的发来的链接,包括扫描陌生的二维码。

3.3.2 定时清理浏览器的cookies

3.3.3 再有必要打开特殊的网站的时候请使用浏览器的“隐身”“无痕”等模式。

3.2 对于网站的管理者:

3.2.1 使用服务器产生的SessionId返回给用户再进行调用。

3.2.2 设置Session的过期时间,如果有必要可设置更短的有效时间。

3.3.3 如有必要请放弃Session与SessionId的模式,使用基于Token的身份验证模式。

本文仅在安全性上对Session做了简单的评价,在性能方面不做评价,欢迎大神吐槽。 ——歪克士 2019年4月1日


对SessionId会话攻击的简单理解与分析
https://www.wicos.me/jishu/621/
作者
Wicos
发布于
2019年4月1日
许可协议