• [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
  • 相关阅读:
    Centos-7修改yum源为国内的yum源
    让vim显示空格,tab字符,及vim多行注释
    centos查找未挂载磁盘格式化并挂载
    记一次“愉快”的lnmp环境的搭建
    Sublime text3 的安装【解决官网被墙问题】
    php 解决json_encode中文UNICODE转码问题
    linux 下 apache启动、停止、重启命令
    Android利用Fiddler进行网络数据抓包
    ecshop 去版权(前台)
    ecshop 去版权
  • 原文地址:https://www.cnblogs.com/junlebao/p/13708399.html
Copyright © 2020-2023  润新知