XSS
La vulnerabilidad “Cross-Site Scripting (XSS)” está relacionada con una pobre validación de datos de entrada a la aplicación que permite la inyección de código script (generalmente JavaScript), el cual posteriormente puede ejecutarse en la parte cliente de un usuario y realizar acciones como obtener sesiones de usuario y otras acciones que puede comprometer la confidencialidad e integridad de la aplicación. Dado que el código inyectado se almacena por la aplicación, la vulnerabilidad XSS se considera persistente.
Riesgo del ataque
Robo de datos sensibles.
Ataques CSRF (Cross Site Request Forgery).
Suplantación de usuarios.
Si el atacante suplanta un usuario con los permisos adecuados, podría ejecutar código en el servidor.
Código vulnerable 1:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String name = req.getParameter("name");
PrintWriter out = resp.getWriter();
out.write("Hello " + name);
} |
Solución:
Se debe implementar una validación que impida introducir más parámetros de los necesarios, así como caracteres innecesarios.
En este caso se debe utilizar anotaciones de Spring o expresiones regulares, sabiendo que formato debe tener la entrada.
private static final Pattern namePattern = Pattern.compile("^[a-zA-Z]+(([',. -][a-zA-Z ])?[a-zA-Z]*)*$");
public void doPost( HttpServletRequest req, HttpServletResponse resp) {
try {
String name= req.getParameter( "name" );
if ( !namePattern.matcher( name).matches() {
throw new YourValidationException( "Improper name format." );
}
// do what you want here, after its been validated ..
} catch(YourValidationException e ) {
resp.sendError( response.SC_BAD_REQUEST, e.getMessage() );
}
} |
Referencias:
https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/Top_10-2017_A7-Cross-Site_Scripting_(XSS)
Cross Site Scripting Prevention - OWASP Cheat Sheet Series
OWASP Validation Regex Repository | OWASP Foundation
What is a cross-site scripting vulnerability? | Invicti