JavaScript 中的魔法哈希攻击

信息安全 哈希 javascript 打字杂耍
2021-08-29 14:17:28

在 PHP 中,当松散类型比较导致完全不同的值被评估为相等时,就会发生魔术哈希攻击,从而导致密码“匹配”而实际上不知道密码。这是一个例子:

<?php
if (hash('md5','240610708',false) == '0') {
  print "'0' matched " . hash('md5','240610708',false);
}

如果执行此操作,您将看到:

'0' matched 0e462097431906509019562988736854

这在使用松散相等==运算符比较两个哈希的 JavaScript 应用程序中是否可行?

JavaScript 是一种弱类型语言,所以我自然会假设可以利用类型强制,因此存在各种安全漏洞。

2个回答

使用疯狂的运算符进行松散类型化==,JavaScript 很容易受到类型杂耍的影响。但它不像 PHP 那样容易受到攻击。

以下是一些在 PHP 中是相同的,但在 JavaScript 中是不同的:

  • '0e111' == '0e222'即使两者都是字符串,PHP 也会将它们视为数字。JavaScript 在尝试将任何内容强制转换为数字之前,需要其中一个操作数是数字。
  • '0eaaa' == 0PHP 会将任何以数字开头的内容解释为数字,而 JavaScript 不会。请注意,在这种情况下,即使 PHP 也需要另一个操作数是数字。

但是,这在 PHP 和 Javascript 中是相同的:

  • '0e111' == 0一个操作数是一个字符串,其后仅包含数字0e(这不太可能随机发生),另一个操作数必须是一个实际数字(而不仅仅是一个看起来像数字的字符串)。

这使得在 JavaScript 中找到带有哈希的类型杂耍漏洞变得更加困难。但这并不意味着它们不存在。使用===.

是的,当然。在 JavaScript 中也可以进行魔法哈希攻击。

JavaScript 运算符在类型杂耍之后==意味着相等

0e123是数字的有效表示(以科学记数法表示

如果客户端可以控制传递给服务器的哈希的类型0,则传递数字将强制 JavaScript 将魔法哈希强制转换为数字,从而进行数字比较:

'0e462097431906509019562988736854' == 0 -> true

运算符的行为==可以在这个等式表中看到。