侧边栏壁纸
  • 累计撰写 19 篇文章
  • 累计收到 4 条评论
CTF

MYSQL注入,虚拟表绕过

eson
2024-04-23 / 0 评论 / 129 阅读 / 正在检测是否收录...

题目

https://ctf.show/challenges#web10-17

# 代码

$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;
       }

    }
}

思路

通过过滤得知,or = 没有被屏蔽,于是尝试构造payload admin'/**/or/**/1=1%23,但是无果,通过搜索学到一个新知识点,这里先把payload放出来,接下来再去分析。
password=&username=admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup%23

知识点

group by 就不用多介绍了,就是对查询结果分组排序,那么with rollup是什么呢?

它是对分组后的结果进行聚合求和,在最后一行生成求和的数据。

但是如果当前列是字符串无法求和的话,求和结果就会变成NULL。

咱们看一下测试:

首先对测试表进行分数求和的写法

Test

然后是在这个的基础上,求出学生的总分数的写法。

Test

可以看出,会在最后一行生成数据,对无法求和的列对应生成为NULL

那咱们回到题目

username=admin' or 1=1 group by password with rollup

这一行语句等于是生成了聚合求和的行,并且把这一行里对应的NULL赋值给了username,那么这一行里面的password对应的也是NULL,所以同时传参password=就可以登录成功了。

2

评论 (0)

取消