1. 程式人生 > 實用技巧 >BUUCTF-[SUCTF 2019]EasySQL 1

BUUCTF-[SUCTF 2019]EasySQL 1

好吧這題是我不配 看了網上大佬的WP

payload1:*,1  大佬的解法,好像直接將原始碼猜出來了 select $_GET['query'] || flag from flag
payload2:select1;setsql_mode=pipes_as_concat;select1||flagfromFlag
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 ;

並且只能展示group by的欄位,要是帶有其他欄位便會報錯。
對這種狀態進行修改:

set sql_mode=(select replace  (@@sql_mode,'ONLY_FULL_GROUP_BY','')); 可以使用該語句來將空格替換掉only_full_group_by

STRICTTRANSTABLES:在該模式下,如果一個值不能插入到一個事務表中,則中斷當前的操作,對非事務表不做任何限制。

NOZERODATE:在嚴格模式,不要將 '0000-00-00'做為合法日期。你仍然可以用IGNORE選項插入零日期。在非嚴格模式,可以接受該日期,但會生成警告。

ERRORFORDIVISIONBY

ZERO:在嚴格模式,在INSERT或UPDATE過程中,如果被零除(或MOD(X,0)),則產生錯誤(否則為警告)。如果未給出該模式,被零除時MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作結果為NULL。

NOAUTOCREATE_USER:防止GRANT自動建立新使用者,除非還指定了密碼。

ANSIQUOTES:啟用ANSIQUOTES後,不能用雙引號來引用字串,因為它被解釋為識別符。

PIPESASCONCAT:將"||"視為字串的連線操作符而非或運算子,這和Oracle資料庫是一樣是,也和字串的拼接函式Concat想類似。

參考文章:https://www.cnblogs.com/ophxc/p/12879732.html#

https://www.cnblogs.com/chrysanthemum/p/11729891.html