DVWA SQL Injection

目录

SQL注入

 Web 程序三层架构

定义

危害

分类

注入过程

绕过方法

SQL注入检测

 单引号判断(判断是否存在注入)

数字型(判断注入类型)

字符型(判断注入类型)

DVWA

LOW

1.判断注入类型

2.判断字段数

3.判断回显位置

4.获取当前数据库 

5.获取数据库中的表

6.获取表中的字段名

7.获取数据

MEDIUM

1.判断注入类型 

后面步骤的跟low一样,修改id就行,就不一个一个列出来了 

HIGH


SQL注入

 Web 程序三层架构

 三层架构(3-tier architecture) 通常意义上就是将整个业务应用划分为:

    1.界面层(User Interface layer)

    2.业务逻辑层(Business Logic Layer)

    3.数据访问层(Data access layer)。

在 Web 浏览器中输入 www.shiyanlou.com 连接到实验楼服务器。

业务逻辑层的 Web 服务器从本地存储中加载 index.php 脚本并解析。

脚本连接位于数据访问层的 DBMS(数据库管理系统),并执行 Sql 语句。

数据访问层的数据库管理系统返回 Sql 语句执行结果给 Web 服务器。

业务逻辑层的 Web 服务器将 Web 页面封装成 HTML 格式发送给表示层的 Web 浏览器。

表示层的 Web 浏览器解析 HTML 文件,将内容展示给用户。

定义

SQL注入(SQLi)是一种注入攻击,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加,修改和删除数据库中的记录。

原理:WEB应用程序对用户输入的数据没有过滤或者过滤的不严谨并且把用户输入的数据当作SQL 语句带入到数据中去执行。

如果输入正确的用户名 plhwin 和密码 123456,执行的SQL语句为:

1
SELECT uid,username FROM user WHERE username='plhwin' AND password='e10adc3949ba59abbe56e057f20f883e'

上面语句没有任何问题,可以看到页面打印出了登录成功后的会员信息,但如果输入的用户名为 plhwin' AND 1=1-- hack,密码随意输入,比如aaaaaa,那么拼接之后的SQL查询语句就变成了如下内容:

1
SELECT uid,username FROM user WHERE username='plhwin' AND 1=1-- hack' AND password='0b4e7a0e5fe84ad35fb5f95b9ceeac79'

执行上面的SQL语句,因为1=1是永远成立的条件,这意味着黑客只需要知道别人的会员名,无需知道密码就能顺利登录到系统。

在MySQL中,最后连续的两个减号表示忽略此SQL减号后面的语句,目前几乎所有SQL注入实例都是直接采用两个减号结尾,但是实际测试,这个版本号的MySQL要求两个减号后面必须要有空格才能正常注入,而浏览器是会自动删除掉URL尾部空格的,所以我们的注入会在两个减号后面统一添加任意一个字符或单词,所以以 -- hack 结尾。

危害

 猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。
绕过认证,列如绕过验证登录网站后台。
注入可以借助数据库的存储过程进行提权等操作。

分类

(1) 数字型:输入的参数为整数,如ID、年龄、页码等

在 Web 端中经常能看到是例如http://xxx.com/news.php?id=1 这种形式,其注入点 id 类型为数字,所以叫数字型注入点。

这一类的 SQL 语句结构通常为 select * from news where id=1 ,如果攻击者将参数id的值改为1 or 1=1,那么程序中拼接的sql语句则为:select * from news where id=1 or 1=1,因此参数改变了原有的SQL语句结构,导致了SQL注入漏洞攻击。

(2) 字符型:输入的参数为字符串,字符型注入一般要使用单引号来闭合

在 Web 端中也经常能看到例如http://xxx.com/news.php?name=admin 这种形式的URL地址,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句结构通常为

select * from 表名 where name='admin'

当攻击者在参数值admin尾部加入攻击代码' or 1=1,那么拼接出来的sql注入语句为:

select * from news where chr='admin' or 1=1 '

这样SQL语句同样也会被改变,当然攻击者也不仅仅使用这么简单的攻击代码,通常还会使用一些更加复杂的攻击代码,例如

admin' union select 1,2,3,4 or '1'='1 

在程序中拼接SQL语句之后,则变成了

select * from news where chr='admin' union select 1,2,3,4 or '1'='1' 

这样就可以使用union结构将攻击者所感兴趣的内容返回回来

(3) 报错注入:即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中

(4) Boollean注入:可以根据返回页面判断条件真假的注入

(5) 时间注入:不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断

注入过程

 (1).判断是否存在注入,注入是字符型还是数字型

(2).猜解SQL查询语句中的字段数

(3).确定回显位置

(4).获取当前数据库

(5).获取数据库中的表

(6).获取表中的字段名

(7).得到数据(账号密码)

登录管理员后台

绕过方法

 (1)注释符号绕过        

(2)大小写绕过        

(3)内联注释绕过

(4)特殊编码绕过        

(5)空格过滤绕过      

(6)过滤or and xor not 绕过

SQL注入检测

点通常有三种方式:单引号判断,数字型判断,字符型判断.

 单引号判断(判断是否存在注入)

在参数后面加上单引号,比如: http://xxx/abc.php?id=1',若页面返回错误,则存在 Sql 注入。

解释:无论字符型还是整型都会因为单引号个数不匹配而报错

(如果未报错,不代表不存在 Sql 注入,因为有可能页面对单引号做了过滤,这时可以使用判断语句进行注入。)
 

数字型(判断注入类型)

可以使用经典的 and 1=1 和 and 1=2 来判断:


url中输入?id=1 and 1=1 页面依旧正常运行,继续下一步

url中输入?id=1 and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。

解释:当输入 and 1=1时,后台执行 Sql 语句:select * from <表名> where id = x and 1=1,语法正确且逻辑判断为正确,所以返回正常。

当输入 and 1=2时,后台执行 Sql 语句:select * from <表名> where id = x and 1=2,语法正确但逻辑判断为假,所以返回错误。

使用假设法来验证:
假设,果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:

当输入1 and 1=1,1 and 1=2时,后台执行 Sql 语句:

select * from <表名> where id = 'x and 1=1'
select * from <表名> where id = 'x and 1=2'

查询语句将语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。

字符型(判断注入类型)

可以使用 and ‘1’='1 和 and ‘1’='2来判断:
url中输入1' and '1' = '1,页面运行正常,继续进行下一步。

url中继续输入1' and '1' = '2,页面运行错误,则说明此 Sql 注入为字符型注入。

解释:

当输入 and ‘1’='1时,后台执行 Sql 语句:select * from <表名> where id = 'x' and '1'='1'语法正确,逻辑判断正确,所以返回正确。

当输入 and ‘1’='2时,后台执行 Sql 语句:select * from <表名> where id = 'x' and '1'='2'语法正确,但逻辑判断错误,所以返回异常。

同样可以使用假设法来验证。

DVWA

LOW

1.判断注入类型

首先输入一个单引号判断是否存在注入

报错,存在注入

然后用id=1 and 1=1,id=1 and=1=2判断是否为数字型

两个都成功返回,说明不是数字型,应该是字符型

用id=1' and '1'='1和id=1' and '1'='2'试一下

第一个返回正常,说明是字符型

第二个没有返回,逻辑错误,返回异常

2.判断字段数

用order by判断,至到 order by 进行报错时候就是字段数

order by 语句用来根据指定的列对结果集进行排序
order by 1”表示对第一栏位进行排序

发现到3的时候出现了报错,说明字段只有2列

3.判断回显位置

union 运算符可以将两个或两个以上 select 语句的查询结果集合合并成一个结果集合显示,即执行联合查询。需要注意在使用 union 查询的时候需要和主查询的列数相同,而我们之前已经知道了主查询列数为 2,接下来就好办了。

判断回显位置 1' union select 1,2# 

4.获取当前数据库 

判断数据库  1' union select 1,database()#

5.获取数据库中的表

 information_schema是 mysql 自带的一张表,这张数据表保存了 Mysql 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。

 我们输入1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa' #进行查询

又报错,我是真的栓Qshit!!!!!!11!!

查了无数文章后,

是因为编码的问题,通过下载PhpMyAdmin来修改编码,下载好点管理

登录mysql数据库,据说默认用户是root,密码为空密码,可是又报错

空密码登录被禁止 (参见 允许空密码) 的错误。则要修改/phpmyadmin/libraries/config.default.php 文件,

方法1找到下面两行

$cfg['Servers'][$i]['nopassword'] = false;
$cfg['Servers'][$i]['AllowNoPassword'] = false;


将两个false改为true,同时设置 

$cfg['Servers'][$i]['password'] = ”;

方法2,改这个$cfg['Servers'][$i]['host'] 

方法3,卸了重装

都没用,放弃,我只是把尝试过的列出来,如果还有新的方法希望大家告诉我

6.获取表中的字段名

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

表不能获取表名自然也不能

7.获取数据

1' union select user, password from users #

MEDIUM

1.判断注入类型 

无法输入数字,可以用brup抓包进行sql注入,或者用hackbar插件

brup:抓包后发送到repeater,将id修改为1 and 1=1,没有报错

再修改为1' and '1'='1' ,发现报错,所以为数字类型

后面步骤的跟low一样,修改id就行,就不一个一个列出来了 

HIGH

字符类型,之后跟LOW也一样



 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值