Error in active scanner “Content-Type: multipart/form-data” -> "java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 3"

24 views
Skip to first unread message

alejandro ar

unread,
Sep 16, 2025, 12:54:51 PMSep 16
to ZAP Developer Group
hi

I have an error in the active scanner. An error is generated when the content is “Content-Type: multipart/form-data” and contains more than one field. I do not know if any specific parameters are required when scanning this type of content.
ZAP Version: 2.16.1
Operating System: Linux
Architecture: amd64
CPU Cores: 16
Max Memory: 7 GB
Java Version: Flathub 17.0.14

“java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 3”

I am attaching HTML 4 and HTML 3, the latter generating the error. The scripting is in Jython.
I appreciate your help. 

```html 4.html
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Formulario Completo</title>
    <style>
        /* Estilo opcional para mejorar la apariencia */
        body { font-family: sans-serif; }
        form div { margin-bottom: 15px; }
        label { display: block; margin-bottom: 5px; }
    </style>
</head>
<body>
    <h2>Completa tus datos y sube un archivo</h2>
    <form action="/new/upload4" method="post" enctype="multipart/form-data">      
      <div>
        <label for="archivo">Elige un archivo:</label>
        <input type="file" id="archivo" name="miArchivo" required>
      </div>
      <br>
      <input type="submit" value="Enviar Datos y Archivo">
    </form>
</body>
</html>
```

```html 3.html
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Formulario Completo</title>
    <style>
        /* Estilo opcional para mejorar la apariencia */
        body { font-family: sans-serif; }
        form div { margin-bottom: 15px; }
        label { display: block; margin-bottom: 5px; }
    </style>
</head>
<body>
    <h2>Completa tus datos y sube un archivo</h2>
    <form action="/new/upload3" method="post" enctype="multipart/form-data">   
      <div>
        <label for="nombre">Nombre:</label>
        <input type="text" id="nombre" name="nombreUsuario" required>
      </div>
      <div>
        <label for="edad">Edad:</label>
        <input type="number" id="edad" name="edadUsuario" min="1" required>
      </div>
      <div>
        <label for="archivo">Elige un archivo:</label>
        <input type="file" id="archivo" name="miArchivo" required>
      </div>
      <br>
      <input type="submit" value="Enviar Datos y Archivo">
    </form>
</body>
</html>
```

```script jython
"""
--
* Coded by : Khaled Nassar @knassar702

from org.zaproxy.addon.commonlib.scanrules import ScanRuleMetadata"""
from org.zaproxy.addon.commonlib.scanrules import ScanRuleMetadata
import java.lang.Exception as JavaException
follow_redirects = False
def scanNode(sas, msg):
pass

rce_payloads = {
'''
cat${IFS}/etc/passwd''':'root:x:0:0',
'''
cat /etc/passwd''':'root:x:0:0',
'''
uname''':'gid='
}

def scan(sas, msg, param, value):
for payload,message in rce_payloads.items():
msg = msg.cloneRequest();
try:
sas.setParam(msg, param, payload);
print("pasa parametro {}".format(param))
except JavaException as e:
print("setParam fallo aun cuando el parametro existe:{}".format(param), e)
continue
print("pasa2")
sas.sendAndReceive(msg, follow_redirects, False);
if message in msg.getResponseBody().toString():
sas.newAlert() \
.setRisk(3) \
.setConfidence(3) \
.setName('Remote Code Execution (Script)') \
.setDescription('Attack technique used for unauthorized execution of operating system commands. This attack is possible when an application accepts untrusted input to build operating system commands in an insecure manner involving improper data sanitization, or improper calling of external programs.') \
.setUri(msg.getRequestHeader().getURI().toString()) \
.setParam(param) \
.setAttack(payload) \
.setEvidence(message) \
.setMessage(msg) \
.raise();

def getMetadata():
return ScanRuleMetadata.fromYaml("""
id: 988787
name: test
description: test.
solution: test.
references:
category: INJECTION
risk: 3
confidence: HIGH
cweId: 89
wascId: 19
alertTags:
sql-injection: true
injection: true
error-based: true
otherInfo: test.
status: beta
""")
```

kingthorin+zap

unread,
Sep 23, 2025, 1:30:10 PMSep 23
to ZAP Developer Group
I'm unable to recreate the issue. (I tried both of your HTML examples with a yaml file and a png file.)

pasa parametro miArchivo
pasa2
pasa parametro miArchivo
pasa2
pasa parametro miArchivo
pasa2
pasa parametro miArchivo
pasa2
pasa parametro miArchivo
pasa2
pasa parametro miArchivo
pasa2
pasa parametro miArchivo
pasa2
pasa parametro miArchivo
pasa2
pasa parametro miArchivo
pasa2
pasa parametro nombreUsuario
pasa2
pasa parametro nombreUsuario
pasa2
pasa parametro nombreUsuario
pasa2
pasa parametro edadUsuario
pasa2
pasa parametro edadUsuario
pasa2
pasa parametro edadUsuario
pasa2
pasa parametro miArchivo
pasa2
pasa parametro miArchivo
pasa2
pasa parametro miArchivo
pasa2
pasa parametro miArchivo
pasa2
pasa parametro miArchivo
pasa2
pasa parametro miArchivo
pasa2
pasa parametro miArchivo
pasa2
pasa parametro miArchivo
pasa2
pasa parametro miArchivo
pasa2

alejandro ar

unread,
Sep 24, 2025, 12:31:51 PMSep 24
to zaproxy...@googlegroups.com
Hello, @kingthorin+zap 

I have checked again and the issue persists. I am not sure if it is related to the Java version or if it is due to the Flatpak installation.

I have also noticed that two requests are being sent per payload when only one should be sent, and this only occurs with “multipart/form-data.”

I am attaching my configuration. I have recorded a video to facilitate analysis.

flatpak run org.zaproxy.ZAP
Found Java version 17.0.14
Available memory: 32016 MB
Using JVM args: -Xmx8004m

3.html
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Formulario Completo</title>
<style>

4.html
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Formulario Completo</title>
<style>
body { font-family: sans-serif; }
form div { margin-bottom: 15px; }
label { display: block; margin-bottom: 5px; }
</style>
</head>
<body>
<h2>Completa tus datos y sube un archivo</h2>
<form action="/new/upload4" method="post" enctype="multipart/form-data">
<div>
<label for="archivo">Elige un archivo:</label>
<input type="file" id="archivo" name="miArchivo" required>
</div>
<br>
<input type="submit" value="Enviar Datos y Archivo">
</form>
</body>
</html>

rce.py
from org.zaproxy.addon.commonlib.scanrules import ScanRuleMetadata
import java.lang.Exception as JavaException

def scanNode(sas, msg):
pass

rce_payloads = {'''cat${IFS}/etc/passwd''':'root:x:0:0'}

def scan(sas, msg, param, value):
for payload,message in rce_payloads.items():
msg = msg.cloneRequest();

try:
sas.setParam(msg, param, payload)
print("param: -> {} url:-> {}".format(param, msg.getRequestHeader().getURI().toString()))

except JavaException as e:
print("X error param: ->'{}' url:-> {}".format(param, msg.getRequestHeader().getURI().toString()))
print(e)
continue

sas.sendAndReceive(msg, False, False)
if message in msg.getResponseBody().toString():
sas.newAlert() \
.setRisk(3) \
.setConfidence(3) \
.setName('Remote Code Execution (Script)') \
.setDescription('test') \

log rce.py
X error param: ->'nombreUsuario' url:-> http://192.168.20.82:8000/new/upload3
java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 1
X error param: ->'miArchivo' url:-> http://192.168.20.82:8000/new/upload4

java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 3
param: -> miArchivo url:-> http://192.168.20.82:8000/new/upload4
param: -> miArchivo url:-> http://192.168.20.82:8000/new/upload4


video
https://youtu.be/MU5qfZJgUUQ


Best regardsz

--
ZAP by Checkmarx: https://www.zaproxy.org/
---
You received this message because you are subscribed to the Google Groups "ZAP Developer Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email to zaproxy-devel...@googlegroups.com.
To view this discussion, visit https://groups.google.com/d/msgid/zaproxy-develop/f6267ee0-5c98-49d9-b303-a56c3d359666n%40googlegroups.com.
4.html
3.html
hola.png
rce.py
Reply all
Reply to author
Forward
0 new messages