Skip to content

Commit 6ffc2fd

Browse files
committed
correction to pitchwork.py, add multiple payloads gestion
Signed-off-by: Timothée Ruffenach <timruff@gmx.com>
1 parent 857b452 commit 6ffc2fd

File tree

1 file changed

+63
-50
lines changed

1 file changed

+63
-50
lines changed

httpfuzzerprocessor/pitchWork.py

Lines changed: 63 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,97 @@
1-
# Version 1.0
1+
# Version 1.1
22
# @author RUFFENACH Timothée
33
# 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
45
# The script fuzz in mode pitchfork.
56
# 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]
810

911
from java.nio.file import Paths
1012
from javax.swing import JFileChooser
13+
from javax.swing import JOptionPane
1114
from org.zaproxy.zap.extension.fuzz.payloads.generator import FileStringPayloadGenerator
1215

1316
payloads1 = None
1417
payloads2 = None
1518
init = False
1619

1720
def processMessage(utils, message):
18-
global payloads1, payloads2, init
21+
global number, payloads, init
1922

2023
if not init:
2124
initialise()
2225

2326
# 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
3835

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())
4647

4748
def processResult(utils, fuzzResult):
4849
return True
4950

50-
def initialise():
51-
global payloads1, payloads2, init
52-
53-
# Choose file1 for first payload
51+
def chooseFile():
5452
fileChooser = JFileChooser()
5553
fileChooser.setMultiSelectionEnabled(True)
56-
filePath1 = ""
54+
filePath = ""
5755
result = fileChooser.showOpenDialog(None)
5856

5957
if result == JFileChooser.APPROVE_OPTION:
6058
selectedFiles = fileChooser.getSelectedFiles()
6159
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)
7062

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())
8096

81-
# Get payload in file to var payloads
82-
payloads1 = FileStringPayloadGenerator(file1).iterator()
83-
payloads2 = FileStringPayloadGenerator(file2).iterator()
8497
init = True

0 commit comments

Comments
 (0)