目錄
第46關 order by注入
第47關 '閉合的order by注入?
第48關 無報錯回顯的數字型order by注入
第49關 無報錯回顯的'閉合型order by注入
第50關 基于order by的堆疊注入
第51關 '閉合的報錯注入或堆疊注入
第52關 數字型盲注或堆疊注入
第53關 '閉合的盲注或堆疊注入
第46關 order by注入
輸入?sort=1和?sort=2看一下頁面顯示。發現返回的數據相同,但是順序不同,猜測可能是利用了order by排序語句。當sort=1時是根據第一列的字段id來排序,sort=2時根據username字段排序。
?在參數后面加上單引號,回顯了報錯信息,那么使用報錯注入試試吧。
第47關 '閉合的order by注入?
和上關的區別是使用了單引號包裹,要注意的是,這會導致 SQL 語句將$id當作一個字符串常量來處理,而不是列名或排序索引。由于字符串常量沒有實際的排序意義,MySQL 會忽略這個排序條件,通常會按照表中數據的默認順序返回結果,也就是插入數據時的順序或者存儲引擎決定的物理順序。所以,無論你輸入什么值,返回的結果順序都不會改變。
第48關 無報錯回顯的數字型order by注入
利用布爾盲注,構造表達式來影響排序結果。
#如果數據庫名長度>5,則按第一列排序,否則按第二列排序;
order by if(length(database())>5,1,2)
這里數據庫名長度是8,大于5會按第一列排序,寫大于10也會按照第一列排序。因為MySQL 優化了常量表達式:當 IF 的兩個分支都是常量時,MySQL 可能認為無論條件如何,排序規則都不變,因此忽略條件判斷。所以應該避免使用常量作為排序鍵,改用與數據相關的表達式。
正確的語法構造是:
#如果條件為真,按 id 列排序,否則按 username 列排序;
order by if(length(database())>5,id,username)
第49關 無報錯回顯的'閉合型order by注入
這關可以利用時間盲注,但是注意點較多。
?sort=1' and if(length(database())<10,sleep(0),sleep(5)) --+
1.將IF判斷設置為,true馬上響應,false延遲響應。因為order by是對結果集進行排序,每一行都會計算一次,所以會導致多次延遲(行數次延遲),而且MySQL在排序時可能會優化,利用sleep函數時頁面會一直處于長時間加載狀態,最終會超過服務器允許的最大響應時間,而被強制終止,返回 500 錯誤。
2.order by 后面不能直接跟and,它的語法結構只接受列名、表達式或數字位置。不過可以在排序表達式里使用包含and的邏輯條件來實現更復雜的排序規則。
3.這條注入語句破壞了原本正常的order by邏輯。原本order by期望的是列名,注入后變成了一個布爾表達式和 sleep 函數的組合,數據庫無法按此進行有效的排序,所以結果可能會是亂序。
第50關 基于order by的堆疊注入
本關使用了mysqli_multi_query函數,那么直接堆疊注入。
?
第51關 '閉合的報錯注入或堆疊注入
第52關 數字型盲注或堆疊注入
第53關 '閉合的盲注或堆疊注入
這三關就是把前面的幾關結合在一起,使其有多種解題方法。