DVWA——SQL Injection(LOW)

此文章仅供学习使用,请勿用作违法行为。

目录

注入的前提条件

基本思路

1.判断是否存在注入点,以及注入的类型(字符型/数字型)

2.猜解SQL查询语句中的字段数和字段顺序

3.确定回显点

4.获取当前数据库

5.获取数据库中的表

6.获取表中字段名

7.获取字段中的数据(此时已可以成功获取数据库内容)

注入的前提条件:

  • 参数用户可控:用户可以控制前端传入后端的参数内容
  • 参数可带入数据库进行查询:用户传入的参数可以直接拼接到数据库的SQL语句,且带入数据库查询。

基本思路:

1.判断是否存在注入点,以及注入的类型(字符型/数字型)

要判断是否存在SQL注入,最经典的是单引号判断法(在参数后面加上一个单引号),如果页面返回报错,就是说明存在SQL注入。(原理:无论是字符型还是数字型,都会因为单引号个数不匹配而报错,因为单引号都是成对出现的)

输入1',发现报错,说明存在SQL注入

然后判断一下注入的类型:(通常SQL注入分为两种类型)

  • 数字型:参数
  • 字符型:'参数'

输入1 and 1=1 和1 and 1=2 ,发现执行结果一样,很明显这个and(and之前的语句执行成功才会继续执行后面的语句,or代表前面的执行不成功再去执行后面的,个人感觉判断的时候or没有and靠谱)不执行,说明这个为非数字型的,输入'1' and '1'='1'验证一下这个是否为字符型的,发现报错,即这个是字符类型。

也可以直接拿1' or '1'='1查看是否返回数据,输入后发现返回数据,确定这个为字符型

(这个为万能语句,原理:因为这个为字符型,所以默认格式为:'变量' ,万能是因为这个里面的1被当作变量,意思是变量' or '变量'='变量,即查出所有符合这个条件的结果)

2.猜解SQL查询语句中的字段数和字段顺序

选择order by 是因为order by 从 1 开始计数,0 列不存在,大于查询结果列数会报错,且order by默认降序

使用1' order by 1#查询此SQL中的字段数,order by 递增到3发现报错,说明此字段为2.(#代表注释掉后面的内容,原理同上面说到的万能语句一样,就是让数据库执行的命令从'1' order by 1'变为'1' order by 1)

3.确定回显点

由第二步可以确定此数据库有两个字段,于是判断一下这个数据库的回显点是哪个字段,输入1' union select 1,2#,查看回显点。

然后发现这俩字段都是回显点。

4.获取当前数据库

然后查一下这个当前的数据库名字顺便查一下版本(因为是两个字段,只查一个不显示)

1' union select database(),version()#

(版本和数据库名可以换位置,只需要满足是两个字段即可)

(拓展:也可以查当前操作系统( @@version_compile_os  )和当前用户名( user() ),别忘了最后加#号)

5.获取数据库中的表

第四步中查出来了当前数据库名,接着我们查这个数据库中的表,使用下面这个语法,查出来guestbook和users这两个表

1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#

语法原理:MySQL自带information_schema表 ,这个表保存了 Mysql 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS (数据库管理系统)中的存储的表名和表名所在的数据库。这个查询语句的意思是从数据库dvwa的information_schema.tables表中查出table_name和table_schema这两个字段的内容,刚好之前第二步查出只有两个字段,查出来显示两张表。

也可以用下面这个语句直接查出数据库的所有表:

1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#

6.获取表中字段名

盲猜一波用户名等信息存于user表中,然后查user表中的字段,查询语法如下:

1' union select 1, group_concat(column_name) from information_schema.columns where table_name='users'#

语法原理:group_concat()是一个函数类型,作用是返回一个字符串结果,该结果由分组中的元素连接组合而成。concat()是一个函数类型的语句,作用是将多个字符串连接成一个字符串,其他参考第五步中的语法原理。这个查询语句的意思是从 information_schema.columns表中查出表名为users的字段值并组合拼接在一起。

7.获取字段中的数据(此时已可以成功获取数据库内容)

根据第六步中获取的字段名查询user和password

1' union select user,password from users#

语法原理:union表示联合查询显示

出现以上结果,代表成功获取。

再次强调,此文章仅供学习参考,请勿用作违法行为!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值