È possibile eseguire un attacco di scripting cross-site inserendo il mio script in un campo che è necessario per abbinare un valore specifico?
Sto eseguendo la scansione di un'applicazione per vulnerabilità e il mio strumento di scansione (OWASP ZAP) sta restituendo diverse vulnerabilità di scripting cross-site. I risultati restituiti includono un percorso per una richiesta REST, il metodo associato (GET o POST) e il parametro utilizzato per includere lo script.
Il problema è che per ogni vulnerabilità, il parametro utilizzato è un ID per un valore univoco. Ad esempio, una richiesta GET getUserPrivileges
mostra una vulnerabilità utilizzando il parametro 'userId'. Se dovessi provare a fare questa richiesta in SoapUI, usando un userId non valido, otterrei una risposta "Bad Request". Non c'è neanche un posto nell'interfaccia utente che mi permetta di inserire il mio valore personale per questo parametro.
La mia ipotesi è che problemi come questi sono tutti falsi positivi, ma, non essendo molto informato su questo argomento, volevo controllare la mia ipotesi.
Se sono corretto in questa ipotesi, ci sarebbe qualche motivo per cui un tale falso positivo sarebbe venuto fuori? C'è qualcosa che potrebbe causare l'errore del mio strumento di scansione per un problema?
Modifica: qui ci sono due richieste di esempio. Uno di quelli che penso possa essere effettivamente un problema è l'Esempio 2. Osservo che il testo "" in quell'esempio è presente nella risposta non elaborata, ma non nella risposta HTML.
(Quando dico che il contenuto html non è accettato, mi riferisco al contenuto nella risposta alla richiesta.) Le impostazioni per questo sono sul lato server. In primavera, questo sembra apparire con l'assenza di qualcosa del tipo " produce = MediaType.TEXT_HTML_VALUE "nella dichiarazione del metodo e la sua sostituzione con qualcosa del tipo" produce = MediaType.APPLICATION_JSON_VALUE ".)
Esempio 1:
Request:
GET http://###.##.##.###:####/AAAAAAAA/BBBBBBBB/CCCCCCCC? requestId=%3Cscript%3Ealert%281%29%3B%3C%2Fscript%3E&comments=%3Cscript%3Ealert%281%29%3B%3C%2Fscript%3E HTTP/1.1
Accept-Encoding: gzip,deflate
token: 2cd68a38-c3bd-a56b-e65c-b76da893cd4d
Response (Raw):
HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
token: 2cd68a38-c3bd-a56b-e65c-b76da893cd4d
token: 2cd68a38-c3bd-a56b-e65c-b76da893cd4d
Content-Type: application/json;charset=UTF-8
Content-Length: 167
Date: Wed, 22 Aug 2018 ##:##:## GMT
Connection: close
{"timestamp":#############,"status":400,"error":"Bad Request","exception":"java.lang.NumberFormatException","message":"For input string: '<script>alert(1);</script>'"}
Response (HTML):
unsupported content-type [application/json;charset=UTF-8]
Esempio 2:
Request:
GET http://###.##.#.###:####/AAAAAAAA/BBBBBBBB/CCCCCCCC?requestId=%3Cscript%3Ealert%28%22hello%22%29%3B%3C%2Fscript%3E HTTP/1.1
Accept-Encoding: gzip,deflate
token: 2cd68a38-c3bd-a56b-e65c-b76da893cd4d
Host: ###.##.#.###:####
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Response (raw):
HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
token: 2cd68a38-c3bd-a56b-e65c-b76da893cd4d
token: 2cd68a38-c3bd-a56b-e65c-b76da893cd4d
Content-Type: text/html;charset=UTF-8
Content-Length: 173
Date: Wed, 22 Aug 2018 ##:##:## GMT
Connection: close
{"timestamp":#############,
"status":400,
"error":"BadRequest",
"exception":"java.lang.NumberFormatException",
"message":"For input string: '<script>alert('hello');</script>'"}
Response (HTML):
{"timestamp":#############,
"status":400,
"error":"Bad Request",
"exception":"java.lang.NumberFormatException",
"message":"For input string: ''"}