SCW图标
英雄背景无分隔线
博客

Los codificadores conquistan la seguridad: comparta y aprenda - Inyección SQL

Jaap Karan Singh
发表于 2018 年 12 月 06 日
最后更新于 2026年3月6日

En términos sencillos, SQL (o lenguaje de consulta estructurado) es el lenguaje que se utiliza para comunicarse con las bases de datos relacionales; es el lenguaje de consulta que utilizan los desarrolladores, los administradores de bases de datos y las aplicaciones para gestionar la se generan enormes cantidades de datos todos los días.

Nuestros datos se están convirtiendo rápidamente en uno de los productos más valiosos del mundo... y cuando algo es valioso, los malos querrán hacerse con él para su beneficio.

Los atacantes utilizan la inyección SQL, una de las más antiguas (desde 1998!) y las vulnerabilidades de datos más molestas que existen: robar y cambiar la información confidencial disponible en millones de bases de datos de todo el mundo. Es insidioso, y los desarrolladores necesitan entender la inyección de SQL (y saber cómo defenderse de ella) si queremos mantener nuestros datos seguros.

Con ese fin, analizaremos tres aspectos clave de la inyección de SQL:

  • How work
  • Por qué es tan peligroso
  • Cómo defenderse de ello

Comprenda la inyección de SQL

La inyección SQL se puede entender usando una palabra: contexto.

Dentro de una aplicación, existen dos contextos: uno para los datos y otro para el código. El contexto del código indica al ordenador lo que debe ejecutar y lo separa de los datos que se van a procesar.

La inyección de SQL se produce cuando un atacante introduce datos que el intérprete de SQL trata erróneamente como código.

Un ejemplo es un campo de entrada en un sitio web, en el que un atacante escribe '» OR 1=1" y se añade al final de una consulta SQL. Cuando se ejecuta esta consulta, devuelve «true» para cada fila de la base de datos. Esto significa que se devolverán todos los registros de la tabla consultada.

Las implicaciones de la inyección de SQL pueden ser catastróficas. Si esto ocurre en una página de inicio de sesión, podría mostrar todos los registros de usuario, incluidos posiblemente los nombres de usuario y las contraseñas. Si una consulta simple para extraer datos tiene éxito, las consultas para cambiar los datos también lo harían.

Echemos un vistazo a algunos códigos vulnerables para que puedas ver cómo es una vulnerabilidad de inyección de SQL en persona.

Consulta este código:

Case query = «SELECT THE SALDO OF USER_DATA WHERE user_name =»
+ Request.getParameter («Nombre del cliente»);
test {
Declaration of statement = connection.createStatement ( ... );
ResultSet results = Statement.executeQuery (consulta);
}

El código aquí simplemente agrega la información de los parámetros del cliente al final de la consulta SQL sin ninguna validación. Cuando esto ocurre, un atacante puede introducir el código en un campo de entrada o en los parámetros de la URL y se ejecutará.

La clave no es que los ataques solo puedan añadir '» O 1=1" a cada consulta SELECT, sino que un atacante puede manipular cualquier tipo de consulta SQL (INSERT, UPDATE, DELETE, DROP, etc.) y ampliarla con cualquier cosa que admita la base de datos. Las hay estupendas recursos and tools available in the public domain that muestran lo que es posible.

Pronto descubriremos cómo corregir este problema. Primero, comprendamos cuánto daño se puede causar.

¿Por qué la inyección de SQL es tan peligrosa?

Estos son solo tres ejemplos de infracciones causadas por la inyección de SQL:

  • Sitio web de la Junta Electoral de Illinois fue violado debido a las vulnerabilidades de inyección de SQL. Los atacantes robaron los datos personales de 200.000 ciudadanos estadounidenses. La naturaleza de la vulnerabilidad encontrada significaba que los atacantes también podrían haber cambiado los datos, aunque no lo hicieron.
  • Hetzner, una empresa sudafricana de alojamiento de sitios web, fue violado con un total de 40 000 registros de clientes. Una vulnerabilidad de inyección de SQL provocó el posible robo de todos los registros de clientes de su base de datos.
  • Un proveedor católico de servicios financieros en Minnesota, Estados Unidos, fue violado usando la inyección SQL. Se robaron los detalles de las cuentas, incluidos los números de cuenta, de casi 130.000 clientes.

Los datos confidenciales se pueden usar para apoderarse de cuentas, restablecer contraseñas, robar dinero o cometer fraudes.

Incluso la información que no se considera confidencial o de identificación personal puede usarse para otros ataques. La información de dirección o los últimos cuatro dígitos de su número de identificación gubernamental se pueden usar para hacerse pasar por usted ante las empresas o para restablecer su contraseña.

Cuando un ataque tiene éxito, los clientes pueden perder la confianza en la empresa. Recogerse de los daños a los sistemas o de las multas reglamentarias puede costar millones de dólares.

Pero no tiene por qué terminar así para ti.

Derrota la inyección de SQL

La inyección de SQL se puede derrotar etiquetando claramente las partes de la aplicación, de modo que la computadora sepa si una determinada parte son datos o código que se va a ejecutar. Esto se puede hacer mediante consultas parametrizadas.

Cuando las consultas SQL usan parámetros, el intérprete SQL usa el parámetro solo como datos. No lo ejecuta como código.

Por ejemplo, un ataque como '» OR 1=1" no funcionará. La base de datos buscará la cadena «OR 1=1" y no la encontrará en la base de datos. Simplemente se encogerá de hombros y dirá: «Lo siento, no puedo encontrar eso para ti».

Un ejemplo de una consulta parametrizada en Java tiene este aspecto:

La mayoría de los marcos de desarrollo proporcionan defensas integradas contra la inyección de SQL.

Mapeadores relacionales de objetos (ORM), como Entidades framework in the family .NET, parametrizará las consultas de forma predeterminada. Esto se encargará de la inyección de SQL sin ningún esfuerzo por su parte.

Sin embargo, debe saber cómo funciona su ORM específico. Por ejemplo, Hibernar, un ORM popular en el mundo de Java, aún puede ser vulnerable a la inyección de SQL si se usa incorrectamente.

La parametrización de las consultas es la primera y mejor defensa, pero hay otras. Los procedimientos almacenados también admiten parámetros SQL y se pueden usar para evitar la inyección de SQL. Tenga en cuenta que los procedimientos almacenados también debe construirse correctamente para que esto funcione.

//Esto REALMENTE también debería validarse
Cadena customname = request.getParameter («CustomerName»);
//validar entradas para detectar ataques
Consulta de cadena = «SELECCIONA account_balance DESDE user_data DONDE user_name =? «;

PreparedStatement pstmt = Connection.PreparedStatement (consulta);
pstmt.setString (1, nombre personalizado);
ResultSet results = pstmt.executeQuery ();

Valide y desinfecte siempre sus entradas. Dado que algunos caracteres, como «OR 1=1", no los va a introducir un usuario legítimo de la aplicación, no es necesario permitirlos. Puedes mostrar un mensaje de error al usuario o eliminarlo de la entrada antes de procesarlo.

Dicho esto, no depende únicamente de la validación y la desinfección para protegerse. Los seres humanos inteligentes han encontrado formas de evitarlo. Son buenas estrategias de defensa en profundidad (DiD), pero la parametrización es la forma infalible de cubrir todas las bases.

Otra buena estrategia de DiD es utilizar el «mínimo privilegio» en la base de datos y la entrada de la lista blanca. Imponer el mínimo privilegio significa que la aplicación no tiene una potencia ilimitada dentro de la base de datos. Si un atacante tuviera acceso, el daño que puede causar es limitado.

OWASP tiene una gran SQL Trucks How to SQL Inyection disponible para mostrar cómo gestionar esta vulnerabilidad en varios idiomas y plataformas... pero si quieres hacerlo mejor, puedes jugar a un desafío de inyección de SQL en tu idioma preferido en nuestra plataforma ahora mismo; estos son algunos de los más populares para empezar:

SQL Inyection in C#

SQL Inyection in Node.js

SQL Inyection in Python Django

SQL Inyection in Java Spring

Bake the trip

Ha logrado un gran progreso en la comprensión de la inyección de SQL y los pasos necesarios para solucionarlo. ¡Impresionante!

Hemos analizado cómo se produce la inyección de SQL; por lo general, cuando un atacante utiliza la entrada para controlar las consultas de la base de datos con sus propios fines nefastos.

También hemos visto el daño causado por la explotación de las vulnerabilidades de inyección de SQL: las cuentas pueden verse comprometidas y perder millones de dólares... una pesadilla y, además, cara.

Hemos visto cómo prevenir la inyección de SQL:

  • Parametrización de consultas
  • Uso de mapeadores relacionales de objetos y procedimientos almacenados
  • Validar e incluir en la lista blanca las entradas de los usuarios

Ahora, depende de ti. La práctica es la mejor manera de seguir aprendiendo y desarrollando el dominio, así que ¿por qué no echas un vistazo a nuestro Learning Resources in SQL injection, luego pruebe nuestro demo gratuita de la plataforma? Estarás bien encaminado para convertirte en un guerrero del código seguro.

查看资源
查看资源

Los atacantes utilizan la inyección SQL, una de las más antiguas (¡desde 1998!) and the vulnerabilities of data more molestas que existen: robar y cambiar la información confidencial disponible en millones de bases de datos de todo el mundo.

感兴趣了解更多吗?

Jaap Karan Singh是一位安全编码布道者,首席辛格和Secure Code Warrior 的共同创始人。

了解更多

Secure Code Warrior 您的组织在软件开发全生命周期中保护代码安全,并营造将网络安全置于首位的企业文化。无论您是应用安全管理员、开发人员、首席信息安全官,还是任何与安全相关的工作人员,我们都能助力您的组织降低不安全代码带来的风险。

预约演示
分享到:
领英品牌社交x 标志
作者
Jaap Karan Singh
发表于2018年12月06日

Jaap Karan Singh是一位安全编码布道者,首席辛格和Secure Code Warrior 的共同创始人。

分享到:
领英品牌社交x 标志

En términos sencillos, SQL (o lenguaje de consulta estructurado) es el lenguaje que se utiliza para comunicarse con las bases de datos relacionales; es el lenguaje de consulta que utilizan los desarrolladores, los administradores de bases de datos y las aplicaciones para gestionar la se generan enormes cantidades de datos todos los días.

Nuestros datos se están convirtiendo rápidamente en uno de los productos más valiosos del mundo... y cuando algo es valioso, los malos querrán hacerse con él para su beneficio.

Los atacantes utilizan la inyección SQL, una de las más antiguas (desde 1998!) y las vulnerabilidades de datos más molestas que existen: robar y cambiar la información confidencial disponible en millones de bases de datos de todo el mundo. Es insidioso, y los desarrolladores necesitan entender la inyección de SQL (y saber cómo defenderse de ella) si queremos mantener nuestros datos seguros.

Con ese fin, analizaremos tres aspectos clave de la inyección de SQL:

  • How work
  • Por qué es tan peligroso
  • Cómo defenderse de ello

Comprenda la inyección de SQL

La inyección SQL se puede entender usando una palabra: contexto.

Dentro de una aplicación, existen dos contextos: uno para los datos y otro para el código. El contexto del código indica al ordenador lo que debe ejecutar y lo separa de los datos que se van a procesar.

La inyección de SQL se produce cuando un atacante introduce datos que el intérprete de SQL trata erróneamente como código.

Un ejemplo es un campo de entrada en un sitio web, en el que un atacante escribe '» OR 1=1" y se añade al final de una consulta SQL. Cuando se ejecuta esta consulta, devuelve «true» para cada fila de la base de datos. Esto significa que se devolverán todos los registros de la tabla consultada.

Las implicaciones de la inyección de SQL pueden ser catastróficas. Si esto ocurre en una página de inicio de sesión, podría mostrar todos los registros de usuario, incluidos posiblemente los nombres de usuario y las contraseñas. Si una consulta simple para extraer datos tiene éxito, las consultas para cambiar los datos también lo harían.

Echemos un vistazo a algunos códigos vulnerables para que puedas ver cómo es una vulnerabilidad de inyección de SQL en persona.

Consulta este código:

Case query = «SELECT THE SALDO OF USER_DATA WHERE user_name =»
+ Request.getParameter («Nombre del cliente»);
test {
Declaration of statement = connection.createStatement ( ... );
ResultSet results = Statement.executeQuery (consulta);
}

El código aquí simplemente agrega la información de los parámetros del cliente al final de la consulta SQL sin ninguna validación. Cuando esto ocurre, un atacante puede introducir el código en un campo de entrada o en los parámetros de la URL y se ejecutará.

La clave no es que los ataques solo puedan añadir '» O 1=1" a cada consulta SELECT, sino que un atacante puede manipular cualquier tipo de consulta SQL (INSERT, UPDATE, DELETE, DROP, etc.) y ampliarla con cualquier cosa que admita la base de datos. Las hay estupendas recursos and tools available in the public domain that muestran lo que es posible.

Pronto descubriremos cómo corregir este problema. Primero, comprendamos cuánto daño se puede causar.

¿Por qué la inyección de SQL es tan peligrosa?

Estos son solo tres ejemplos de infracciones causadas por la inyección de SQL:

  • Sitio web de la Junta Electoral de Illinois fue violado debido a las vulnerabilidades de inyección de SQL. Los atacantes robaron los datos personales de 200.000 ciudadanos estadounidenses. La naturaleza de la vulnerabilidad encontrada significaba que los atacantes también podrían haber cambiado los datos, aunque no lo hicieron.
  • Hetzner, una empresa sudafricana de alojamiento de sitios web, fue violado con un total de 40 000 registros de clientes. Una vulnerabilidad de inyección de SQL provocó el posible robo de todos los registros de clientes de su base de datos.
  • Un proveedor católico de servicios financieros en Minnesota, Estados Unidos, fue violado usando la inyección SQL. Se robaron los detalles de las cuentas, incluidos los números de cuenta, de casi 130.000 clientes.

Los datos confidenciales se pueden usar para apoderarse de cuentas, restablecer contraseñas, robar dinero o cometer fraudes.

Incluso la información que no se considera confidencial o de identificación personal puede usarse para otros ataques. La información de dirección o los últimos cuatro dígitos de su número de identificación gubernamental se pueden usar para hacerse pasar por usted ante las empresas o para restablecer su contraseña.

Cuando un ataque tiene éxito, los clientes pueden perder la confianza en la empresa. Recogerse de los daños a los sistemas o de las multas reglamentarias puede costar millones de dólares.

Pero no tiene por qué terminar así para ti.

Derrota la inyección de SQL

La inyección de SQL se puede derrotar etiquetando claramente las partes de la aplicación, de modo que la computadora sepa si una determinada parte son datos o código que se va a ejecutar. Esto se puede hacer mediante consultas parametrizadas.

Cuando las consultas SQL usan parámetros, el intérprete SQL usa el parámetro solo como datos. No lo ejecuta como código.

Por ejemplo, un ataque como '» OR 1=1" no funcionará. La base de datos buscará la cadena «OR 1=1" y no la encontrará en la base de datos. Simplemente se encogerá de hombros y dirá: «Lo siento, no puedo encontrar eso para ti».

Un ejemplo de una consulta parametrizada en Java tiene este aspecto:

La mayoría de los marcos de desarrollo proporcionan defensas integradas contra la inyección de SQL.

Mapeadores relacionales de objetos (ORM), como Entidades framework in the family .NET, parametrizará las consultas de forma predeterminada. Esto se encargará de la inyección de SQL sin ningún esfuerzo por su parte.

Sin embargo, debe saber cómo funciona su ORM específico. Por ejemplo, Hibernar, un ORM popular en el mundo de Java, aún puede ser vulnerable a la inyección de SQL si se usa incorrectamente.

La parametrización de las consultas es la primera y mejor defensa, pero hay otras. Los procedimientos almacenados también admiten parámetros SQL y se pueden usar para evitar la inyección de SQL. Tenga en cuenta que los procedimientos almacenados también debe construirse correctamente para que esto funcione.

//Esto REALMENTE también debería validarse
Cadena customname = request.getParameter («CustomerName»);
//validar entradas para detectar ataques
Consulta de cadena = «SELECCIONA account_balance DESDE user_data DONDE user_name =? «;

PreparedStatement pstmt = Connection.PreparedStatement (consulta);
pstmt.setString (1, nombre personalizado);
ResultSet results = pstmt.executeQuery ();

Valide y desinfecte siempre sus entradas. Dado que algunos caracteres, como «OR 1=1", no los va a introducir un usuario legítimo de la aplicación, no es necesario permitirlos. Puedes mostrar un mensaje de error al usuario o eliminarlo de la entrada antes de procesarlo.

Dicho esto, no depende únicamente de la validación y la desinfección para protegerse. Los seres humanos inteligentes han encontrado formas de evitarlo. Son buenas estrategias de defensa en profundidad (DiD), pero la parametrización es la forma infalible de cubrir todas las bases.

Otra buena estrategia de DiD es utilizar el «mínimo privilegio» en la base de datos y la entrada de la lista blanca. Imponer el mínimo privilegio significa que la aplicación no tiene una potencia ilimitada dentro de la base de datos. Si un atacante tuviera acceso, el daño que puede causar es limitado.

OWASP tiene una gran SQL Trucks How to SQL Inyection disponible para mostrar cómo gestionar esta vulnerabilidad en varios idiomas y plataformas... pero si quieres hacerlo mejor, puedes jugar a un desafío de inyección de SQL en tu idioma preferido en nuestra plataforma ahora mismo; estos son algunos de los más populares para empezar:

SQL Inyection in C#

SQL Inyection in Node.js

SQL Inyection in Python Django

SQL Inyection in Java Spring

Bake the trip

Ha logrado un gran progreso en la comprensión de la inyección de SQL y los pasos necesarios para solucionarlo. ¡Impresionante!

Hemos analizado cómo se produce la inyección de SQL; por lo general, cuando un atacante utiliza la entrada para controlar las consultas de la base de datos con sus propios fines nefastos.

También hemos visto el daño causado por la explotación de las vulnerabilidades de inyección de SQL: las cuentas pueden verse comprometidas y perder millones de dólares... una pesadilla y, además, cara.

Hemos visto cómo prevenir la inyección de SQL:

  • Parametrización de consultas
  • Uso de mapeadores relacionales de objetos y procedimientos almacenados
  • Validar e incluir en la lista blanca las entradas de los usuarios

Ahora, depende de ti. La práctica es la mejor manera de seguir aprendiendo y desarrollando el dominio, así que ¿por qué no echas un vistazo a nuestro Learning Resources in SQL injection, luego pruebe nuestro demo gratuita de la plataforma? Estarás bien encaminado para convertirte en un guerrero del código seguro.

查看资源
查看资源

请填写以下表格以下载报告

我们希望获得您的许可,以便向您发送有关我们产品或安全编码相关主题的信息。我们将始终以最高标准谨慎处理您的个人数据,绝不会出于营销目的将其出售给其他公司。

发送
scw 成功图标
SCW 错误图标
要提交表单,请启用「分析」cookie。完成后请随时将其重新禁用。

En términos sencillos, SQL (o lenguaje de consulta estructurado) es el lenguaje que se utiliza para comunicarse con las bases de datos relacionales; es el lenguaje de consulta que utilizan los desarrolladores, los administradores de bases de datos y las aplicaciones para gestionar la se generan enormes cantidades de datos todos los días.

Nuestros datos se están convirtiendo rápidamente en uno de los productos más valiosos del mundo... y cuando algo es valioso, los malos querrán hacerse con él para su beneficio.

Los atacantes utilizan la inyección SQL, una de las más antiguas (desde 1998!) y las vulnerabilidades de datos más molestas que existen: robar y cambiar la información confidencial disponible en millones de bases de datos de todo el mundo. Es insidioso, y los desarrolladores necesitan entender la inyección de SQL (y saber cómo defenderse de ella) si queremos mantener nuestros datos seguros.

Con ese fin, analizaremos tres aspectos clave de la inyección de SQL:

  • How work
  • Por qué es tan peligroso
  • Cómo defenderse de ello

Comprenda la inyección de SQL

La inyección SQL se puede entender usando una palabra: contexto.

Dentro de una aplicación, existen dos contextos: uno para los datos y otro para el código. El contexto del código indica al ordenador lo que debe ejecutar y lo separa de los datos que se van a procesar.

La inyección de SQL se produce cuando un atacante introduce datos que el intérprete de SQL trata erróneamente como código.

Un ejemplo es un campo de entrada en un sitio web, en el que un atacante escribe '» OR 1=1" y se añade al final de una consulta SQL. Cuando se ejecuta esta consulta, devuelve «true» para cada fila de la base de datos. Esto significa que se devolverán todos los registros de la tabla consultada.

Las implicaciones de la inyección de SQL pueden ser catastróficas. Si esto ocurre en una página de inicio de sesión, podría mostrar todos los registros de usuario, incluidos posiblemente los nombres de usuario y las contraseñas. Si una consulta simple para extraer datos tiene éxito, las consultas para cambiar los datos también lo harían.

Echemos un vistazo a algunos códigos vulnerables para que puedas ver cómo es una vulnerabilidad de inyección de SQL en persona.

Consulta este código:

Case query = «SELECT THE SALDO OF USER_DATA WHERE user_name =»
+ Request.getParameter («Nombre del cliente»);
test {
Declaration of statement = connection.createStatement ( ... );
ResultSet results = Statement.executeQuery (consulta);
}

El código aquí simplemente agrega la información de los parámetros del cliente al final de la consulta SQL sin ninguna validación. Cuando esto ocurre, un atacante puede introducir el código en un campo de entrada o en los parámetros de la URL y se ejecutará.

La clave no es que los ataques solo puedan añadir '» O 1=1" a cada consulta SELECT, sino que un atacante puede manipular cualquier tipo de consulta SQL (INSERT, UPDATE, DELETE, DROP, etc.) y ampliarla con cualquier cosa que admita la base de datos. Las hay estupendas recursos and tools available in the public domain that muestran lo que es posible.

Pronto descubriremos cómo corregir este problema. Primero, comprendamos cuánto daño se puede causar.

¿Por qué la inyección de SQL es tan peligrosa?

Estos son solo tres ejemplos de infracciones causadas por la inyección de SQL:

  • Sitio web de la Junta Electoral de Illinois fue violado debido a las vulnerabilidades de inyección de SQL. Los atacantes robaron los datos personales de 200.000 ciudadanos estadounidenses. La naturaleza de la vulnerabilidad encontrada significaba que los atacantes también podrían haber cambiado los datos, aunque no lo hicieron.
  • Hetzner, una empresa sudafricana de alojamiento de sitios web, fue violado con un total de 40 000 registros de clientes. Una vulnerabilidad de inyección de SQL provocó el posible robo de todos los registros de clientes de su base de datos.
  • Un proveedor católico de servicios financieros en Minnesota, Estados Unidos, fue violado usando la inyección SQL. Se robaron los detalles de las cuentas, incluidos los números de cuenta, de casi 130.000 clientes.

Los datos confidenciales se pueden usar para apoderarse de cuentas, restablecer contraseñas, robar dinero o cometer fraudes.

Incluso la información que no se considera confidencial o de identificación personal puede usarse para otros ataques. La información de dirección o los últimos cuatro dígitos de su número de identificación gubernamental se pueden usar para hacerse pasar por usted ante las empresas o para restablecer su contraseña.

Cuando un ataque tiene éxito, los clientes pueden perder la confianza en la empresa. Recogerse de los daños a los sistemas o de las multas reglamentarias puede costar millones de dólares.

Pero no tiene por qué terminar así para ti.

Derrota la inyección de SQL

La inyección de SQL se puede derrotar etiquetando claramente las partes de la aplicación, de modo que la computadora sepa si una determinada parte son datos o código que se va a ejecutar. Esto se puede hacer mediante consultas parametrizadas.

Cuando las consultas SQL usan parámetros, el intérprete SQL usa el parámetro solo como datos. No lo ejecuta como código.

Por ejemplo, un ataque como '» OR 1=1" no funcionará. La base de datos buscará la cadena «OR 1=1" y no la encontrará en la base de datos. Simplemente se encogerá de hombros y dirá: «Lo siento, no puedo encontrar eso para ti».

Un ejemplo de una consulta parametrizada en Java tiene este aspecto:

La mayoría de los marcos de desarrollo proporcionan defensas integradas contra la inyección de SQL.

Mapeadores relacionales de objetos (ORM), como Entidades framework in the family .NET, parametrizará las consultas de forma predeterminada. Esto se encargará de la inyección de SQL sin ningún esfuerzo por su parte.

Sin embargo, debe saber cómo funciona su ORM específico. Por ejemplo, Hibernar, un ORM popular en el mundo de Java, aún puede ser vulnerable a la inyección de SQL si se usa incorrectamente.

La parametrización de las consultas es la primera y mejor defensa, pero hay otras. Los procedimientos almacenados también admiten parámetros SQL y se pueden usar para evitar la inyección de SQL. Tenga en cuenta que los procedimientos almacenados también debe construirse correctamente para que esto funcione.

//Esto REALMENTE también debería validarse
Cadena customname = request.getParameter («CustomerName»);
//validar entradas para detectar ataques
Consulta de cadena = «SELECCIONA account_balance DESDE user_data DONDE user_name =? «;

PreparedStatement pstmt = Connection.PreparedStatement (consulta);
pstmt.setString (1, nombre personalizado);
ResultSet results = pstmt.executeQuery ();

Valide y desinfecte siempre sus entradas. Dado que algunos caracteres, como «OR 1=1", no los va a introducir un usuario legítimo de la aplicación, no es necesario permitirlos. Puedes mostrar un mensaje de error al usuario o eliminarlo de la entrada antes de procesarlo.

Dicho esto, no depende únicamente de la validación y la desinfección para protegerse. Los seres humanos inteligentes han encontrado formas de evitarlo. Son buenas estrategias de defensa en profundidad (DiD), pero la parametrización es la forma infalible de cubrir todas las bases.

Otra buena estrategia de DiD es utilizar el «mínimo privilegio» en la base de datos y la entrada de la lista blanca. Imponer el mínimo privilegio significa que la aplicación no tiene una potencia ilimitada dentro de la base de datos. Si un atacante tuviera acceso, el daño que puede causar es limitado.

OWASP tiene una gran SQL Trucks How to SQL Inyection disponible para mostrar cómo gestionar esta vulnerabilidad en varios idiomas y plataformas... pero si quieres hacerlo mejor, puedes jugar a un desafío de inyección de SQL en tu idioma preferido en nuestra plataforma ahora mismo; estos son algunos de los más populares para empezar:

SQL Inyection in C#

SQL Inyection in Node.js

SQL Inyection in Python Django

SQL Inyection in Java Spring

Bake the trip

Ha logrado un gran progreso en la comprensión de la inyección de SQL y los pasos necesarios para solucionarlo. ¡Impresionante!

Hemos analizado cómo se produce la inyección de SQL; por lo general, cuando un atacante utiliza la entrada para controlar las consultas de la base de datos con sus propios fines nefastos.

También hemos visto el daño causado por la explotación de las vulnerabilidades de inyección de SQL: las cuentas pueden verse comprometidas y perder millones de dólares... una pesadilla y, además, cara.

Hemos visto cómo prevenir la inyección de SQL:

  • Parametrización de consultas
  • Uso de mapeadores relacionales de objetos y procedimientos almacenados
  • Validar e incluir en la lista blanca las entradas de los usuarios

Ahora, depende de ti. La práctica es la mejor manera de seguir aprendiendo y desarrollando el dominio, así que ¿por qué no echas un vistazo a nuestro Learning Resources in SQL injection, luego pruebe nuestro demo gratuita de la plataforma? Estarás bien encaminado para convertirte en un guerrero del código seguro.

观看网络研讨会
开始
了解更多

点击下方链接,下载此资源的PDF文件。

Secure Code Warrior 您的组织在软件开发全生命周期中保护代码安全,并营造将网络安全置于首位的企业文化。无论您是应用安全管理员、开发人员、首席信息安全官,还是任何与安全相关的工作人员,我们都能助力您的组织降低不安全代码带来的风险。

查看报告预约演示
查看资源
分享到:
领英品牌社交x 标志
感兴趣了解更多吗?

分享到:
领英品牌社交x 标志
作者
Jaap Karan Singh
发表于2018年12月06日

Jaap Karan Singh是一位安全编码布道者,首席辛格和Secure Code Warrior 的共同创始人。

分享到:
领英品牌社交x 标志

En términos sencillos, SQL (o lenguaje de consulta estructurado) es el lenguaje que se utiliza para comunicarse con las bases de datos relacionales; es el lenguaje de consulta que utilizan los desarrolladores, los administradores de bases de datos y las aplicaciones para gestionar la se generan enormes cantidades de datos todos los días.

Nuestros datos se están convirtiendo rápidamente en uno de los productos más valiosos del mundo... y cuando algo es valioso, los malos querrán hacerse con él para su beneficio.

Los atacantes utilizan la inyección SQL, una de las más antiguas (desde 1998!) y las vulnerabilidades de datos más molestas que existen: robar y cambiar la información confidencial disponible en millones de bases de datos de todo el mundo. Es insidioso, y los desarrolladores necesitan entender la inyección de SQL (y saber cómo defenderse de ella) si queremos mantener nuestros datos seguros.

Con ese fin, analizaremos tres aspectos clave de la inyección de SQL:

  • How work
  • Por qué es tan peligroso
  • Cómo defenderse de ello

Comprenda la inyección de SQL

La inyección SQL se puede entender usando una palabra: contexto.

Dentro de una aplicación, existen dos contextos: uno para los datos y otro para el código. El contexto del código indica al ordenador lo que debe ejecutar y lo separa de los datos que se van a procesar.

La inyección de SQL se produce cuando un atacante introduce datos que el intérprete de SQL trata erróneamente como código.

Un ejemplo es un campo de entrada en un sitio web, en el que un atacante escribe '» OR 1=1" y se añade al final de una consulta SQL. Cuando se ejecuta esta consulta, devuelve «true» para cada fila de la base de datos. Esto significa que se devolverán todos los registros de la tabla consultada.

Las implicaciones de la inyección de SQL pueden ser catastróficas. Si esto ocurre en una página de inicio de sesión, podría mostrar todos los registros de usuario, incluidos posiblemente los nombres de usuario y las contraseñas. Si una consulta simple para extraer datos tiene éxito, las consultas para cambiar los datos también lo harían.

Echemos un vistazo a algunos códigos vulnerables para que puedas ver cómo es una vulnerabilidad de inyección de SQL en persona.

Consulta este código:

Case query = «SELECT THE SALDO OF USER_DATA WHERE user_name =»
+ Request.getParameter («Nombre del cliente»);
test {
Declaration of statement = connection.createStatement ( ... );
ResultSet results = Statement.executeQuery (consulta);
}

El código aquí simplemente agrega la información de los parámetros del cliente al final de la consulta SQL sin ninguna validación. Cuando esto ocurre, un atacante puede introducir el código en un campo de entrada o en los parámetros de la URL y se ejecutará.

La clave no es que los ataques solo puedan añadir '» O 1=1" a cada consulta SELECT, sino que un atacante puede manipular cualquier tipo de consulta SQL (INSERT, UPDATE, DELETE, DROP, etc.) y ampliarla con cualquier cosa que admita la base de datos. Las hay estupendas recursos and tools available in the public domain that muestran lo que es posible.

Pronto descubriremos cómo corregir este problema. Primero, comprendamos cuánto daño se puede causar.

¿Por qué la inyección de SQL es tan peligrosa?

Estos son solo tres ejemplos de infracciones causadas por la inyección de SQL:

  • Sitio web de la Junta Electoral de Illinois fue violado debido a las vulnerabilidades de inyección de SQL. Los atacantes robaron los datos personales de 200.000 ciudadanos estadounidenses. La naturaleza de la vulnerabilidad encontrada significaba que los atacantes también podrían haber cambiado los datos, aunque no lo hicieron.
  • Hetzner, una empresa sudafricana de alojamiento de sitios web, fue violado con un total de 40 000 registros de clientes. Una vulnerabilidad de inyección de SQL provocó el posible robo de todos los registros de clientes de su base de datos.
  • Un proveedor católico de servicios financieros en Minnesota, Estados Unidos, fue violado usando la inyección SQL. Se robaron los detalles de las cuentas, incluidos los números de cuenta, de casi 130.000 clientes.

Los datos confidenciales se pueden usar para apoderarse de cuentas, restablecer contraseñas, robar dinero o cometer fraudes.

Incluso la información que no se considera confidencial o de identificación personal puede usarse para otros ataques. La información de dirección o los últimos cuatro dígitos de su número de identificación gubernamental se pueden usar para hacerse pasar por usted ante las empresas o para restablecer su contraseña.

Cuando un ataque tiene éxito, los clientes pueden perder la confianza en la empresa. Recogerse de los daños a los sistemas o de las multas reglamentarias puede costar millones de dólares.

Pero no tiene por qué terminar así para ti.

Derrota la inyección de SQL

La inyección de SQL se puede derrotar etiquetando claramente las partes de la aplicación, de modo que la computadora sepa si una determinada parte son datos o código que se va a ejecutar. Esto se puede hacer mediante consultas parametrizadas.

Cuando las consultas SQL usan parámetros, el intérprete SQL usa el parámetro solo como datos. No lo ejecuta como código.

Por ejemplo, un ataque como '» OR 1=1" no funcionará. La base de datos buscará la cadena «OR 1=1" y no la encontrará en la base de datos. Simplemente se encogerá de hombros y dirá: «Lo siento, no puedo encontrar eso para ti».

Un ejemplo de una consulta parametrizada en Java tiene este aspecto:

La mayoría de los marcos de desarrollo proporcionan defensas integradas contra la inyección de SQL.

Mapeadores relacionales de objetos (ORM), como Entidades framework in the family .NET, parametrizará las consultas de forma predeterminada. Esto se encargará de la inyección de SQL sin ningún esfuerzo por su parte.

Sin embargo, debe saber cómo funciona su ORM específico. Por ejemplo, Hibernar, un ORM popular en el mundo de Java, aún puede ser vulnerable a la inyección de SQL si se usa incorrectamente.

La parametrización de las consultas es la primera y mejor defensa, pero hay otras. Los procedimientos almacenados también admiten parámetros SQL y se pueden usar para evitar la inyección de SQL. Tenga en cuenta que los procedimientos almacenados también debe construirse correctamente para que esto funcione.

//Esto REALMENTE también debería validarse
Cadena customname = request.getParameter («CustomerName»);
//validar entradas para detectar ataques
Consulta de cadena = «SELECCIONA account_balance DESDE user_data DONDE user_name =? «;

PreparedStatement pstmt = Connection.PreparedStatement (consulta);
pstmt.setString (1, nombre personalizado);
ResultSet results = pstmt.executeQuery ();

Valide y desinfecte siempre sus entradas. Dado que algunos caracteres, como «OR 1=1", no los va a introducir un usuario legítimo de la aplicación, no es necesario permitirlos. Puedes mostrar un mensaje de error al usuario o eliminarlo de la entrada antes de procesarlo.

Dicho esto, no depende únicamente de la validación y la desinfección para protegerse. Los seres humanos inteligentes han encontrado formas de evitarlo. Son buenas estrategias de defensa en profundidad (DiD), pero la parametrización es la forma infalible de cubrir todas las bases.

Otra buena estrategia de DiD es utilizar el «mínimo privilegio» en la base de datos y la entrada de la lista blanca. Imponer el mínimo privilegio significa que la aplicación no tiene una potencia ilimitada dentro de la base de datos. Si un atacante tuviera acceso, el daño que puede causar es limitado.

OWASP tiene una gran SQL Trucks How to SQL Inyection disponible para mostrar cómo gestionar esta vulnerabilidad en varios idiomas y plataformas... pero si quieres hacerlo mejor, puedes jugar a un desafío de inyección de SQL en tu idioma preferido en nuestra plataforma ahora mismo; estos son algunos de los más populares para empezar:

SQL Inyection in C#

SQL Inyection in Node.js

SQL Inyection in Python Django

SQL Inyection in Java Spring

Bake the trip

Ha logrado un gran progreso en la comprensión de la inyección de SQL y los pasos necesarios para solucionarlo. ¡Impresionante!

Hemos analizado cómo se produce la inyección de SQL; por lo general, cuando un atacante utiliza la entrada para controlar las consultas de la base de datos con sus propios fines nefastos.

También hemos visto el daño causado por la explotación de las vulnerabilidades de inyección de SQL: las cuentas pueden verse comprometidas y perder millones de dólares... una pesadilla y, además, cara.

Hemos visto cómo prevenir la inyección de SQL:

  • Parametrización de consultas
  • Uso de mapeadores relacionales de objetos y procedimientos almacenados
  • Validar e incluir en la lista blanca las entradas de los usuarios

Ahora, depende de ti. La práctica es la mejor manera de seguir aprendiendo y desarrollando el dominio, así que ¿por qué no echas un vistazo a nuestro Learning Resources in SQL injection, luego pruebe nuestro demo gratuita de la plataforma? Estarás bien encaminado para convertirte en un guerrero del código seguro.

目录

下载PDF
查看资源
感兴趣了解更多吗?

Jaap Karan Singh是一位安全编码布道者,首席辛格和Secure Code Warrior 的共同创始人。

了解更多

Secure Code Warrior 您的组织在软件开发全生命周期中保护代码安全,并营造将网络安全置于首位的企业文化。无论您是应用安全管理员、开发人员、首席信息安全官,还是任何与安全相关的工作人员,我们都能助力您的组织降低不安全代码带来的风险。

预约演示下载
分享到:
领英品牌社交x 标志
资源中心

入门资源

更多出版物
资源中心

入门资源

更多出版物