¿Es posible realizar un ataque de secuencias de comandos entre sitios ingresando mi secuencia de comandos en un campo que es necesario para que coincida con un valor específico?
Estoy escaneando una aplicación en busca de vulnerabilidades, y mi herramienta de escaneo (OWASP ZAP) está devolviendo varias vulnerabilidades de secuencias de comandos entre sitios. Los resultados devueltos incluyen una ruta para una solicitud REST, el método asociado (GET o POST) y el parámetro utilizado para incluir el script.
El problema es que para cada vulnerabilidad, el parámetro utilizado es un ID para un valor único. Por ejemplo, una solicitud getUserPrivileges
GET muestra una vulnerabilidad al usar el parámetro 'userId'. Si intentara realizar esta solicitud en SoapUI, utilizando un ID de usuario no válido, obtendría una respuesta de "Solicitud incorrecta". Tampoco hay ningún lugar en la interfaz de usuario que me permita ingresar mi propio valor para este parámetro.
Mi suposición es que temas como estos son todos falsos positivos, pero, como no tengo mucho conocimiento sobre este tema, quería verificar mi suposición.
Si tengo razón en este supuesto, ¿habría alguna razón por la que surgiría un falso positivo? ¿Hay algo que pueda hacer que mi herramienta de escaneo confunda esto con un problema?
Editar: Aquí hay dos solicitudes de ejemplo. Uno de ellos que creo que realmente puede ser un problema es el Ejemplo 2. Observo que el texto "" en ese ejemplo está presente en la respuesta sin formato, pero no en la respuesta html.
(Cuando digo que no se acepta el contenido html, me refiero al contenido en la respuesta de la solicitud. Las configuraciones para esto están en el lado del servidor. En Spring, esto parece aparecer con la ausencia de algo como " produce = MediaType.TEXT_HTML_VALUE "en la declaración del método y su sustitución con algo como" produce = MediaType.APPLICATION_JSON_VALUE ".)
Ejemplo 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]
Ejemplo 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: ''"}