雖然解完了blind injection,但總覺得......好像哪裡怪怪的,有點不太blind的感覺,覺得好像太順利了
所以,今天要來寫有關blind injection時可能會需要去驗出的東西
然後說是好聽的sql blind injection plus, 其實就是介紹一些可以查資料表其他資料的參數
因為我發現webgoat sql blind injection那裏好像找不到表格名稱,完全沒辦法繼續
首先,要來介紹我們的新東西information_schema
他主要是用來查詢關於資料庫的結構資訊的,例如說TABLES(資料表資訊) COLUMNS(欄位資訊) 等等
information_schema.TABLES 用來查詢資料表格的索引資料E.g.TABLE_NAME表格名,TABLE_ROWS表格列數,TABLE_SCHEMA所屬資料庫名稱
information_schema.COLUMNS 記錄所有資料表中欄位的詳細資訊E.g COLUMN_NAME欄位名稱 DATA_TYPE資料類別 等等
我們可以先從length開始,length可以讓我們知道表格名稱字元長度
' AND length((SELECT table_name FROM information_schema.tables WHERE table_schema=current_database() LIMIT 1 OFFSET 第幾張表)) = 表格字數 --
這裡剛好也展示了一個技巧,length, substring之類的函式裡面是可以塞SELECT的,只是要用()包起來
current_database()可以讓我們在不知道資料庫名稱的情況下選擇當前的資料庫
LIMIT是用來選擇表格的,用法是LIMIT 選取幾筆 OFFSET 跳過幾筆
接著,我們能用之前一樣的Substring查詢資料庫表格名稱
' AND substring((SELECT table_name FROM information_schema.tables WHERE table_schema=current_database() LIMIT 1 OFFSET 第幾張表), 第幾個字, 1)) = '字元'
我們不一定知道欄位的名稱,例如一個PASSWORD有可能被寫成passwd, paswd之類的形式,所以我們也要把它測試出來,測試方法和之前基本上一樣
欄位名稱字元長度
' AND length((SELECT column_name FROM information_schema.columns WHERE table_name = '表格名稱' LIMIT 1 OFFSET 第幾欄)) = 欄位字數;--
測試欄位名稱確切字元
' AND substring((SELECT column_name FROM information_schema.columns WHERE table_name = '表格名稱' LIMIT 1 OFFSET 第幾欄),第幾個字,1) = '字元';--
基本上都一樣,只是要 SELECT 的東西變成 column_name, 然後是從 information_schema.columns 這個表中撈出資料