dvwa sql注入
low
一、判断sql是数字型注入还是字符型注入
1.输入1
2.输入1’和1’#
输入1’
报错
输入1’#
不报错
此处判断User ID是字符型的,在sql语句中有 ’ ’ 包裹。
3.检验是否可注入,输入1’ or 1=1#
1后面的 ’ 闭合了id字段,or 1=1 使得where判断语句失效,即使其恒为真,架空了id字段的作用,无论id输入什么,where总是真,所以爆出了表中所有人的姓名。#起到注释作用,注释后面的sql语句,主要是id字段后一个 ’ 。
注意:此处的 ’ 是英文字符。
经过这三步检验,可判断此处为字符型sql注入。
二、进行注入
1.爆出数据库名称
1' union select 1,database()#
得数据库名称为dvwa
2.爆出数据库中的表
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
此处得出dvwa中的表有两个: guestbook,users
3.爆出目标表中的字段名
1'union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
4.爆出目标字段的数据,此处当然是password和user
1'union select user,password from users#
注解:
column_name:列的名称
information_schema.columns:表示所有列的信息(在整个mysql里面)(information_schema:表示所有信息,包括库、表、列)(information_schema.tables:表示所有表的信息)
table_schema:数据库的名称
table_name:表的名称
Medium
此处设置了下拉选择表单,以此来控制用户的输入。对于这种情况,我们可以尝试用burpsuite抓包试试。
图中标红的地方就是我们从网页上选择提交的数据,这里我们就可以按照low级别的操作步骤进行注入测试了。首先测试是字符型注入还是数字型注入。
修改为:1’ or 1=1#
报错
修改为:1 or 1=1
爆出所有用户姓名。说明存在数字型注入。之后的操作就和low中操作一致了。
其中需要注意的一个点是在爆表中字段时,会报出错误
这是因为单引号被转义了,‘变成了\’,这里我们可以用十六进制进行绕过,将字符串users变为十六进制的7573657273
在写sql语句时记得在7573657273前面加上0x表示十六进制。如下图所示
下面直接放最后一步的操作图片。
High
我们看一下源码
对比一下low级别的源码,可以发现high级别的sql语句只是在where语句的后面添加了一个LIMIT 1限定,令其只能输出一个结果。对于这种情况,我们只需在注入的时候加上#注释掉后面的LIMIT 1就可以了。其操作步骤就和LOW级别一样了。