sql注入中关于group by 和 with rollup 函数运用

一、函数group by 和with rollup

           group by函数:对进行查询的结果进行分类。group by函数后面跟什么就按什么分类;

         例如  select student group by age(按照年龄将学生分类)    

        with  rollup函数:通常跟在group by函数后面讲分类的数据进行汇总统计,即在group by函数的基础上对数据进行汇总统计;加入with roullup函数后会出现一行password为null

         只进行group by函数:select password from test;

group by函数与with roullup函数进行联合使用

这里是借鉴大佬的文章(http://t.csdn.cn/UH39L

二 、例题:这里以ctfshow上面的一道题进行演示

          进入题目发现是一个登录框

通过点击取消我们得到了源码

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

                     }
            }
    ?>

通过观察源码,我们发现大多数sql注入语句字符都被过滤掉了,所以常规的sql注入思路是行不通的,观察源码,当输入的password和数据库相匹配是才能得到flag、所以我们可以构造group by函数与with rollup函数使数据库中多出一行null的password;所以登录框上不用输入password就行,可以构造出null=null 从而成功登录得到flag;

由于过滤空格所以空格用/**/代替

payload :admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup/**/#

 

posted @ 2022-04-03 20:33  GTL_JU  阅读(1180)  评论(0编辑  收藏  举报