许多Web系统都会在后台使用SessionID、JWT、CSRF Token或者一次性链接参数来保护用户会话和接口安全,但这些自动生成的标识符并不一定就真的可靠,里面有时会暗藏一些能被猜出来的规律。BurpSuite里的Sequencer工具,就是专门用来检测这类令牌的随机性和不可预测性的,它能帮我们判断攻击者是不是有可能通过规律猜测、重放旧数据或者暴力穷举的方式,伪造出一个有效的令牌。这里得先说明白,Sequencer本身不是一个直接拿来攻击的安全漏洞利用工具,它更像是一个统计分析的帮手,所以我们不能光看它给出的表面结论,还需要把信息熵、字符分布、二进制位分布以及实际的业务逻辑绑在一起,才能得出比较全面的判断。
一、BurpSuite Sequencer怎么分析Token
在正式开始分析之前,一定要先确认准备分析的那个参数确实是一个动态生成的令牌,如果手误把一个固定不变的Cookie、一个普通的时间戳,或者一个从来不发生变化的静态参数送进了工具,那跑出来的结果就完全没有参考价值了。
1、先抓取目标请求
先把BurpSuite的代理功能开启,然后像普通用户一样去正常访问那个目标系统,在操作的过程当中,留意那些会生成令牌的请求,比如登录后系统返回的Session Cookie、藏在网页表单里的CSRF Token、密码找回链接里带上的token参数,或者验证码请求里的参数。等这些请求出现在【HTTP history】列表里面以后,用鼠标右键去点它一下,再从弹出的菜单里选择【Send to Sequencer】,这样目标请求就被送进Sequencer模块了。
2、选择要分析的字段
进到Sequencer界面之后,点一下【Select live capture item】这个按钮,从请求里面把准备分析的那个参数挑出来。Burp可以分析Cookie、自定义Header、URL参数、POST参数以及JSON字段里的值,不过一个请求里往往同时存着好几个动态变化的值,所以我们一定要找准那个真正用在身份认证、会话维持或者防重放控制上的关键令牌,选错了后续的分析就全白费了。
3、开始采集样本
按下【Start live capture】按钮以后,Burp就会自动一遍又一遍地重复发送请求,并且把每次返回的令牌数据都给收集起来。如果样本数量太少,统计结果就不太稳当,所以在实际测试的时候,最好是至少采集几千个样本,碰到安全性要求特别高的系统,还可以再往上加,等采集工作做得差不多了,再切换到分析阶段去查看结果。
二、BurpSuite Sequencer结果怎么看随机性够不够
看Sequencer给出的结果时,不能只扫一眼颜色标记或者那一句简短的评语,而要重点去观察整体评价、信息熵的数值、字符分布的情况,以及位级别上的那些测试结果。
1、先看Overall Result
Burp会先输出一个总结性的评级,比如Excellent、Good、Poor等等,这个评级大致反映了令牌整体的随机程度。如果一上来就显示一个比较差的评价,那多半就说明令牌里面可能存在着某些固定的片段、变化的样子有规律可循,或者是样本的分布有明显的异常。
2、重点看Entropy
Entropy也就是信息熵,它代表的是令牌的不确定程度,熵值越高,攻击者就越不容易猜到下一个令牌会是什么。我们既要看整体的熵值,也得看每个字符位置上的熵,如果发现某些位置上的字符长期不变,或者翻来覆去就只有很少的几个取值,那就说明这些位置其实没有贡献出有效的随机性。
3、检查字符和位分布
一个真正随机生成的令牌,它的字符不应该只挤在少数几个字符上,底层二进制位里的0和1也应该差不多一半一半。如果你发现前几位一直是固定的,后几位却按顺序往上加,或者某些字符只在特定的位置才冒出来,那就要怀疑服务器端的生成逻辑是不是带着什么规律了。
4、查看统计测试结果
Sequencer还会自动跑一系列统计测试,比如单比特测试、游程测试和Poker测试等等,目的就是为了检查令牌的位流是不是存在明显的偏差。单独一两项测试稍微有点异常,还不一定就代表有漏洞,但如果好几项测试连续都不达标,那就需要重点去排查服务器端的生成逻辑了。
三、BurpSuite Sequencer结果不合格怎么继续排查
当随机性的指标看起来不太够的时候,别只停在Burp给出的结果页面,真正的问题通常都藏在服务器端生成令牌和校验的那段代码逻辑里。
1、检查是否拼接时间戳或用户ID
有些系统会把时间戳、用户ID、递增编号和随机数直接拼到一块儿,这样造出来的令牌看上去挺长,但里面其实夹着不少能被人预测出来的东西。如果可预测的那一部分占了太大的比例,令牌的整体安全性就会被拉低。
2、检查随机数生成方式
一个安全可靠的令牌,应该用密码学上安全的随机数源来生成,如果用的是普通的伪随机函数,或者种子是固定不变的,又或者随机算法本身强度就不高,都会让令牌变得更容易预测。特别是碰上一些老系统或者自研框架的时候,这块代码得好好查一查。
3、区分编码和随机性
Base64、Hex、UUID这些只是数据穿在外面的表现形式,并不等于底层就一定够随机。一个看起来又长又复杂的令牌,如果底层数据其实只是时间戳或者递增序号,那照样有可能被攻击者推测出来。
4、继续验证生命周期和绑定关系
Sequencer只负责分析随机性,这并不代表令牌一定就存在能被人利用的风险。我们还得去检查令牌是不是牢牢跟用户身份绑定在一起,能不能被重复使用,有没有设置合理的过期时间,以及退出登录以后它会不会立刻失效。假如随机性稍微差一点,但有效期非常短,风险倒不一定高;反过来,要是随机性很好却可以被长期重放,也照样需要修复。
总结
用BurpSuite Sequencer分析令牌随机性,大概的顺序就是先抓到真实的动态令牌,再把它送进Sequencer去做大批量的样本采集,然后仔细去看总体评价、信息熵、字符分布、位分布和各项统计测试的结果。一旦发现随机性不够,就要回到服务器端去查它是不是把时间戳、用户ID之类的东西硬拼了进去,随机数的来源靠不靠谱,以及令牌的有效期和绑定关系有没有做好。只有当令牌的随机性、有效期、绑定关系和防重放措施都被打理得比较到位,它的可靠性才能得到更好的保证。
