1. 程式人生 > 其它 >SELECT 1,2,3...的含義及其在SQL注入中的用法

SELECT 1,2,3...的含義及其在SQL注入中的用法

  首先,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行。