7
7
from java .io import File
8
8
from java .awt .datatransfer import DataFlavor , StringSelection
9
9
10
+ import os
10
11
class PluginUI ():
11
12
def __init__ (self , extender ):
12
13
self .extender = extender
@@ -66,9 +67,9 @@ def clearPayloadButtonAction(self, event):
66
67
self .writePayloadsListFile ()
67
68
68
69
def addPayloadButtonAction (self , event ):
69
- if str (self .textNewPayload .text ).strip ():
70
- self .extender .PayloadList .append (self .textNewPayload .text )
71
- self .textNewPayload .text = ''
70
+ if str (self .textPayload .text ).strip ():
71
+ self .extender .PayloadList .append (self .textPayload .text )
72
+ self .textPayload .text = ''
72
73
self .listPayloads .setListData (self .extender .PayloadList )
73
74
self .writePayloadsListFile ()
74
75
@@ -87,10 +88,9 @@ def toFileButtonAction(self, event):
87
88
if (fileChooser .showSaveDialog (self .mainPanel ) == JFileChooser .APPROVE_OPTION ):
88
89
file = fileChooser .getSelectedFile ()
89
90
self .extender .generatePayloads ()
90
- result = '\n '
91
- result = result .join (self .extender .tamperedPayloads )
91
+ result = '\n ' .join (self .extender .tamperedPayloads )
92
92
with open (file .getAbsolutePath (),'w' ) as writer :
93
- writer .writelines (result )
93
+ writer .writelines (result . encode ( 'utf-8' ) )
94
94
self .showMessage ('{} url encoded payload written to file' .format (len (self .extender .tamperedPayloads )))
95
95
96
96
def tamperPayloadButtonAction (self , event ):
@@ -128,6 +128,68 @@ def readPayloadsListFile(self):
128
128
result .append (line .strip ('\n ' ))
129
129
return result
130
130
131
+ def restoreDefaultsButtonAction (self , event ):
132
+ self .extender .callbacks .saveExtensionSetting ('SQLiQueryTampering_PayloadsDirectory' , None )
133
+ self .textPayloadsDir .text = ''
134
+ self .textPlainPayload .text = ''
135
+ self .textTamperedPayload .text = ''
136
+ self .comboProcessorTech .setSelectedIndex (0 )
137
+
138
+ varName = 'SQLiQueryTampering_{}'
139
+ self .chkGeneral .setSelected (1 )
140
+ tmpVarName = varName .format (self .chkGeneral .text )
141
+ self .extender .callbacks .saveExtensionSetting (tmpVarName , '1' )
142
+
143
+ for item in (self .chkMAXDB ,self .chkMSSQL ,self .chkMSAccess ,
144
+ self .chkPostgres ,self .chkOracle ,self .chkSqlite ,self .chkMysql ):
145
+ item .setSelected (0 )
146
+ tmpVarName = 'SQLiQueryTampering_{}' .format (item .text )
147
+ self .extender .callbacks .saveExtensionSetting (tmpVarName , '0' )
148
+
149
+ self .extender .PayloadList = [
150
+ "%" ,
151
+ "'" ,
152
+ "''" ,
153
+ "\" \" " ,
154
+ "\" " ,
155
+ "'\" --" ,
156
+ "'; waitfor delay '0:30:0'--" ,
157
+ "1;waitfor delay '0:30:0'--" ,
158
+ "(\" ,)')(,(("
159
+ ]
160
+ self .listPayloads .setListData (self .extender .PayloadList )
161
+ self .writePayloadsListFile ()
162
+
163
+ def readPayloadsFromDir (self , directory ):
164
+ result = []
165
+ for root , subdirs , files in os .walk (directory ):
166
+ for name in files :
167
+ fPath = os .path .join (root , name )
168
+ with open (fPath ,'r' ) as reader :
169
+ for line in reader .readlines ():
170
+ result .append (line .strip ('\n ' ))
171
+ return result
172
+
173
+ def dirBrowseButtonButtonAction (self , event ):
174
+ fileChooser = JFileChooser ()
175
+ fileChooser .dialogTitle = 'Choose Directory'
176
+ fileChooser .fileSelectionMode = JFileChooser .DIRECTORIES_ONLY
177
+ if (fileChooser .showOpenDialog (self .mainPanel ) == JFileChooser .APPROVE_OPTION ):
178
+ file = fileChooser .getSelectedFile ()
179
+ varName = 'SQLiQueryTampering_PayloadsDirectory'
180
+ path = file .getAbsolutePath ()
181
+ self .extender .callbacks .saveExtensionSetting (varName , path )
182
+ self .textPayloadsDir .text = path
183
+ self .extender .PayloadList = self .readPayloadsFromDir (path )
184
+ self .listPayloads .setListData (self .extender .PayloadList )
185
+ self .showMessage ('{} payloads loaded' .format (len (self .extender .PayloadList )))
186
+
187
+ def reloadPayloadsButtonAction (self , event ):
188
+ path = self .textPayloadsDir .text
189
+ self .extender .PayloadList = self .readPayloadsFromDir (path )
190
+ self .listPayloads .setListData (self .extender .PayloadList )
191
+ self .showMessage ('{} payloads loaded' .format (len (self .extender .PayloadList )))
192
+
131
193
def initComponents (self ):
132
194
TabbedPane1 = JTabbedPane ()
133
195
GeneratorScrollPane = JScrollPane ()
@@ -136,6 +198,19 @@ def initComponents(self):
136
198
jlbl2 = JLabel ()
137
199
spanePayloadList = JScrollPane ()
138
200
self .listPayloads = JList ()
201
+ OptionsScrollPane = JScrollPane ()
202
+ self .textPayloadsDir = JTextField ()
203
+ ProcessorPanel1 = JPanel ()
204
+ dirBrowseButton = JButton (actionPerformed = self .dirBrowseButtonButtonAction )
205
+ restoreDefaultsButton = JButton (actionPerformed = self .restoreDefaultsButtonAction )
206
+ reloadPayloadsButton = JButton (actionPerformed = self .reloadPayloadsButtonAction )
207
+ OptionsScrollPane = JScrollPane ()
208
+ OptionsPanel = JPanel ()
209
+ jlbl6 = JLabel ()
210
+ jlbl7 = JLabel ()
211
+ jlbl9 = JLabel ()
212
+ jlbl10 = JLabel ()
213
+ jSeparator3 = JSeparator ()
139
214
pastePayloadButton = JButton (actionPerformed = self .pastePayloadButtonAction )
140
215
loadPayloadButton = JButton (actionPerformed = self .loadPayloadButtonAction )
141
216
removePayloadButton = JButton (actionPerformed = self .removePayloadButtonAction )
@@ -172,12 +247,19 @@ def initComponents(self):
172
247
173
248
jlbl1 .setForeground (Color (255 , 102 , 51 ))
174
249
jlbl1 .setFont (Font (jlbl1 .getFont ().toString (), 1 , 14 ))
175
- jlbl1 .setText ("User-Defiend Payloads" )
250
+ jlbl1 .setText ("User-Defined Payloads" )
176
251
177
252
jlbl2 .setText ("This payload type lets you configure a simple list of strings that are used as payloads." )
178
253
179
254
spanePayloadList .setViewportView (self .listPayloads )
180
- self .extender .PayloadList = self .readPayloadsListFile ()
255
+ varName = 'SQLiQueryTampering_PayloadsDirectory'
256
+ path = self .extender .callbacks .loadExtensionSetting (varName )
257
+ if path :
258
+ self .textPayloadsDir .text = path
259
+ self .extender .PayloadList = self .readPayloadsFromDir (path )
260
+ else :
261
+ self .extender .PayloadList = self .readPayloadsListFile ()
262
+
181
263
self .listPayloads .setListData (self .extender .PayloadList )
182
264
183
265
pastePayloadButton .setText ("Paste" )
@@ -267,7 +349,7 @@ def initComponents(self):
267
349
.addGap (21 , 21 , 21 )
268
350
.addGroup (GeneratorPanelLayout .createParallelGroup (GroupLayout .Alignment .LEADING )
269
351
.addComponent (self .textNewPayload )
270
- .addComponent (spanePayloadList )))
352
+ .addComponent (spanePayloadList , GroupLayout . DEFAULT_SIZE , 563 , Short . MAX_VALUE )))
271
353
.addComponent (jlbl1 )
272
354
.addComponent (jlbl3 )
273
355
.addGroup (GeneratorPanelLayout .createSequentialGroup ()
@@ -426,6 +508,85 @@ def initComponents(self):
426
508
427
509
TabbedPane1 .addTab ("Processor" , ProcessorScrollPane )
428
510
511
+ jlbl6 .setForeground ( Color (255 , 102 , 51 ))
512
+ jlbl6 .setFont (Font (jlbl6 .getFont ().toString (), 1 , 14 ))
513
+ jlbl6 .setText ("Payloads Directory" )
514
+
515
+ jlbl9 .setText ("Choose your own directory containing payload files:" )
516
+
517
+ dirBrowseButton .setText ("..." )
518
+ dirBrowseButton .setToolTipText ("Browse" )
519
+
520
+ jlbl10 .setText ("If you want to remove any previously applied preferences:" )
521
+
522
+ restoreDefaultsButton .setText ("Restore" )
523
+ reloadPayloadsButton .setText ("Reload" )
524
+
525
+ jlbl7 .setForeground ( Color (255 , 102 , 51 ))
526
+ jlbl7 .setFont (Font (jlbl7 .getFont ().toString (), 1 , 14 ))
527
+ jlbl7 .setText ("Restore Defaults" )
528
+
529
+ OptionsPanelLayout = GroupLayout (OptionsPanel )
530
+ OptionsPanel .setLayout (OptionsPanelLayout )
531
+ OptionsPanelLayout .setHorizontalGroup (
532
+ OptionsPanelLayout .createParallelGroup (GroupLayout .Alignment .LEADING )
533
+ .addGroup (OptionsPanelLayout .createSequentialGroup ()
534
+ .addContainerGap ()
535
+ .addGroup (OptionsPanelLayout .createParallelGroup (GroupLayout .Alignment .LEADING )
536
+ .addGroup (OptionsPanelLayout .createSequentialGroup ()
537
+ .addGap (12 , 12 , 12 )
538
+ .addComponent (jlbl7 )
539
+ .addContainerGap (GroupLayout .DEFAULT_SIZE , Short .MAX_VALUE ))
540
+ .addGroup (OptionsPanelLayout .createSequentialGroup ()
541
+ .addGroup (OptionsPanelLayout .createParallelGroup (GroupLayout .Alignment .LEADING )
542
+ .addComponent (jSeparator3 )
543
+ .addGroup (OptionsPanelLayout .createSequentialGroup ()
544
+ .addComponent (self .textPayloadsDir )
545
+ .addPreferredGap (LayoutStyle .ComponentPlacement .UNRELATED )
546
+ .addComponent (dirBrowseButton , GroupLayout .PREFERRED_SIZE , 29 , GroupLayout .PREFERRED_SIZE )
547
+ .addPreferredGap (LayoutStyle .ComponentPlacement .UNRELATED )
548
+ .addComponent (reloadPayloadsButton ))
549
+ .addGroup (OptionsPanelLayout .createSequentialGroup ()
550
+ .addGroup (OptionsPanelLayout .createParallelGroup (GroupLayout .Alignment .LEADING )
551
+ .addComponent (jlbl9 )
552
+ .addGroup (OptionsPanelLayout .createSequentialGroup ()
553
+ .addGap (8 , 8 , 8 )
554
+ .addComponent (jlbl6 )))
555
+ .addGap (0 , 0 , Short .MAX_VALUE )))
556
+ .addContainerGap ())
557
+ .addGroup (OptionsPanelLayout .createSequentialGroup ()
558
+ .addComponent (jlbl10 )
559
+ .addPreferredGap (LayoutStyle .ComponentPlacement .RELATED )
560
+ .addComponent (restoreDefaultsButton )
561
+ .addGap (0 , 150 , Short .MAX_VALUE ))))
562
+ )
563
+ OptionsPanelLayout .setVerticalGroup (
564
+ OptionsPanelLayout .createParallelGroup (GroupLayout .Alignment .LEADING )
565
+ .addGroup (OptionsPanelLayout .createSequentialGroup ()
566
+ .addContainerGap ()
567
+ .addComponent (jlbl6 )
568
+ .addPreferredGap (LayoutStyle .ComponentPlacement .UNRELATED )
569
+ .addComponent (jlbl9 )
570
+ .addPreferredGap (LayoutStyle .ComponentPlacement .RELATED )
571
+ .addGroup (OptionsPanelLayout .createParallelGroup (GroupLayout .Alignment .TRAILING , False )
572
+ .addComponent (dirBrowseButton , GroupLayout .Alignment .LEADING , GroupLayout .DEFAULT_SIZE , GroupLayout .DEFAULT_SIZE , Short .MAX_VALUE )
573
+ .addComponent (reloadPayloadsButton , GroupLayout .Alignment .LEADING , GroupLayout .DEFAULT_SIZE , GroupLayout .DEFAULT_SIZE , Short .MAX_VALUE )
574
+ .addComponent (self .textPayloadsDir ))
575
+ .addGap (18 , 18 , 18 )
576
+ .addComponent (jSeparator3 , GroupLayout .PREFERRED_SIZE , 10 , GroupLayout .PREFERRED_SIZE )
577
+ .addPreferredGap (LayoutStyle .ComponentPlacement .RELATED )
578
+ .addComponent (jlbl7 )
579
+ .addPreferredGap (LayoutStyle .ComponentPlacement .UNRELATED )
580
+ .addGroup (OptionsPanelLayout .createParallelGroup (GroupLayout .Alignment .BASELINE )
581
+ .addComponent (jlbl10 )
582
+ .addComponent (restoreDefaultsButton ))
583
+ .addContainerGap (254 , Short .MAX_VALUE ))
584
+ )
585
+
586
+ OptionsScrollPane .setViewportView (OptionsPanel )
587
+
588
+ TabbedPane1 .addTab ("Options" , OptionsScrollPane )
589
+
429
590
self .mainPanel = JPanel ()
430
591
layout = GroupLayout (self .mainPanel )
431
592
self .mainPanel .setLayout (layout )
@@ -439,4 +600,4 @@ def initComponents(self):
439
600
)
440
601
441
602
TabbedPane1 .getAccessibleContext ().setAccessibleName ("Generator" )
442
- # </editor-fold>
603
+ # </editor-fold>
0 commit comments