2012年(272)
分类: 网络与安全
2012-06-27 13:30:39
06年的时候,有人提出来用benchmark函数产生延时,来进行盲注,类似
SELECT
BENCHMARK(10000000,ENCODE('abc','123')); [around 5 sec]
SELECT BENCHMARK(1000000,MD5(CHAR(116))) [ around 7 sec]
Example: SELECT IF( user = 'root', BENCHMARK(1000000,MD5( 'x' )),NULL) FROM
login
在07年的时候,有篇非常好的paper总结了在sql
injection的时候如何使用这种技巧。
今天看到一篇介绍,居然用Timing Attack 来猜测OpenID的签名!看完之后,我觉得这个作者真的很YY,但是也很敢想啊!
类似OpenID的实现,签名本身算法没有问题,问题是出在字符串比较上
一般都是这样验证签名:
if
(signature(message) == signature_bytes)
return true;
这个 == 的实现,一般都是这么实现的(伪代码):
for (i = 0; i <
a.length; i++) {
if (a[i] != b[i])
return false;
}
return true;
注意到如果一旦发现顺序比较的两个字符不相等,就退出循环了。这和全部跑完再退出循环所花费的时间是不同的。
再精确一点,比较第一个字符就退出,和比较完第二个字符才退出,一直到比较完N个字符才退出,所花费的时间是有细微的差别的!
AAAAAAAAAA
BAAAAAAAAA
CAAAAAAAAA
DAAAAAAAAA
...
XAAAAAAAAA
YAAAAAAAAA
ZAAAAAAAAA
所以作者就利用这种微小的时间差,遍历26个字母,找到正确的那个,然后依次推测第二位、第三位。。。。
作者也回应了比较于网络延时的话可以忽略这种微小的字符比较时间差的问题,他统计了很多次数据,最后得出了一些实验数据,并会在blackhat上公开他的研究成果。
在我看来,有点Mission Impossible的味道,估计实用价值不会太大,不过还是很期待。