|
1 | | -# Version 1.0 |
| 1 | +# Version 1.1 |
2 | 2 | # @author RUFFENACH Timothée |
3 | 3 | # Script inspired from https://02108124551050482571.googlegroups.com/attach/54c6e34f6fe20/message_processor.js?part=0.1&view=1&vt=ANaJVrEJuACewYorhYYa_zyhyMSug06pmlERCqfYdLsukQBC3OW3LATuXG1WHk_Fw9a0nhexG8ykFDuFgBGYrKAg_pOQ61M36MwC9SOBGvK4KLZn3eDkNzY (dot run on owasp 2.12.0) |
| 4 | +# To resolve problem at from https://github.com/zaproxy/zaproxy/issues/2967 |
4 | 5 | # The script fuzz in mode pitchfork. |
5 | 6 | # To Use : Enable script. |
6 | | -# In fuzzer Add 2 EmptyNull with good number. |
7 | | -# Select two 2 files and launch the fuzzer. |
| 7 | +# In fuzzer Add number multiple EmptyNull payloads with a good number of iterations. |
| 8 | +# Select the desired number of payloads [limit 2 to 20] |
| 9 | +# Select the desired number of files [limit 2 to 20] |
8 | 10 |
|
9 | 11 | from java.nio.file import Paths |
10 | 12 | from javax.swing import JFileChooser |
| 13 | +from javax.swing import JOptionPane |
11 | 14 | from org.zaproxy.zap.extension.fuzz.payloads.generator import FileStringPayloadGenerator |
12 | 15 |
|
13 | 16 | payloads1 = None |
14 | 17 | payloads2 = None |
15 | 18 | init = False |
16 | 19 |
|
17 | 20 | def processMessage(utils, message): |
18 | | - global payloads1, payloads2, init |
| 21 | + global number, payloads, init |
19 | 22 |
|
20 | 23 | if not init: |
21 | 24 | initialise() |
22 | 25 |
|
23 | 26 | # Stop if has end of payloads |
24 | | - if not (payloads1.hasNext() and payloads2.hasNext()): |
25 | | - utils.stopFuzzer() |
26 | | - payloads1.close() |
27 | | - payloads2.close() |
28 | | - return |
29 | | - |
30 | | - # Get the next value of payloas |
31 | | - payload1 = payloads1.next().getValue() |
32 | | - payload2 = payloads2.next().getValue() |
33 | | - |
34 | | - # Get information of body and replace with payload value |
35 | | - body = message.getRequestBody().toString() |
36 | | - body = body.replace(utils.getPaylaods().get(0).getValue(), payload1) |
37 | | - body = body.replace(utils.getPaylaods().get(1).getValue(), payload2) |
| 27 | + for i in range(number): |
| 28 | + # if end of payload stop fuzzing |
| 29 | + if not payloads[i].hasNext(): |
| 30 | + utils.stopFuzzer() |
| 31 | + # close all payload |
| 32 | + for j in range(number): |
| 33 | + payloads.close() |
| 34 | + return |
38 | 35 |
|
39 | | - # Set payload value to show in Fuzzer |
40 | | - utils.getPaylaods().set(0, payload1) |
41 | | - utils.getPaylaods().set(1, payload2) |
42 | | - |
43 | | - # Apply the payload in body |
44 | | - message.getRequestBody().setBody(body) |
45 | | - message.getRequestHeader().setContentLength(message.getRequestBody().length()) |
| 36 | + for i in range(number): |
| 37 | + # Get the next value of payloads |
| 38 | + # Get information of body and replace with payload value |
| 39 | + payloadNext = payloads[i].next().getValue() |
| 40 | + body = message.getRequestBody().toString() |
| 41 | + body = body.replace(utils.getPaylaods().get(i).getValue(), payloadNext) |
| 42 | + # Set payload value to show in Fuzzer |
| 43 | + utils.getPaylaods().set(i,payloadNext) |
| 44 | + # set payload in body |
| 45 | + message.getRequestBody().setBody(body) |
| 46 | + message.getRequestHeader().setContentLength(message.getRequestBody().length()) |
46 | 47 |
|
47 | 48 | def processResult(utils, fuzzResult): |
48 | 49 | return True |
49 | 50 |
|
50 | | -def initialise(): |
51 | | - global payloads1, payloads2, init |
52 | | - |
53 | | - # Choose file1 for first payload |
| 51 | +def chooseFile(): |
54 | 52 | fileChooser = JFileChooser() |
55 | 53 | fileChooser.setMultiSelectionEnabled(True) |
56 | | - filePath1 = "" |
| 54 | + filePath = "" |
57 | 55 | result = fileChooser.showOpenDialog(None) |
58 | 56 |
|
59 | 57 | if result == JFileChooser.APPROVE_OPTION: |
60 | 58 | selectedFiles = fileChooser.getSelectedFiles() |
61 | 59 | for file in selectedFiles: |
62 | | - filePath1 = file.getAbsolutePath() |
63 | | - print('The path is :', filePath1) |
64 | | - |
65 | | - # Choose file2 for second payload |
66 | | - fileChooser = JFileChooser() |
67 | | - fileChooser.setMultiSelectionEnabled(True) |
68 | | - filePath2 = "" |
69 | | - result = fileChooser.showOpenDialog(None) |
| 60 | + filePath = file.getAbsolutePath() |
| 61 | + print('The path is :', filePath) |
70 | 62 |
|
71 | | - if result == JFileChooser.APPROVE_OPTION: |
72 | | - selectedFiles = fileChooser.getSelectedFiles() |
73 | | - for file in selectedFiles: |
74 | | - filePath2 = file.getAbsolutePath() |
75 | | - print('The path is :', filePath2) |
76 | | - |
77 | | - # Setup path |
78 | | - file1 = Paths.get(filePath1) |
79 | | - file2 = Paths.get(filePath2) |
| 63 | + return filePath |
| 64 | + |
| 65 | +def chooseNumber(): |
| 66 | + number = JOptionPane.showInputDialog(None, "How many payload do you wante [2 to 20]:", "Input", JOptionPane.QUESTION_MESSAGE) |
| 67 | + |
| 68 | + # Check number between 2 to 20 |
| 69 | + if int(number) > 1 and int(number) < 21: |
| 70 | + number = int(number) |
| 71 | + return number |
| 72 | + else: |
| 73 | + JOptionPane.showMessageDialog(None, "Choose number between 2 to 20") |
| 74 | + chooseNumber() |
| 75 | + |
| 76 | +def initialise(): |
| 77 | + global init |
| 78 | + global payloads |
| 79 | + global number |
| 80 | + |
| 81 | + payloads = [] |
| 82 | + filePaths = [] |
| 83 | + |
| 84 | + # input number of payloads |
| 85 | + number = -1 |
| 86 | + while number == -1: |
| 87 | + number = chooseNumber() |
| 88 | + |
| 89 | + # choose file user |
| 90 | + for i in range(number): |
| 91 | + filePaths.append(chooseFile()) |
| 92 | + |
| 93 | + # Get payload in file to var payloads |
| 94 | + for i in range(number): |
| 95 | + payloads.append(FileStringPayloadGenerator(Paths.get(filePaths[i])).iterator()) |
80 | 96 |
|
81 | | - # Get payload in file to var payloads |
82 | | - payloads1 = FileStringPayloadGenerator(file1).iterator() |
83 | | - payloads2 = FileStringPayloadGenerator(file2).iterator() |
84 | 97 | init = True |
0 commit comments