一次会话安全测试漏洞实例总结
场景描述
通过手机号找回密码,如下,输入手机号,验证手机号,输入新密码,提交
漏洞描述
步骤1.按场景所述,打开找回密码页,输入账户(假设账户1)的手机号,验证手机号,然后进入重置密码页面,但是不提交
步骤2.浏览器新开一个标签,打开找回密码页,输入另一个账户(假设账户2)的手机号
步骤3.切换回步骤1的重置密码页面,输入新密码,确认密码,提交。
结果:重置了账户2的密码,账户1的密码保持不变。
原因分析
步骤1和步骤2,步骤3,操作共用一个会话信息,如下:
步骤1,输入账户1手机号码,此时会自动像服务器端发起请求,校验手机号是否存在,同时服务器端收到请求,验证通过后,会在会话中,存储待修改密码的账户信息,形如:sessionid-reset-user=a_user_id
点击发短信并验证通过后,服务器会修改会话中是否可修改密码标识,形如:
sessionid-reset-predicate=true
步骤2. 同步骤1,会导致修改会话信息
sessionid-reset-user=b_user_id
步骤3.在步骤2的基础上,自然的去修改了账户2的密码。
解决方案
这里是一个操作序列步骤1-步骤2-步骤3-步骤4-……,假如操作中断,从步骤1开始,或者之前操作过的某个步骤,那么把这个步骤之后的操作会话信息都清除掉。
例中,进行步骤2操作时,即验证手机号是否存在,就会重置、清除会话是否可修改密码标识信息,
delete sessionid-reset-predicate
这样就可以使漏洞中的步骤3操作失败。