(我被虐到了,嗚嗚嗚)
當 sql_mode 設置了 PIPES_AS_CONCAT 時,|| 就是字符串連接符,相當於CONCAT() 函數
當 sql_mode 沒有設置 PIPES_AS_CONCAT 時 (默認沒有設置),|| 就是邏輯或,相當於OR函數
聽說有大佬就三個字母就解決了,我枯了,payload:*,1
,聽說是直接猜出了源碼select $_GET['query'] || flag from flag
這種方式拼接出來那就是select *,1||flag from Flag
聽說是因為1和任意字符串或數字使用 ||連接 的值都為1
當然還有一種解法,那是官方的解法: 1;set sql_mode=PIPES_AS_CONCAT;select 1
拼接完之后就是select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag
|| 相當於是將 select 1 和 select flag from flag 的結果拼在一起
sql_mode : 它定義了 MySQL 應支持的 SQL 語法,以及應該在數據上執行何種確認檢查,其中的PIPES_AS_CONCAT將 ||視為字符串的連接操作符而非 “或” 運算符
關於MYSQL的sql_mode解析與設置
ONLY_ FULL_ GROUP_B:如果在SELECT中的列,沒有在GROUP BY中出現,那么將 認為這個SQL是不合法的,因為列不在GROUP BY從句中,因為這個設置的存在,我們對於group by的用法只能是類似於select * from users group by id ;
並且只能展示group by的字段,要是帶有其他字段便會報錯。
對這種狀態進行修改:
set sql_mode=(select replace (@@sql_mode,'ONLY_FULL_GROUP_BY','')); 可以使用該語句來將空格替換掉only_full_group_by
STRICTTRANSTABLES:在該模式下,如果一個值不能插入到一個事務表中,則中斷當前的操作,對非事務表不做任何限制。
NOZERODATE:在嚴格模式,不要將 '0000-00-00'做為合法日期。你仍然可以用IGNORE選項插入零日期。在非嚴格模式,可以接受該日期,但會生成警告。
ERRORFORDIVISIONBYZERO:在嚴格模式,在INSERT或UPDATE過程中,如果被零除(或MOD(X,0)),則產生錯誤(否則為警告)。如果未給出該模式,被零除時MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作結果為NULL。
NOAUTOCREATE_USER:防止GRANT自動創建新用戶,除非還指定了密碼。
ANSIQUOTES:啟用ANSIQUOTES后,不能用雙引號來引用字符串,因為它被解釋為識別符。
PIPESASCONCAT:將"||"視為字符串的連接操作符而非或運算符,這和Oracle數據庫是一樣是,也和字符串的拼接函數Concat想類似。
太晚了,不搞了qaq,感覺學海無涯啊。