堆叠注入为攻击者提供了很多控制权,与仅限于SELECT语句的UNION联合查询攻击不同,堆叠注入可以用于执行任何SQL语句。
联合注入(union injection)是将两条语句合并在一起,union
或者 union all
执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
原理
sql 分号 ;
表示一条语句的结束。如果在分号 ;
的后面再加一条语句,这条语句也可以被执行,这样就可以在一次数据库的调用中执行多个语句。
select * from users where id =1;show databases;
局限性
堆叠注入并不是在每种情况下都能使用的。可能因为API或数据库引擎的不支持,堆叠注入都无法实现。
代码通常只返回一个查询结果,因此,堆叠注入第二个语句产生错误或者结果只能被忽略,我们在前端界面是无法看到返回结果的。因此,在读取数据时,我们建议使用联合注入。同时在使用堆叠注入之前,我们也是需要知道一些数据库相关信息的,例如表名,列名等信息。