好了,你将要对Web应用的授权/会话管理功能进行指纹识别,并且已经识别了一个可能是会话令牌的值,但是从视觉上难以分辨的一团ASCII字符或者混乱的数字值不能提供用法的视觉线索。放弃还是继续?当然是继续!本小节讨论一些确定其内容的方法。
尽管会话数据可能无法立刻理解,但是稍作一些分析(由许多经验支持!)能够找出微妙的线索,实际上可以进行有计划的猜测。例如,有些会话组件相当容易预测,因为它们具有标准格式或者表现出可预测的风格。例如,时间戳可能通过令牌中连续递增的数值识别出来。我们在表5-3中列出常见的针对这种确定性项目的攻击。
提示 我们使用GNU date+%s命令查看当前时间。为了转换为人类可读的格式,试试如下的Perl命令:
perl -e 'use Time::localtime; print ctime(<epoch number>)'
表5-3 常见会话令牌内容
分析编码和加密
视觉上难以分辨的ASCII字符块通常意味着如下两件事之一:编码或者加密。如果是前者,那就是一道曙光。如果是后者,你尽了最大的努力可能也只能得到对应用功能的一点点额外的了解。
挫败编码: Base64是用于Web应用的最流行的编码算法。如果你遇见使用大写和小写罗马字母(A-Z,a-z)和数字(0-9)、+和/符号,并以=结束的编码方案,那么就很有可能是Base64。
编码器/解码器有许多种。例如,第1章中讨论过的Fiddler HTTP分析工具带有一个实用程序,能够编码/解码Base64、URL和16进制格式。Burp和其他流行的HTTP代理应用也支持各种格式的数据编码和解码。
如果你希望编写自己的Base64处理程序,比如自动会话分析,那么Perl能够简化Base64的数据编码和解码。下面是两个编码/解码Base64的Perl脚本(实际上,就是两行Perl代码):
#!/usr/bin/perl # be64.pl # encode to base 64 use MIME::Base64; print encode_base64($ARGV[0]);
解码器如下:
#!/usr/bin/perl # bd64.pl # decode from base 64 use MIME::Base64; print decode_base64($ARGV[0]);
分析加密: Web应用可能使用加密以及/或者散列来保护授权数据。最常用的算法不是像Base64那样的简单编码。但是它们仍然是重放和完成攻击的目标,因此攻击者可能发现识别令牌中的散列和加密值是有益的。
例如,流行的散列算法MD5常用于Web应用。MD5算法的输出始终为128位。因此,MD5 hash可能以三种不同的形式出现:
·16字节二进制摘要: 每个字节为0-255的值(16×8=128)。
·32个字符的16进制摘要: 32个字符在16进制记法中代表128位数字。每个16进制字符代表128位MD5 hash中的4位。
·22个字节的Base64摘要: 128位的Base64表示。
加密的会话令牌很难识别。例如,由数据加密算法(DES)或者三重DES加密的数据通常看上去是随机的。没有识别用于加密字符串的算法的简便规则,尽管倾向于8字节的倍数,但加密也没有长度的限制。我们将在本章的后面讨论更多关于攻击加密的内容。
分析数字边界
识别会话ID中的数字值时,识别这些数字的有效范围可能很有用。例如,如果应用给你一个会话ID 1234567,你能否确定制作一个有效会话ID的数字池?表5-4列出了多种测试以及它们所能提供的关于应用的线索。
表5-4 数字边界
边界测试的好处是可以确定对特定令牌启动暴力攻击的难度。从输入校验或者SQL注入的角度看,它提供了关于应用基础架构的额外信息。