sqli靶场(38~53关)
第三部分主要是堆叠注入。
前言
浅浅地将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 | payload: |
②判断注入点
1 | payload: |
得到注入点为2和3。
③获得数据库名
1 | payload: |
得到数据库名为security。
④获得表名
1 | payload: |
得到用户表名为users。
⑤获得列名
1 | payload: |
得到几个有用的列名:id,username,password
进入正文啦。
38.1增加一个表格test
1 | payload: |

38.2删除表格test
1 | payload: |

38.3在表中实现增加语句
1 | payload: |
可以在数据库中,看到此时users表中已经成功插入一列:

Less-39
本关和第三十八一样,只需要将第三十八的单引号去掉即可。
在users表中插入一列数据:
1 | payload: |
可以在数据库中,看到此时users表中已经成功插入一列:

Less-40
本关和第三十八一样,只需要将第三十八关的’改为’)即可
在users表中插入一列数据:
1 | payload: |
可以在数据库中,看到此时users表中已经成功插入一列:

Less-41
此处与 less-39 是一致的,区别在于 41 错误不回显。所以我们称之为盲注。
在users表中插入一列数据:
1 | payload: |
可以在数据库中,看到此时users表中已经成功插入一列:

Less-42
分析源代码后,得知password 变量在 post 过程中,没有通过 mysql_real_escape_string()函数的处理。因此在登录
的时候密码选项我们可以进行攻击。
42.1创建一个名为Less42的表格
1 | 登录框可以随意输入,甚至可以不输 |
这里要注意一下,表名不能是纯数字,不然创建不了的哦。
可以看到已经成功将Less42的表添加:

42.2删除名为Less42的表
1 | 登录框可以随意输入,甚至可以不输 |
可以看到已经成功将Less42的表删除:

42.3在users表中插入一行数据
1 | 登录框可以随意输入,甚至可以不输 |
可以看到已经成功在users表中添加了一列:

Less-43
本关和第四十二关原理一致,只需要将第四十二关的’换成’)即可。
创建一个名为Less43的表格
1 | 登录框可以随意输入,甚至可以不输 |
这里要注意一下,表名不能是纯数字,不然创建不了的哦。
可以看到已经成功将Less43的表添加:

Less-44
这关与 42 关的区别就在于没有报错信息,但是跟我们用堆叠注入没有什么关系,所以我们可以使用同样方式的 payload。
在users表中插入一行数据
1 | 登录框可以随意输入,甚至可以不输 |
可以看到已经成功在users表中添加了一列:

Less-45
同样的,45 关与 43 关的 payload 是一样的,只不过 45 关依旧没有报错。
创建一个名为Less45的表格
1 | 登录框可以随意输入,甚至可以不输 |
这里要注意一下,表名不能是纯数字,不然创建不了的哦。
可以看到已经成功将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 | payload: |

②获得数据库名
1 | payload: |

(2)利用延时注入
1 | payload: |
这里可以用burp对字符a爆破,得到数据库名第一个字符为s。

(3)导入导出文件 into outfile 参数
1 | payload: |
此时查询结果已经导入到test.txt文件当中了:

(4)利用 lines terminated by上传木马
1 | 将<?php phpinfo();?>转换为十六进制:3c3f70687020706870696e666f28293b3f3e |
此时,可以成功访问text.php:

Less-47
本关的 sql 语句为:
1 | $sql = "SELECT * FROM users ORDER BY '$id'"; |
本关order by后为字符。
(1)利用报错注入
①获得数据库用户名
1 | payload: |
②获得数据库名
1 | payload: |
(2)利用延时注入
1 | payload: |
这里可以用burp对字符a爆破,得到数据库用户名第一个字符为r。

(3)导入导出文件 into outfile 参数
1 | payload: |
此时查询结果已经导入到test.txt文件当中了:

(4)利用 lines terminated by上传木马
1 | 将<?php phpinfo();?>转换为十六进制:3c3f70687020706870696e666f28293b3f3e |
此时,可以成功访问text.php:

Less-48
本关与Less-46的区别在于报错注入不能使用,不进行错误回显,因此其他的方法我们依旧是可以使用的。
Less-49
本关与Less-47关基本类似,区别在于没有错误回显,所以我们可以通过延时注入和导入文件进行注入。
order by的堆叠注入(Less-50~Less53)
Less-50
前面关卡用的方法都可行。
这里就只主要看堆叠的增删操作吧。
50.1添加一个表格
1 | payload: |
可以看到已经成功添加了表格Less50:

50.2删除一个表格
1 | payload: |
可以看到已经成功删除了表格Less50:

Less-51
跟Less-50差不多。只是多了个单引号,后面记得加注释符。
添加一个表格:
1 | payload: |
可以看到已经成功添加了表格Less51:

Less-52
和 less50 是一样的,只是这里的 mysql 错误不会在前台显示,但是对于堆叠注入是一样的利用方式。
添加一个表格:
1 | payload: |
可以看到已经成功添加了表格Less52:

Less-53
和 less51 是一样的,只是这里的 mysql 错误不会在前台显示,但是对于堆叠注入是一样的利用方式。
添加一个表格:
1 | payload: |
可以看到已经成功添加了表格Less53:
