Si te tomas en serio la seguridad de tu página web será el momento de aprender sobre los peligros de las inyecciones de SQL.
El término inyección de SQL (También conocido como SQLi) se refiere a un tipo de ciberataque en el que los piratas informáticos comprometen páginas web de todo tipo incluidas las páginas web WordPress.
Por ello, en esta guía te explicaremos en detalle cómo es un ataque de inyección SQL y los pasos exactos que se han de seguir para evitarlo.
Índice de contenidos
Introducción: comprensión de SQL
S tructured Q uery L anguage o “SQL” es un sistema de gestión de bases de datos relacionales inventado en 1974 que fue la primera forma fácil de almacenar y recuperar muchos tipos de datos en sistemas informáticos.
Desde entonces, el lenguaje se ha disparado en popularidad y hoy en día se usa en muchos sistemas de gestión de contenido (CMS) como WordPress. De hecho, en sistemas como WordPress muchas operaciones utilizan consultas SQL para recuperar y almacenar datos.
Desafortunadamente, desde los inicios de SQL los ataques de inyección de SQL han sido un problema persistente para los sistemas que usan este tipo de base de datos como WordPress .
¿Qué es una inyección SQL (SQLi)?
En pocas palabras, una inyección SQL (SQLi) es un ataque que permite a un pirata informático aprovechar una consulta SQL vulnerable para ejecutar su propia consulta. Es decir, las inyecciones de SQL suceden cuando un atacante puede ejecutar su propio SQL en tu servidor.
Por suerte, las inyecciones de SQL en WordPress están muy bien investigadas y documentadas debido al gran volumen de páginas web que utilizan el CMS WordPress.
Definición de inyección SQL
Por definición, la intención de una inyección SQL es siempre maliciosa y, por lo general, tendrá como objetivo lograr uno o más de estos tres objetivos:
- Recuperación de datos no autorizada: En SQL el comando SELECT se usa para capturar datos. Si un atacante puede manipular con éxito una consulta basada en SELECT podrá «volcar» el contenido de una base de datos.
- Modificación de datos: En otros casos, el objetivo de una inyección SQL de WordPress será cambiar las entradas en las bases de datos.
- Denegación de servicio (DoS): Un ataque DoS ocurre cuando un usuario malintencionado dificulte que los usuarios legítimos accedan a tu web o servicios. Un comando común en SQL para eliminar datos es simplemente ELIMINAR. Los atacantes a menudo eliminarán en masa el contenido de las bases de datos para que los sitios web de destino sean inaccesibles o inutilizables.
Nota: Para evitar que una inyección de SQL te tumbe tu página web haz copias de seguridad de forma regular.
Explicación de los tipos de ataques de inyección SQL
Ahora es el momento de explorar el lado más técnico de las inyecciones SQL como los tipos de inyección.
Inyección SQL clásica (SQLi)
Este es el tipo de inyección más común, es cuando el atacante conoce el código SQL de antemano. Este también es el tipo de inyección más utilizado en WordPress puesto que WordPress es de código abierto y el público en general tiene acceso a todos sus componentes, incluidas sus consultas SQL.
Veremos ejemplos reales un poco más adelante, pero con este tipo de inyección los atacantes podrán manipulan las consultas para «cancelar» la primera parte de una. Posteriormente, podrán insertar una consulta personalizada que el servidor ejecutará como si el desarrollador original la hubiera escrito.
Inyección SQL ciega (SQLi)
A diferencia de la versión clásica, las inyecciones SQL ciegas ocurren cuando el atacante no tiene acceso al código SQL y simplemente tiene que hacer una conjetura. Además, este tipo de inyección requerirá mucha más habilidad que el SQLi tradicional ya que los resultados de un ataque exitoso no se mostrarán al atacante.
Inyección SLQ compuesta (SQLi)
Esta forma de ataque es cuando se combina un ataque separado con SQLi para obtener el resultado deseado.
Este tipo de inyección es el más sofisticado de los tres subgrupos ya que el atacante deberá ejecutar un exploit que le permita ejecutar SQLi que no funcionaría por sí solo.
Los exploits que más acompañan a este tipo de inyección SQLi son las infracciones de autenticación, los ataques de denegación de servicio distribuido (DDoS), el secuestro de DNS y los ataques de secuencias de comandos entre sitios.
¿Por qué las páginas web WordPress son vulnerables a las inyecciones de SQL?
WordPress es vulnerable a ciertas inyecciones de SQL ya que es muy popular y está basado en PHP (Un lenguaje de programación del lado del servidor que está diseñado para integrarse con MySQL).
WordPress usa bases de datos SQL para almacenar prácticamente todo, desde comentarios hasta publicaciones, cuentas e información de comercio electrónico.
De hecho, la gran mayoría de los intentos de inyección SQL de WordPress se realizan en formularios que envían datos a un script PHP que contiene la consulta SQL que el atacante desea explotar. Esto es un efecto secundario de la forma en que se diseñó WordPress.
Nota: Mantener tu versión de WordPress actualizada es una de las mejores defensas contra las vulnerabilidades de SQLi.
Ejemplo de inyección SQL
Ahora será el momento de ver un ejemplo de inyección SQLi. Para entenderlo necesitarás conocer un poco de jerga SQL.
SQL usa comandos como SELECT para tomar datos, DROP TABLE para destruir completamente una tabla dentro de una base de datos, DELETE para eliminar filas de una tabla, etc. Además, el carácter ‘*’ significa «todos» en SQL.
La consulta más básica en SQL es: SELECT * FROM TABLE_NAME. Esta consulta indica esencialmente imprimir todos los datos de una tabla llamada «TABLE_NAME».
Cuando envías datos a un formulario de inicio de sesión se ejecuta a través de un script PHP que coincide con tus credenciales (Nombre y contraseña) de una tabla de usuarios.
En nuestro ejemplo, asumiremos que somos muy malos en seguridad cibernética y tenemos una tabla de texto sin cifrar con columnas dos llamadas USER y PASS.
Preparando la consulta
En nuestra base de datos muy mal protegida, nuestra tabla con nombres de usuario y contraseñas se llamará BADLY_DONE_TABLE.
La consulta para autenticar a un usuario que inicia sesión será simplemente: SELECT * FROM BADLY_DONE_TABLE WHERE USER = ‘[nombre de usuario del formulario]’ AND PASS = ‘[contraseña del formulario]’.
Como podrás ver, estamos diciendo que tome la «lista» de usuarios, que solo debe ser uno si el nombre de usuario y la contraseña que ingresaron en el formulario coinciden.
SQL también te permitirá que la palabra clave OR se use en declaraciones condicionales así como AND que ve en nuestra consulta.
Ahora es el momento de crear nuestra hazaña.
Explotación de nuestra consulta SQL desprotegida
Nuestra consulta está configurada para devolver el usuario si nuestro nombre de usuario y contraseña coinciden.
Teniendo en cuenta que una comilla simple terminará una cadena, podemos escribir «Blahblahblah» como nuestro nombre de usuario y luego ‘OR’ 1 ‘=’ 1.
Aprovechamos el hecho de que nuestra consulta se forma dinámicamente y la entrada no se «desinfecta» antes de que se ejecute.
Básicamente, estamos diciendo que si el número ‘1’ es igual al número ‘1’ (¡sorprendentemente, lo hace!), Entonces elimine todo de la tabla, independientemente de si las credenciales que ingresamos son correctas.
En 1998, esto habría funcionado. Ahora, generalmente se necesita mucha más habilidad tanto en SQL como en SQLi para crear exploits para WordPress.
Inyecciones SQL y sitios web de WordPress
Nuestro ejemplo anterior no funcionaría en páginas web WordPress modernas salvo que el administrador de las mismas hiciera todo lo posible para deshabilitar todas y cada una de las medidas de seguridad. Sin embargo, utilizando los mismos principios, los piratas informáticos aún crean y venden exploits SQLi a otros usuarios malintencionados.
Debido a que WordPress es de código abierto y tiene una gran comunidad de desarrollo detrás de él, muchos investigadores de seguridad a menudo encuentran estas vulnerabilidades antes que de lo hagan los piratas informáticos. Posteriormente informan al equipo de WordPress del exploit y este equipo lo repara.
Solo en algunos casos (Desafortunados) el pirata informático consigue localizar el exploit primero lo que lo convierte en un 0-day obligando al equipo de WordPress a realizar un parche de seguridad lo antes posible.
Prevención frente a inyecciones de SQL
Después de leer esto, probablemente te estés preguntando cómo asegurarte de que tu página web WordPress no se convierta en la próxima víctima de un ataque SQLi.
La buena noticia es que no será necesario ser un profesional de la seguridad para protegerse de ataques SQLi sino seguir las siguientes indicaciones:
- Ten mucho cuidado con los archivos PHP (Plugin o themes) que obtengas de sitios web no oficiales de WordPress. Todo lo que se necesitará un hacker para entrar en tu página web será un script PHP en tu página web para arruinar tu WordPress.
- Utiliza un plugin de monitoreo de seguridad para alertarte en caso de que alguien intente cometer este ataque y puedas bloquearlo de antemano.
- Lo más importante es siempre mantener tu página web WordPress actualizada a la última versión.
- Mantén tus plugins y themes de WordPress actualizados. Los temas y plugins vulnerables son la razón número 1 por la que las página web WordPress son pirateadas.
¿Necesitas limpiar tu web hackeada? Te ayudamos.