SQL Injection
Un ataque SQL Injection (SQLi) ocurre cuando un usuario introduce en un formulario web código SQL en lugar de un valor correcto en algún campo, código que se ejecutará en la base de datos de manera furtiva, si los parámetros no se validan. De este modo, se puede "romper" la consulta SQL, ya que podemos inyectar lógica como X or 1=1 (lo que será siempre True) y comentar el resto de la consulta. Esto puede ocasionar el robo de información de la base de datos o, incluso, acceder a funcionalidades y datos que no están permitidos para ese usuario.
Payload de ejemplo:Â ' or '1'='1
Riesgo del ataque
Un atacante que crea una copia de toda la base de datos (o porciones especĂficas).
Un atacante falsificando credenciales de inicio de sesiĂłn, suplantando a un usuario o incluso omitiendo la autenticaciĂłn por completo.
ModificaciĂłn de la base de datos (por ejemplo, cambiar, eliminar o agregar registros).
Robo de archivos que no son de base de datos ubicados en el sistema de archivos de DBMS.
EjecuciĂłn de comandos del sistema operativo que dan acceso a un atacante a otros activos en la red que aloja la base de datos SQL.
Desconectando la aplicaciĂłn web de destino / DBMS.
Â
CĂłdigo vulnerable 1:
final String query = "SELECT * FROM cuentas WHERE userid='" + request.getParameter("id") + "'"; |
CĂłdigo vulnerable 2:
final String query2 = "SELECT * FROM cuentas WHERE userid='%1'".replace("%1", request.getParameter("id")); |
SoluciĂłn:
Se debe implementar una validación que impida introducir más parámetros de los requeridos, asà como caracteres innecesarios. Igualmente, se debe validar que los parámetros sean del tipo correcto.
En este caso, se debe implementar con Sentencias Preparadas.
final PreparedStatement ps1 = con.PreparedStatement("SELECT * FROM cuentas WHERE userid=?");
ps1.setInt(1, request.getParameter("id")); |
Referencias:
https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html