2009年5月1日 星期五

substring and benchmark

这几天碰到一个用zen cart架设的站,版本为1.3.7. 去cn官网和com官网分别看了下,然后down了两个不同版本不同语言的源码回来。因为在网上找到一些信息,有一个sql injection < 1.3.8a存在。不过网上只透露了该漏洞存在的文件和代码,关于利用,只有一句sql查询:
products_id[-99' UNION SELECT IF(SUBSTRING(admin_pass,1, 1) = CHAR(97),BENCHMARK(1000000, MD5(CHAR(1))), null),2 FROM zencart_admin/*]

开始时没注意到,发现漏洞的人substring的是admin_pass,还以为是admin_name,想想如果admin_name的第一个字符ascii值为97,也就是为a,则benchmark一下,估计有希望,就开始测试。妈的,测试了才发现,完全是扯淡嘛!

启明星辰漏洞公告里写的还什么黑客可以利用进行恶意sql查询或控制数据库…… 我真想骂他,你来个试试看?

admin_pass是md5加密后放在数据库里的,即使通过benchmark延时的方法能够猜出来admin_name,但是admin_pass的32位hash呢?那不是几乎等于暴破了吗?更何况对方的表前缀还不一定是什么呢, zen_ ? zencart? 又或者是完全自定义的……

结论:猜admin_name的命中率完全等于攻击者的人品,而猜admin_pass的命中率为16*32次,每一位要猜16次,不过按照正态分布来看的话,平均每一位字符猜8次命中,那么也需要8*32次。

因此,该漏洞行不通,纯属鸡肋。不过通过这个我倒是想到了另外一点,就是无论如何,sql注入(注射)工具都无法替代手工。因此,渗透测试的自动化工具,甚至是框架,都是不可能的。

0 评论: