译者注:在做ctf中一道web题时,涉及到了MD5在sql中的应用,于是翻到了国外一个小哥的博客,写的非常详细,于是决定翻译一下。
这道题的题目是我们输入一个密码到PHP写的脚本中,计算他的二进制MD5值,传入到sql中用于查询:
SELECT login FROM admins WHERE password = '$raw_md5'
如果我们可以绕过条件判断,我们将可以得到所有的admins账号。
原始的MD5值中(转化为字符串后)可以包含任何字符,并且脚本未加处理就提交给sql语句,这是一个典型的SQL注入问题。
我们要做的就是:构造一个含有'or'1
,所以在链接起来就像:
select * from admins where password = "<trash>"or'1<shit>';
多亏了'or'1
,我们得到了admins表中所有的记录。
数学告诉我们,如果想要求出一个含有'or'1
的杂凑串需要求256 ^ 5 / 11 = 99955602525个哈希值,如果我们每秒运算5000k次,那么我们需要5.5小时才能得到一个可用的哈希值。于是,我们将‘Or’,'OR','oR'加入其中,将速度提升了45倍,现在我们每5分钟就可以得到一个可用的哈希值。
我使用John的修改版本来做暴力破解,但即使是php脚本也会在合理的时间内为您提供所需的内容:
<?php
for ($i = 0;;) {
for ($c = 0; $c < 1000000; $c++, $i++)
if (stripos(md5($i, true), '\'or\'') !== false)
echo "\nmd5($i) = " . md5($i, true) . "\n";
echo ".";
}
?>
我已经计算出了一个密码:ffifdyop,他的哈希值是276f722736c95d99e921722cf9ed621c (‘or’6<trash>)
登录后,我们在二进制文件中看到真正的管理员密码哈希:00071cc0720abd73f61a291224f248d6
网友评论