SQL注入-md5加密参数漏洞(CTF例题)

漏洞成因

php中的md5函数有一个可选参数,如果开发者写查询数据库函数时使用了这个参数,或者在数据存储时是md5后的字符串形式存储,都有可能产生这个漏洞。
SQL注入-md5加密参数漏洞(CTF例题)_第1张图片

利用方法

md5看似是非常强加密措施,但是一旦没有返回我们常见的16进制数,返回了二进制原始输出格式,在浏览器编码的作用下就会编码成为奇怪的字符串(对于二进制一般都会编码)。
我们使用md5碰撞,一旦在这些奇怪的字符串中碰撞出了可以进行SQL注入的特殊字符串,那么就可以越过登录了。
下面是参考资料的英文原版:
The trick: Raw MD5 hashes are dangerous in SQL

The trick in this challenge was that PHP’s md5() function can return its output in either hex or raw form. Here’s md5()’s method signature:

string md5( string $str [, bool $raw_output = false] )

If the second argument to MD5 is true, it will return ugly raw bits instead of a nice hex string. Raw MD5 hashes are dangerous in SQL statements because they can contain characters with special meaning to MySQL. The raw data could, for example, contain quotes (’ or ") that would allow SQL injection.

在经过长时间的碰撞后,比较常用的是以下两种:
数字型:129581926211651571912466741651878684928
字符型:ffifdyop

你可以使用以下代码验证:


    $a='ffifdyop';
    $b='129581926211651571912466741651878684928';
    $bb=md5($a,TRUE);
    echo $bb;
    echo "\n";
    $cc=md5($b,true);
    echo $cc
    ?>

结果为:
在这里插入图片描述
可以看到,它们都有'or' 结构
就可以构造出必真的结果。

例题(ctfshow-web9)

SQL注入-md5加密参数漏洞(CTF例题)_第2张图片
看起来是一个SQL注入,但是很多探测都没反应。
试试robots协议
在这里插入图片描述
有提示了,把文件下载下来
SQL注入-md5加密参数漏洞(CTF例题)_第3张图片
看来是md5加密,一开始想到的就是md5碰撞,但是非常麻烦。
它加了关键参数true,那就用这个漏洞试试。
这里长度不允许大于10,所以就用字符型。
SQL注入-md5加密参数漏洞(CTF例题)_第4张图片
登录成功

参考资料

漏洞英文资料:https://cvk.posthaven.com/sql-injection-with-raw-md5-hashes

你可能感兴趣的:(网络安全,sql,php,md5,网络安全,信息安全)