Projects STRLCPY headers-analyzer Commits 5d9a29df
🤬
  • ■ ■ ■ ■ ■
    HeadersAnalyzer.py
    skipped 29 lines
    30 30  from burp import IScannerCheck
    31 31  from burp import IScanIssue
    32 32  from burp import ITab
     33 +from burp import IExtensionStateListener
    33 34  from javax import swing
    34 35  from java.awt import Font
    35 36  from java.awt.datatransfer import StringSelection
    skipped 1 lines
    37 38  from java.awt import Toolkit
    38 39  import java.lang as lang
    39 40  import re
     41 +import pickle
    40 42  
    41  -class BurpExtender(IBurpExtender, IScannerCheck, ITab):
     43 +class BurpExtender(IBurpExtender, IScannerCheck, ITab, IExtensionStateListener):
    42 44  
    43 45   def registerExtenderCallbacks(self, callbacks):
    44 46  
    45  - print "Loading...\n"
     47 + print "Loading..."
    46 48  
    47 49   self._callbacks = callbacks
    48 50   self._callbacks.setExtensionName("Headers Analyzer")
    49 51   self._callbacks.registerScannerCheck(self)
     52 + self._callbacks.registerExtensionStateListener(self)
    50 53  
    51 54   self.initGui()
     55 + self.extensionLoaded()
    52 56   self._callbacks.addSuiteTab(self)
    53 57  
    54 58   # Variable to keep a browsable structure of the issues find on each host
    55 59   # later used in the export function.
    56 60   self.global_issues = {}
    57 61  
    58  - print "Loaded!\n"
     62 + print "Loaded!"
    59 63  
    60 64   return
     65 +
     66 + def saveExtensionSetting(self, name, value):
     67 + try:
     68 + self._callbacks.saveExtensionSetting(name, value)
     69 + except Exception:
     70 + print ('Error saving extension settings')
     71 +
     72 + # Save current settings when the extension is unloaded or Burp is closed
     73 + def extensionUnloaded(self):
     74 + config = {
     75 + 'interestingHeadersCB' : self.interestingHeadersCB.isSelected(),
     76 + 'securityHeadersCB' : self.securityHeadersCB.isSelected(),
     77 + 'xFrameOptionsCB' : self.xFrameOptionsCB.isSelected(),
     78 + 'xContentTypeOptionsCB' : self.xContentTypeOptionsCB.isSelected(),
     79 + 'xXssProtectionCB' : self.xXssProtectionCB.isSelected(),
     80 + 'HstsCB' : self.HstsCB.isSelected(),
     81 + 'CorsCB' : self.CorsCB.isSelected(),
     82 + 'contentSecurityPolicyCB' : self.contentSecurityPolicyCB.isSelected(),
     83 + 'xPermittedCrossDomainPoliciesCB' : self.xPermittedCrossDomainPoliciesCB.isSelected(),
     84 + 'boringHeadersList' : self.getBoringHeadersList()
     85 + }
     86 +
     87 + for key, value in config.iteritems(): # For each config value
     88 + self.saveExtensionSetting(key, pickle.dumps(value))
     89 +
     90 + return
     91 +
     92 + # Restore last configuration
     93 + def extensionLoaded(self):
     94 + try:
     95 + self.interestingHeadersCB.setSelected(pickle.loads(self._callbacks.loadExtensionSetting('interestingHeadersCB')))
     96 + self.securityHeadersCB.setSelected(pickle.loads(self._callbacks.loadExtensionSetting('securityHeadersCB')))
     97 + self.xFrameOptionsCB.setSelected(pickle.loads(self._callbacks.loadExtensionSetting('xFrameOptionsCB')))
     98 + self.xContentTypeOptionsCB.setSelected(pickle.loads(self._callbacks.loadExtensionSetting('xContentTypeOptionsCB')))
     99 + self.xXssProtectionCB.setSelected(pickle.loads(self._callbacks.loadExtensionSetting('xXssProtectionCB')))
     100 + self.HstsCB.setSelected(pickle.loads(self._callbacks.loadExtensionSetting('HstsCB')))
     101 + self.CorsCB.setSelected(pickle.loads(self._callbacks.loadExtensionSetting('CorsCB')))
     102 + self.contentSecurityPolicyCB.setSelected(pickle.loads(self._callbacks.loadExtensionSetting('contentSecurityPolicyCB')))
     103 + self.xPermittedCrossDomainPoliciesCB.setSelected(pickle.loads(self._callbacks.loadExtensionSetting('xPermittedCrossDomainPoliciesCB')))
     104 + self.boringHeadersList.setListData(pickle.loads(self._callbacks.loadExtensionSetting('boringHeadersList')))
     105 +
     106 + print "Extension settings restored!"
     107 + except Exception as e:
     108 + print "Error restoring extension settings (first time loading the extension?)"
    61 109  
    62 110   def initGui(self):
    63 111  
    skipped 195 lines
    259 307   clipboard = self.getClipboardText()
    260 308  
    261 309   if clipboard != None and clipboard != "":
    262  - model = self.boringHeadersList.getModel()
    263 310   lines = clipboard.split('\n')
    264  - current = []
    265  -
    266  - for i in range(0, model.getSize()):
    267  - current.append(model.getElementAt(i))
     311 + current = self.getBoringHeadersList()
    268 312  
    269 313   for line in lines:
    270 314   if line not in current and not line.isspace():
    skipped 7 lines
    278 322  
    279 323   def remove(self, e):
    280 324   indices = self.boringHeadersList.getSelectedIndices().tolist()
    281  - model = self.boringHeadersList.getModel()
    282  - current = []
    283  -
    284  - for i in range(0, model.getSize()):
    285  - current.append(model.getElementAt(i))
     325 + current = self.getBoringHeadersList()
    286 326  
    287 327   for index in reversed(indices):
    288 328   del current[index]
    skipped 20 lines
    309 349  
    310 350   def add(self, e):
    311 351   source = e.getSource()
     352 +
     353 + current = self.getBoringHeadersList()
     354 + current.append(self.addTF.getText())
     355 + self.boringHeadersList.setListData(current)
     356 +
     357 + self.addTF.setText("New item...")
     358 +
     359 + def getBoringHeadersList(self):
    312 360   model = self.boringHeadersList.getModel()
    313 361   current = []
    314 362  
    315 363   for i in range(0, model.getSize()):
    316 364   current.append(model.getElementAt(i))
    317 365  
    318  - current.append(self.addTF.getText())
    319  - self.boringHeadersList.setListData(current)
     366 + return current
    320 367  
    321  - self.addTF.setText("New item...")
    322 368  
    323 369   # Browses the "global_issues" var.
    324 370   def export(self, e):
    skipped 266 lines
Please wait...
Page is in error, reload to recover