尝试访问

http://mdsec.net/auth/321/

http://mdsec.net/auth/329/

http://mdsec.net/auth/331/

7.2.2 令牌可预测

一些会话令牌并不包含与某个特定用户有关的任何有意义的数据,但由于它们包含某种顺序或模式,允许攻击者通过几个令牌样本即可推断出应用程序最近发布的其他有效令牌,因此具有可预测性。即使推断过程需要做出大量尝试,并且成功率极低(例如,每1000次尝试得到一个有效令牌),自动攻击工具也仍然能够利用这种缺陷在很短的时间内确定大量有效令牌。

与定制应用程序相比,会话管理的商业应用(如Web服务器或Web应用程序平台)中的令牌 可预测漏洞更容易被发现。当向一个定制会话管理机制实施远程攻击时,攻击者所能获得的已发布令牌样本的数量可能受到服务器容量、其他用户的活动、带宽、网络延时等因素的限制。然而,在实验室环境中,渗透测试员可以迅速建立数百万个令牌样本,所有样本都紧密相连,并使用了时间戳,而且可以降低其他用户造成的干扰。

在最简单也是最容易受到攻击的情况下,应用程序使用一个简单的连续数字作为会话令牌。这时,攻击者只需获得两个或三个令牌样本就可以实施攻击,并立即截获当前有效的所有令牌。

图7-1表示正在使用Burp Intruder循环访问一个连续会话令牌的最后两位数字,以查找会话仍处于活动状态可被劫持的令牌值。这时,服务器响应的长度是发现有效会话的可靠指标。并且从中提取的grep特性也可用于显示每个会话登录用户的用户名。

img177

图7-1 会话令牌可预测时查找有效会话的一次攻击

在其他情况下,应用程序令牌中可能包含更加复杂的序列,需要付出一定的努力才能发现。序列的变化形式可能多种多样,但是,根据我们的行业经验,可预测的会话令牌通常来自3个方面:

img002 隐含序列;

img002 时间依赖;

img002 生成的数字随机性不强。

我们将分别讨论这3种情况。

1.隐含序列

有时,对会话令牌的原始形式进行分析可能无法预测它们;但是,对其进行适当解码或解译就可以揭示其中包含的序列。

以下面一组值为例,它是一个结构化会话令牌的组成成分:

img178a

一眼看来,其中并不包含任何模式。然而,粗略检查后发现,令牌中可能包含Base64编码的数据,除大小写混合的字母和数字字符外,其中还有一个+字符,它也是一个有效的Base64字符串。使用Base64解码器对令牌解码,得到以下结果:

img178b

很明显,这些字符串是乱码,并且其中包含非打印字符。通常来说,这表示处理的是二进制数据,而非ASCII文本。将解码后的数据以十六进制表示,得到:

img178c

其中仍然没有明显的模式。然而,如果用前一个数字减去后一个数字,就会得到以下结果:

img178d

隐含的模式立即显露出来。生成令牌的算法如下:用前一个值加上0x97C4EB6A,把结果截短成一个32位的数字,并对这个二进制数据进行Base64编码,使其能够通过基于文本的HTTP协议传输。了解到这一点,就能轻易编写出一段脚本,生成服务器接下来产生的令牌,以及它在被截获的样本之前产生的令牌。

2.时间依赖

一些Web服务器和应用程序使用时间作为令牌值的输入,通过某种算法生成会话令牌。如果没有在算法中合并足够的熵 [1] ,攻击者就可能推测出其他用户的令牌。虽然任何特定的令牌序列本身是完全随机的,但是,如果组合生成每个令牌的时间信息,也许可以发现某种可以辨别的模式。一个忙碌的应用程序每秒会生成大量的会话,因此实施一次自定义攻击就可以成功确定其他用户的大量令牌。

测试一家网上零售商的Web应用程序时,我们遇到以下令牌序列:

img179a

很明显,每个令牌由两个独立的数字组成:前一个数字的递增模式非常简单,很容易推测。后一个数字的递增值每次都有所变化。计算出每个连续令牌的递增值,得到以下结果:

img179b

这个序列并不包含可预测的模式。但显而易见的是,攻击者可以通过自动攻击确定相关的数字范围,通过蛮力攻击发现序列中的有效值。不过,在开始攻击前,等待几分钟后可截取另一个令牌序列:

img179c

将这个令牌序列与第一个序列进行比较,立即得到两个明显的结论。

img002 第一个数字序列继续递增,但是,第一个数字序列后面遗漏了5个值。这可能是因为应用程序向其他用户发布了这5个值,他们在两次测试的间隙登录了应用程序。

img002 第二个数字序列继续增大,其递增形式与第一个序列类似。但是,得到的第一个值比前一个值大539 578,大了许多。

第二次观测的结果立即让人产生警惕,推测时间在会话令牌生成过程中发挥的作用。显然,在两次截取令牌的过程中,应用程序只发布了5个令牌。然而,时间已经过去将近10分钟。最可能的解释是:令牌以秒为时间依赖,并可能以毫秒计算。

确实,预感是正确的。在随后的测试过程中进行一次代码审查,可发现以下令牌生成算法:

img180

考虑对如何生成令牌所做的分析,攻击者可以直接构造一个自定义攻击,获得应用程序向其他用户发布的会话令牌。

img002 继续从服务器中提取紧密相连的新会话令牌。

img002 监控第一个数字的递增情况。如果递增值大于1,可知道应用程序向其他用户发布了一个令牌。

img002 向其他用户发布一个令牌时,可立即知道发布时间的秒上限和下限,因为攻击者拥有在这个令牌之前和之后发布的令牌。由于不断获得新会话令牌,这些界限之间通常只包含几百个值。

img002 应用程序每次向其他用户发布一个令牌,攻击者就实施一次蛮力攻击遍历这个范围内的每个数字,并把这个数字附加到已经发布给其他用户的第一个数字序列后面。攻击者尝试使用建立的每个令牌访问一个受保护的页面,直到尝试取得成功,攻破该用户的会话。

img002 继续运行这个自定义攻击即可截获其他所有应用程序用户的令牌。一名管理用户登录后,整个应用程序将被完全攻破。