[SUCTF 2019]EasySQL 1

题目环境:
[SUCTF 2019]EasySQL 1_第1张图片

把你的旗子给我,我会告诉你旗子是不是对的。

判断注入类型
1'
回显结果
[SUCTF 2019]EasySQL 1_第2张图片

不是字符型SQL注入

1
回显结果
[SUCTF 2019]EasySQL 1_第3张图片

数字型SQL注入

查所有数据库,采用堆叠注入
1;show databases;
image.png
查看所有数据表
1;show tables;
[SUCTF 2019]EasySQL 1_第4张图片
尝试爆Flag数据表的字段
1;show columns from Flag;
[SUCTF 2019]EasySQL 1_第5张图片

回显错误

到这里,大佬们直接猜出了后端语句
select $_GET['query'] || flag from Flag
我直接好家伙,大佬果然是大佬
||就是SQL里面的逻辑或运算符
第一种解法 添加新列绕过逻辑或运算符:
*,1
那么传到后端语句就是
select *,1 || flag from Flag
这里我问了下文心一言,看完我也理解了

这段SQL代码的含义是:从Flag表中选择所有的列,以及由列flag的值与数字1进行连接生成的新列。
具体来说:
select *:选择所有的列。
1 || flag:这是SQL中的字符串连接操作。它将数字1与flag列的值进行连接。对于每一行,都会生成一个新的字符串,这个字符串是数字1后跟着flag列的值。如果flag列的值本身是一个字符串,那么这两个字符串将被连接起来。
from Flag:从Flag表中选择数据。
因此,这段代码的输出结果将包含Flag表的所有列,以及一个名为“1”的列,该列的值是flag列的值与数字1的连接。

大致意思,就是查看数据表Flag的所有列内容,然后添加了一个由列flag的值与数字1进行连接生成的新列,这个新的列名就叫1,那么猜测或者说就是flag被过滤,我们还能查到flag列的值,因为flag的值复制到了新的列1。
*,0
[SUCTF 2019]EasySQL 1_第6张图片
可以明显看到新的列名0和flag的值连接起来了
*,1
[SUCTF 2019]EasySQL 1_第7张图片
对吧,新列名为1
*,2
[SUCTF 2019]EasySQL 1_第8张图片
还是为1,所有还可以看出Flag数据表的列只能是两个
第二种解法 改逻辑或运算符为字符串连接符:
既然题目内置的是逻辑或运算符,那咱们直接把它改成字符串连接符不就好了嘛(滑稽)
使用set方法定义sql_mode参数设置,PIPES_AS_CONCAT字符串连接符select 1查询第一列
1;set sql_mode=PIPES_AS_CONCAT;select 1
回显结果:
[SUCTF 2019]EasySQL 1_第9张图片
可以明显看出解法1和解法2的回显结果有明显不同

你可能感兴趣的:(CTF做题笔记,web安全,数据库,sql)