[SUCTF 2019]EasySQL 1——堆叠注入+sql_mode
前言
个人观点,若有误请指教
预备知识
当 sql_mode 设置了 PIPES_AS_CONCAT 时,|| 就是字符串连接符,相当于CONCAT() 函数
当 sql_mode 没有设置 PIPES_AS_CONCAT 时 (默认没有设置),|| 就是逻辑或,相当于OR函数
废话不多说,来看一下例子就懂了!
-
表
-
set sql_mode=’’;
select 0||name from test; 或者 select name||0 from test;
注:||只会返回0或者1。因为name为字符串,其数值为0。这时返回结果就由数字确定。若数字等于0,则返回为0,;若数字不等于0,则值都为1。||与or的执行结果是一样的,有兴趣的可以自己去尝试。 -
set sql_mode=PIPES_AS_CONCAT;
select 1||name from test; 或者 select name||1 from test;
注: 数字是什么值,结果就是拼接什么值。
解题思路及步骤
-
直接上’引号,结果什么都没有。
-
上数字(不加#)。但什么数字的结果都是一样的。。。
-
上数字(加#)。结果是什么数字就显示什么结果
-
查看表有多少列,出现过滤了,经尝试后发现过滤关键词为order。
注:这里加#是因为本人之前见过的题目(输入参数为数字),其返回的结果与该参数匹配,而不是一致的。而且不管三七二十一直接加上它不香嘛?加上它就不用考虑后面有没有什么东西了。 -
尝试union、select是否被过滤。union被过滤,select没有,但没有union,我要select干嘛?
-
这时想到了堆叠注入(因为本人最近遇到了堆叠注入的题)
-
查询所有数据库名,太开心了,找到注入模式了
-
查询当前数据库的表,发现只有一个Flag表,那么flag应该就在里面
-
想着既然select没有过滤,那我直接堆叠查询好吧,没想到