1. 背景
失效的身份认证在OWASP TOP 10 2017版中排名第二,它包括错误使用应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥或会话令牌,或者利用其他开发缺陷来暂时或永久性冒充其他用户的身份。而会话令牌劫持是失效身份认证的关键因素。
2. 名词解释
Session-会话,维护用户状态。会话中关联了用户信息。
Token-令牌,是用户身份的验证方式,一般由uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名)组成。
3. 会话&令牌介绍
- Session
session顾名思义就是会话,维护了用户的状态就是会话,这是为了解决HTTP无状态协议问题发明的东东。
session通常的用法是:
- 用户使用账号+密码/手机号+验证码登录
- 后台验证通过后会在Redis会话表里产生一条记录,这条记录就可以称为会话。记录里面有一个随机的唯一值和用户的信息,这个随机的唯一值会返回给客户端保存,以后的接口通过这个唯一值进行鉴权,这个唯一值可以称为sessionId。
- 后台接口带上sessionId,服务器拿到后去表里校验是否存在且有效,有效则鉴权通过,无效则报错
- token
token的状态是保存在客户端的,session是服务端在管理状态。session管理需要在后台存表,管理这个状态,而token后台不需要保存,因为token里自带了信息,比如用户基本信息、过期时间等,后台每次收到直接解密校验即可。
4. 会话令牌劫持
攻击者获取SessionID的方式有多种:
1、 暴力破解:尝试各种Session ID,直到破解为止。
2、 预测:如果SessionID使用非随机的方式产生,则可以通过分析SessionID的强度(长度、字符集以及平均信息量),将其计算出来,例如可以使用Burp Suite中的Sequencer模块对会话进行分析。
- 捕获(劫持):使用网络嗅探,XSS攻击等方法获得。
- 会话固定攻击:Session Fixation是攻击者预先计算一个SessionID,诱使用户使用此SessionID登陆,并使之合法。
会话令牌劫持攻击示意图:
5. 防劫持方案
- 会话令牌生成
- 使用安全的随机函数(如/dev/urandom、security.SecureRandom、CryptGenRandom)生成会话标识。
- 会话标识包括字母、数字,长度不少于32个字符。
- 会话令牌有效期
- 会话令牌有有效期控制,WEB服务有效期不超过4小时,手机/PC客户端有效期不超过7天。
- 会话令牌传输
- 使用HTTPS信道加密传输会话令牌。
- 设置HttpOnly、Secure。通过设置Cookie的HttpOnly属性,可以防止客户端脚本访问这个Cookie,从而有效的防止XSS攻击。通过设置Cookie的Secure属性,可以防止会话令牌通过HTTP传输。
html 代码示例:
Set-Cookie: foo=bar; Path=/; Secure;HttpOnly
- 会话令牌使用
- 会话令牌不通过URL传输。
- 关闭dump request信息的页面,如phpinfo页面,Spring Boot Actuator的trace endpoint。
- 使用User-Agent检测请求的一致性。当User-Agent和客户端IP同时变化时,则使会话令牌失效,需重新登录。
- 使用MAC检测请求的一致性。当客户端MAC地址变化时,则使会话令牌失效,需重新登录。
- 登录前登录后使用不一样的会话令牌。
6. 参考链接
https://blog.csdn.net/Doraemon_wu/article/details/52448766?utm_source=blogxgwz7
https://www.jianshu.com/p/cd1b0a98d5a0
https://www.html.cn/archives/5010
https://cloud.tencent.com/developer/article/1043362
来源:freebuf.com 2020-08-11 16:51:54 by: owensky
请登录后发表评论
注册