尝试访问

http://mdsec.net/auth/339/

http://mdsec.net/auth/340/

http://mdsec.net/auth/347/

http://mdsec.net/auth/351/

3.生成的数字随机性不强

计算机中的数据极少完全随机。因此,如果由于某种原因需要随机数据,一般通过软件使用各种技巧生成伪随机数字。所使用的一些算法生成看似随机并且在可能的数值范围内平均分布的序列,但有些人只需要少数几个样本,仍然能够准确推导出整个序列。

如果使用一个可预测的伪随机数字发生器生成会话令牌,那么得到的令牌就易于受到攻击者的攻击。

Jetty是一种完全以Java编写的常用Web服务器,它为在其上运行的应用程序提供一种会话管理机制。2006年,NGSSoftware的Chris Anley发现这种机制易于受到会话令牌预测攻击。该服务器使用Java API java.util.Random生成会话令牌。它执行一个“线性同余发生器”(linear congruential generator),通过以下算法生成序列中的下一个数字:

img181a

这种算法实际上是用生成的最后一个数字乘以一个常数,再加上另一个常数,生成下一个数字。得到的数字被截短至48位;然后,算法再将结果进行转换,返回请求方要求的位数。

了解了这种算法和由它生成的一个数字后,就可以轻易推算出接下来将要生成的数字,并且(利用一点数论知识)推导出它之前生成的数字。这意味着攻击者只需从服务器获得一个会话令牌,就可推测出所有当前和将来的会话令牌。

img001  注解  有时,令牌根据一个伪随机数字发生器的输出而生成,因此开发者决定将发生器的几个连续输出连接起来建立每个令牌。开发者认为使用这种方法可建立一个更长因而“更强大”的令牌。但是,这种策略通常是一种误解。如果攻击者能够获得发生器生成的几个连续输出,他们就可以通过它们推断出发生器内部状态的一些信息,因此更容易向前或向后推导发生器的输出顺序。

其他非定制应用程序框架在生成会话令牌时使用极其简单或可预测的熵源,其中许多熵源甚至可以确定。例如,PHP框架5.3.2及早期版本基于客户端的IP地址、生成令牌时的纪元时间、生成令牌时的微秒,以及线性同余发生器来生成会话令牌。虽然其中有几个未知值,但是,一些应用程序可以披露相关信息,从而推断出这些值。社交网络站点可能会记录用户的登录时间和IP地址。此外,该发生器使用的种子是PHP进程启动的时间,如果攻击者对服务器进行监视,就可以将这个值缩定在一个很小的范围内。

img001  注解  这是一个不断发展的研究领域。2001年,Full Disclosure邮件列表指出PHP会话令牌生成过程存在缺陷,但并未证实该缺陷可被利用。2010年,Samy Kamkar最终使用phpwn工具实现了对这一缺陷的利用。

4.测试随机性强度

某些时候,仅仅通过观察,或者通过适度的手动分析,就可以确定一系列令牌的模式。但是,通常而言,需要使用更加严格的方法来测试应用程序令牌的随机性强度。

完成测试的标准方法是应用统计假设测试原则,并采用各种严格的测试查找令牌样本的非随机性。测试过程的主要步骤如下。

(1)首先,假设令牌是随机生成的。

(2)进行一系列测试,通过每个测试观察可能具有某些特征的令牌样本(如果令牌是随机生成的)的特定属性。

(3)对于每个测试,假定以上假设是正确的,计算观察到的特征发生的机率。

(4)如果该几率在某一水平(显著性水平)之下,则否定上述假设,并得出结论——令牌不是随机生成的。

幸运的是,并不需要手动完成上述步骤!当前,Burp Sequencer是测试Web应用程序令牌随机性的最佳工具。该工具可灵活进行各种标准测试,并为你提供易于解释的明确结果。

要使用Burp Sequencer,需要从发布希望进行测试的令牌的应用程序中找到一个响应,如应用程序对发布包含会话令牌的新cookie的登录请求做出的响应。然后,从Burp的上下文菜单中选择“发送至sequencer”(send to sequencer),并在Sequencer配置中设置令牌在响应中的位置,如图7-2所示。还可以配置各种确定如何收集令牌的选项,然后单击“开始捕获”(start capture)按钮,开始收集令牌。如果已经通过其他方法(例如,通过保存某次Burp Intruder攻击的结果)获得适当的令牌样本,则可以使用“手动加载”(manual load)选项卡跳过令牌收集过程,直接进入统计分析阶段。

img182

图7-2 将BurpSequencer配置为测试会话令牌的随机性

获得适当的令牌样本后,就可以对样本进行统计分析了。还可以在收集样本的同时进行中间分析。一般来说,获得更多样本可提高分析的可靠性。Burp需要的最小样本大小为100个令牌,但最好是收集更多样本。如果在分析几百个令牌后,结论表明令牌没有通过随机性测试,那么,可以确定,没有必要再收集其他令牌。否则,继续收集令牌并定期重新进行分析。如果收集了5000个令牌,并且结论表明这些令牌通过了随机性测试,则可以确定这一数量已经足够。但是,为符合正式的FIPS随机性测试,需要获得20 000个令牌样本,这是Burp支持的最大样本大小。

Burp Sequencer在字符和位级别执行统计测试。所有测试结果将进行汇总,以对令牌中的有效熵的位数(这是需要考虑的关键结果)进行总体评估。但是,还可以深入分析每项测试的结果,了解令牌的不同部分如何以及为何通过或未通过每项测试,如图7-3所示。用于每类测试的方法在测试结果下面进行了说明。

img183

图7-3 分析BurpSequencer结果以了解所测试令牌的属性

需要注意的是,Burp会对令牌中的每个字符和数据位单独进行所有测试。许多时候,你会发现,大部分的结构化令牌都不是随机的,这本身并不表示存在任何类型的缺陷。重要的是,令牌应包含足以通过随机性测试的位数。例如,如果某个大令牌包含1000位信息,但其中只有50个位通过了随机性测试,那么,总体而言,该令牌还不如一个完全通过随机性测试的50位令牌可靠。

img001  注解  在进行随机性统计测试时,请记住两个要点。这些要点会影响你对测试结果的解释,并会影响应用程序的安全状态。首先,以完全确定的方式生成的令牌可能会通过随机性统计测试。例如,线性同余伪随机数字发生器,或计算连续数字的散列的算法,可能会生成通过测试的输出。但是,如果攻击者了解该算法和发生器的内部状态,就可以非常准确地正向或逆向推断出它的输出。

其次,未通过随机性统计测试的令牌实际上也许根本无法预测。如果令牌中的特定数据位没有通过测试,这只是说明在该位置观察到的数据位序列包含真正随机的令牌中不可能出现的特征。但是,如果尝试根据观察到的特征预测该数据位在下一个令牌中的值,这样的做法无异于盲目猜测。鉴于需要同时预测大量数据位,作出正确预测的机率非常低。