常見注入雖然都是在用戶id,帳號密碼等地方進行注入,但有時也可能出現注入點在order by語句之後,如下圖所示:
由於order by往往是放在語句的最後,後面能輸入的內容十分有限,所以此時我們就不能用原先那樣傳統的方式進行注入了,但只要稍微改變一下結構還是可以進行注入的。不過在此之前我們需要學會判斷其是否在order by後面,方法很簡單,在參數後面加個asc(結果升序顯示)、desc(結果降序顯示)來觀察其順序是否改變就行了,如圖(這裏傳入參數不是id,是sort)。
此時說明其爲order by後的注入,接下來我們判斷order by後面接的參數有沒有影響,嘗試注入:left(version()
,1)和right(version(),1)
,發現結果沒影響,說明後面參數隨意,則此時我們可以進行注入,有以下三種注入方式:
① 直接在sort的參數裏注入,如:sort=(select username from users limit 0,1)--+
,此時將會顯示當前表的內容,如圖。
這裏要注意不論我們注入任何查詢,結果能顯示的基本都是有限的,我們無法查詢到我們查詢的信息,例如這裏我們注入:sort=(select group_concat(email_id) from emails)--+
,結果依舊是隻能看當前表的內容。
所以這裏就是相當於一種只有通過盲注才能獲取到信息的狀態,於是對於這種order by後的注入我們一般使用盲注,這裏我們使用報錯注入(當然其他盲注也都可以嘗試):sort= (updatexml (1, concat (0x7e,(select database()),0x7e),1))--+
,如圖發現成功報錯:。
② 使用一些函數,如rand()等,例如:sort=rand(updatexml(1,concat(0x7e,(select database()),0x7e),1))--+
,結果一樣,就不贅述了。
③ 在後面加and,再加入其他語句,例如:sort=1 and updatexml (1,concat (0x7e, (select database()),0x7e),1)--+
,結果也一樣。