相关知识点
在Mysql
中,当sql_mode
设置了PIPES_AS_CONCAT
时,||
就是字符串连接符,相当于CONCAT()
函数
当没有设置PIPES_AS_CONCAT
时(一般在Mysql
默认没有设置),||
就是逻辑或,相当于OR
解题过程
首先经过简单测试发现该题目是整形注入加堆叠注入,因为当输入数字的时候页面有回显数据,但是输入1'
时回显不正常
当输入1时,页面回显:
尝试堆叠注入,输入1;show databases;
得:
紧接着输入1;show tables;
得:
发现出现了Flag
这个表,当输入1;select * from Flag;
时:
此时多次尝试后可以确定出现了关键词过滤,此时毫无头绪,参考了其他人的wp,有大佬猜到源码的sql语句为select $_GET['query'] || flag from Flag
以及存在两种payload
:
- payload1——
*,1
:该payload带入语句就是select *,1 || flag form flag
,意思就是当字段名为1或者flag的时候从flag表中查询所有数据,而1和任意字符串或者数字使用||
连接的值都为1,所以可以成功执行,且1这个字段在查询时会临时生成一个新的名称为1的列,其内容也为1
-
payload2——
1; set sql_mode = PIPES_AS_CONCAT; select 1
:该payload带入查询语句就是select 1; set sql_mode = PIPES_AS_CONCAT; select 1 || flag form Flag
,该payload实际上执行三条语句:- 语句1:
select 1;
——输出为1; - 语句2:
set sql_mode = PIPES_AS_CONCAT;
——该语句修改sql_mode,使得符号||
变为CONCAT()
功能,没有输出 - 语句3:
select 1 || flag from Flag;
——该语句执行seletc 1 from Flag;
以及select flag from Flag;
并把最后结果合在一起输出
- 语句1: