¿Qué es y cómo te afecta una inyección SQL?

¿Qué es y cómo te afecta una inyección SQL?

SQL (Structured Query Language o Código de Lenguaje de Consulta Estructurado en español) es el lenguaje que permite que las bases de datos interactúen entre ellas. Las aplicaciones web modernas usan bases de datos para administrar los procesos, los datos y para mostrar el contenido dinámico a los usuarios.

En resumen, una inyección SQL es un ataque contra un sitio o aplicación web en el que se añade un código SQL a un campo de entrada de un formulario web con el objetivo de acceder a una cuenta o modificar los datos de la misma.

¿Qué es una inyección SQL?

Se trata de una vulnerabilidad que permite al atacante enviar o «inyectar» instrucciones de forma maliciosa y malintencionada dentro del código SQL programado para la manipulación de bases de datos, poniendo en peligro los datos almacenados.

La finalidad de este tipo de ataques suele ser la de modificar el comportamiento de las consultas a través de parámetros indeseados, pudiendo así falsificar y suplantar identidades, obtener y divulgar información de la base de datos (contraseñas, correos, información financiera…), eliminar la base de datos comprometida, cambiar el nombre de las tablas o anular transacciones. Básicamente, el atacante se convierte en el administrador.

¿Son frecuentes este tipo de ataques?

Una inyección SQL puede afectar a cualquier sitio o aplicación web que utilice una base de datos con lenguaje SQL. Esta es una de las formas de ciberataque más antiguas, más peligrosas y también una de las más frecuentes.

Esta forma de ataque es una de las que más se utiliza en la actualidad, en parte debido a que existen una gran variedad de programas de inyección SQL automatizada, lo que significa que los hackers pueden atacar y robar con más facilidad que nunca.

En 2012, en un estudio de Barclays se descubrió que el 97% de los ataques se iniciaban mediante una brecha de este tipo. Estos ataques están tan presentes que aparecen en el top diez de riesgos para la seguridad cibernética de la OWASP (Open Application Security Project).

¿Cómo funciona este tipo de vulnerabilidad?

Una inyección SQL, como hemos dicho, convierte al atacante en administrador de la base de datos, mediante la aplicación de parámetros SQL maliciosos.

Por ejemplo, imaginemos una aplicación típica que trabaja con bases de datos. El atacante escogería una entrada, digamos un formulario de inicio de sesión (login). La estructura de consulta sería algo así:

select * from user_table
where username = 'sdaityari'
and password = 'mypassword';

Para simplificar el ejemplo, pongamos que está almacenando las contraseñas como texto sin cifrar. Si ha recibido el nombre de usuario y la contraseña del formulario, puede definir la consulta en PHP de la siguiente manera:

// Connect to SQL database
$db_query = "select * from user_table where
username = '".$user."'
AND password = '".$password."';";
// Execute query

Si alguien ingresa el valor «admin’;-» en el campo de nombre de usuario, la consulta SQL que generará la variable $db_?query será la siguiente:

select * from user_table where
username = 'admin';--' and password = 'mypassword'

Host-Fusion.Com el hosting WordPress más rápido del 2020

El mejor hosting WordPress 2020

¿Qué hace esta consulta?

Un comentario en SQL que empieza con guiones dobles. La consulta restante solo se filtra por el nombre de usuario sin tener en cuenta la contraseña. Si no existiera seguridad para evitar esto, simplemente se le otorgaría acceso administrativo a la aplicación web simplemente utilizando este truco.

Alternativamente, un ataque booleano también puede usarse en un ejemplo como este para tener acceso. Si un ataque ingresa «contraseña’ o 1=1; -» en el campo de la contraseña, la consulta resultante sería así:

select * from user_table where
username = 'admin' and
password = 'password' or 1=1;--';

En este caso, incluso si su contraseña es incorrecta, se autenticará en la aplicación. Si su página web muestra los resultados de la consulta de la base de datos, un atacante puede usar el comando «show tables» para mostrar las tablas de la base de datos y, a continuación, soltar selectivamente las tablas si así lo desea.

Inyecciones SQL en WordPress

Siempre que utilices una versión actualizada de WordPress estarás a salvo de este tipo de ataques. Sin embargo, si utilizas temas y complementos de terceros, estarás en riesgo.

Igual que sucede en una cadena, tu sitio será tan fuerte como su eslabón más débil. Para mitigar la vulnerabilidad en temas y complementos de WordPress, la única regla que debes seguir es utilizar siempre las funciones existentes de WordPress al interactuar con bases de datos.

Estas funciones se ponen a prueba exhaustivamente para detectar vulnerabilidades de inyecciones SQL durante el proceso de desarrollo de las diferentes versiones de WordPress. Por ejemplo, si quieres insertar un comentario en una publicación, usa la función «wp_insert_comment()» en lugar de acudir a la tabla «wp_comments».

Si quieres mantener tu sitio WordPress limpio asegúrate de que:

  • Actualizas PHP, WordPress core y MySQL.
  • Actualizas todos los plugins y temas de terceros.
  • Evita usar el «root user» para conectar con la base de datos SQL.
  • Limita el acceso de usuarios SQL a directorios sensibles.
  • Bloquea parámetros SQL peligrosos en el servidor.
  • Guarda siempre copias de seguridad fuera del servidor, por si sufres un ataque irreversible.

¿Cómo se pueden prevenir las inyecciones SQL?

En términos generales, es una tarea complicada determinar si una cadena de comandos de un usuario es maliciosa o no. Por lo tanto, la mejor manera de prevenir este tipo de ataques, es escapar del uso de caracteres especiales en los formularios de usuario.

También se pueden usar declaraciones preparadas para evitar inyecciones SQL. Una instrucción preparada es una plantilla de una consulta SQL, donde se especifican los parámetros de una etapa posterior para ejecutarla. Este sería un ejemplo de una declaración preparada en PHP y MySQLi:

$query = $mysql_connection->prepare("select * from user_table where username = ? and password = ?");
$query->execute(array($username, $password));

Otra acción que se puede tomar para prevenir estos ataques es limitar el acceso a la base de datos solo a lo estrictamente necesario. Por ejemplo, conectando la aplicación web al DMBS utilizando un usuario específico, que tiene acceso solo a la base de datos relevante.

Restringe el acceso del usuario de la base de datos a todas las demás ubicaciones del servidor. También es posible que tengas que bloquear ciertas palabras clave SQL en la URL a través del servidor web.

Como consejo adicional, siempre debes utilizar software actualizado. Cuando se lanza una nueva versión o un parche, los errores que se se corrigieron en la actualización se detallan en las notas de la versión. Una vez publicadas estas notas, utilizar un software viejo puede ser un riesgo.

¿Qué plugins puedes utilizar para proteger tu WordPress?

En el respositorio de WordPress dispones de varios plugins de seguridad que te proporcionan protección para este tipo de ataques, los plugins llamados Firewall suelen disponer de varias reglas de seguridad para evitar inyecciones SQL.

Wordfence Firewall

Entre ellos destacan el archiconocido WordFence que dispone de scanner de seguridad, reglas de seguridad y Firewall, en dos versiones freemium y de pago, en la de pago además de disponer de scanners mas profundos y personalizados de tu sitio web, dispones de actualización en tiempo real de las reglas de seguridad, en la versión fremmium estas reglas se actualizan semanalmente por lo que no estás protegido en tiempo real.

NinjaFirewall

Por otro lado dispones de Ninja Firewall que para mi gusto personal me gusta más que Wordfence para algunas cosas, por ejemplo en la versión gratuita SI actualiza en tiempo real las reglas de seguridad.

Al igual que Wordfence dispone de versión de pago con una serie de herramientas avanzadas pero con la versión gratuita estaremos protegidos, pero yo recomiendo la versión de pago para disfrutar de herramientas extras como el control de bloqueos.

Pero os voy a contar un secreto, juntos Wordfence y Ninja Firewall funcionan estupendamente, por ejemplo puedes tener instalado ambos, desactivar el Firewall de Wordfence y que sea el firewall en tiempo real de Ninja Firewall el que se encargue de ese trabajo.

¿Cómo te protegemos nosotros desde servidor?

En Host-Fusion.Com nos ocupamos de que el software de servidor siempre este actualizado y parcheado ante posibles vulnerabilidades, para ello disponemos de un equipo de ingenieros expertos y solo utilizamos software 100% legal, profesional y testado.

proactive defense para WordPress @hostfusion

Disponemos y te ofrecemos protección en tiempo real con nuestro sistema Imunify360, incluso contra ataques Zero Day gracias a nuestro sistema Proactive Defense que es capaz de detectar un ataque incluso si este no ha sido declarado en las reglas de seguridad.

Os invitamos a leer nuestro Artículo al respecto Protege tu WordPress en tiempo real con Proactive Defense .

Host-Fusion.Com el hosting WordPress más rápido del 2020

El mejor hosting WordPress 2020