[SUCTF 2019]EasySQL
输入 show tables# 爆表我们发现了Flag表
1;show columns from Flag;# 查询Flag表的内容
不给我们查,应该是过滤了某些关键字。
我再试了试order by 联合联合查询,依然是返回NO,没辙,学习开始:
这题关键:要想办法让 ||不是逻辑或
解法一:
直接输入 **,1就可的flag
题解:
内置的sql语句为:
sql=“select”.post[‘query’]."||flag from Flag";
如果$post[‘query’]的数据为*,1,sql语句就变成了
select *,1||flag from Flag
即
select *,1 from Flag
也就是直接查询出了Flag表中的所有内容
ps:
通过大佬们的blog知道:
这道题目需要我们去对后端语句进行猜测
1、输入非零数字得到的回显1和输入其余字符得不到回显,来判断出内部的查询语句可能存在有||
2、进一步进行猜测即为select post进去的数据||flag from Flag(含有数据的表名,通过堆叠注入可知),需要注意的是,此时的||起到的作用是or的作用。
解法二:
输入的内容为:
1;set sql_mode=pipes_as_concat;select 1
题解:
我们执行的语句分别为:
select 1
set sql_mode=pipes_as_concat
select 1||flag from Flag
其中set sql_mode=pipes_as_concat;的作用为将||的作用由or变为拼接字符串
这个模式下进行查询的时候,使用字母连接会报错,使用数字连接才会查询出数据,因为这个 || 相当于是将 select 1 和 select flag from flag 的结果拼接在一起.
读出flag
知识点:
select任何一个常数都会在表中新建一列,然后查询出那一列的内容
2.sql_mode:它定义了 MySQL 应支持的 SQL 语法,以及应该在数据上执行何种确认检查,其中的PIPES_AS_CONCAT将 ||视为字符串的连接操作符而非 “或” 运算符