-
首先,select 之后可以接一串數字:1,2,3…只是一個例子,這串數字並不一定要按從小到大排列,也不一定從1開始,這串數字的值和順序是任意的,甚至可以是重復的,如:11,465,7461,35 或11,11,11,11,數字串的長度也是任意的,我們想獲得多少列的數據,就寫多少個數字。
-
我們都知道,select語句在指明要查詢的內容屬性(如select id)后,要加from指明是從哪個數據庫表中獲得數據,在數據庫環境中我們一般會先寫一句use xxxdatabase,之后寫select from語句直接加當前數據庫中的表名就可以了。如果我們沒有聲明使用哪個數據庫,也可以直接寫 select xxxx from security.users(假設要從security數據庫的users表中獲取數據)。而select直接加數字串時,可以不寫后面的表名,那么它輸出的內容就是我們select后的數字,這時我們寫的一串數字就是一個數組(或1個行向量),這時select實際上沒有向任何一個數據庫查詢數據,即查詢命令不指向任何數據庫的表。返回值就是我們輸入的這個數組,這時它是個1行n列的表,表的屬性名和值都是我們輸入的數組,如下圖:
-
那么這個東西有什么用呢?在SQL注入時,我們可以利用它來進行一個快速測試,在Union注入時,如果我們通過測試已經知道了前面語句的字段數,就可以寫入union 注入語句,但存在一個問題,我們雖然可以通過注入獲得想要的信息,但這些信息必須能夠返回到我們手中,對於網頁來說,如何能夠讓數據回顯是至關重要的。例如一個網站的參數傳遞執行的查詢有3個字段,很可能這些字段不是都顯示在網頁前端的,假如其中的1或2個字段的查詢結果是會返回到前端的,那么我們就需要知道這3個字段中哪兩個結果會回顯,這個過程相當於找到數據庫與前端顯示的通道。如果我們直接輸入查詢字段進行查詢,語句會非常冗長,而且很可能還需要做很多次測試,這時候我們利用一個簡單的select 1,2,3,根據顯示在頁面上的數字就可以知道哪個數字是這個“通道”,那么我們只需要把這個數字改成我們想查詢的內容(如id,password),當數據爆破成功后,就會在窗口顯示我們想要的結果。
-
如上所述,select直接加數字串不指向任何數據庫的表,那么如果在后面加上數據庫表的名字呢?結果又會怎么樣,我們做一個實驗如下圖所示:我們查詢一下users表中有什么內容,這個表是什么結構
然后我們輸入select加數字串:
- 這里我們只輸入了4個數字,就返回4列,可以看出,第一行是我們的表格屬性,原來的id,
username等屬性被替換成了這些數字串,而且我們輸入的數字串長度是任意的,輸入幾個數字,就會出現幾個屬性,也就是說返回表的列數是等於我們輸入的數字個數的,而行數與原數據庫表的結構保持一致,原本有3行數據,輸入數字串后仍為3行。