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

    [SUCTF 2019]EasySQL

    0x00 前言

    這題測試出了是堆注入,找到了Flag表,show columns報錯了。

    應該是Flag是被和諧的關鍵字,然後試了一堆被和諧的關鍵字,就不知道怎麼繼續往下做了。

    直接去看大佬WP,然後大佬開頭說“這道題是做起來最輕鬆的,因爲這題泄露了源碼”。。。

    WTF?然後我就掃了下子目錄看看有沒有源碼泄漏,結果每個鏈接都是200,打開又沒有源碼。。(看了另外一個大佬的WP,說是運維異常退出vim留下了代碼,所以我正常的環境是掃不到的)

    不管了,讀源碼。

    0x01 讀源碼

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

    這裏給了黑名單,還有最重要的查詢語句。

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

    顯然,這個查詢語句比一般的語句多了個||,關於它是幹嘛用的我也嘸知,繼續看下去吧。

    大佬的wp給了兩種解法

    • 沒有過濾* 直接select *就完惹(他們懷疑出題人忘記過濾 * 了)
    • 更改配置把||視爲字符串連接符
    payload:
    *,1 => "select *,1||flag from Flag"; (1和flag或運算 和select * from Flag結果拼接)
    
    1;set sql_mode=pipes_as_concat;select 1
    =>"select 1;set sql_mode=pipes_as_concat;select 1||flag from Flag";
    

    0x02 總結

    • ||和sql_mode pipes_as_concat之間的聯系
    • 在測試的時候,發現不用'有回顯,就去掉',沒有去想它的查詢語句是怎樣的
    • black_list裏的關鍵字是非常重要的信息,可以推出我們要用到的

    0x03 參考和感謝

  • 相关阅读:
    AOP面向切面编程
    java中与运算,或运算,异或运算,取反运算
    Java中replace和replaceall的区别
    Satisfying memory ordering requirements between partial reads and non-snoop accesses
    JS判断字符串中是否存在某个字符
    PHP 简介
    PHP 是什么
    mysql substr() 函数
    MySQL 数学函数
    MySQL 字符串截取SUBSTRING()函数
  • 原文地址:https://www.cnblogs.com/rpish/p/12332591.html
Copyright © 2011-2022 走看看