1625-5 王子昂 总结《2017年8月22日》 【连续第323天总结】
A. Natas
B.
Level 27
按照之前sql注入的尿性,username应该是natas28,试一下回复Wrong password确认无误
本来以为是宽字节注入,绕过mysql_real_escape_string()函数
原理是该函数对单引号等字符自动进行转义,在前边添加’\’
单引号字符为0x27,在前边添加’\’后变为0x5c27
如果构造输入0xbf27,即“¿’”,转义以后变为0xbf5c27,而在宽字符集(如GBK)中存在0xbf5c字符,于是将’\’吃掉,从而保持单引号字符起效
这是mysql_escape_string()和addslashes()存在的漏洞
对于增强型的mysql_real_escape_string()函数,会自动检测数据库所使用的字符集;如果不是宽字节字符集,那么该漏洞将无法起效
试了一下发现不行,真正的漏洞在这里:
$query = "SELECT * from users where username='$user'";
$res = mysql_query($query, $link);
if($res) {
if(mysql_num_rows($res) > 0) {
while ($row = mysql_fetch_assoc($res)) {
// thanks to Gobo for reporting this bug!
//return print_r($row);
return print_r($row,true);
}
}
}
return False;
它会返回所有username相符的结果,换言之我们如果能插入另一条用户名为natas28,密码为自定的记录,就会把本来存在的natas28给一起暴露出来
这里可以利用mysql的溢出截断漏洞
由源码可知username varchar(64) DEFAULT NULL