¿Cuáles son los peligros de la inyección de sql con php?

2

Hice una aplicación de aplicación web inyectable de SQL con PHP para entender mejor lo que está pasando y lo automaticé todo con sqlmap.

El código relevante es el siguiente:

mysqli_query($conn, SELECT trans FROM 'dictionary' WHERE 'word' LIKE '$unfiltered_variable');

Jugué un poco con SQLMap y lo único que pude obtener fue el contenido del diccionario (ya que este era un sitio web del diccionario) pero no pude hacer nada más ya que la función sqli_query() de PHP no admite consultas apiladas .

Entonces, preguntas:

1) ¿Hay algo que pueda explotarse para hacer algo más que para obtener los contenidos de la base de datos?

2) Si el contenido de la base de datos no debe mantenerse en secreto, ¿tiene algún sentido proteger esta vulnerabilidad?

    
pregunta Slava Knyazev 10.07.2015 - 22:34
fuente

2 respuestas

4

Quitemos PHP por completo de la ecuación por un momento.

La inyección SQL permite que un atacante manipule la consulta SQL para que sea lo que él o ella quiere que la consulta ejecute. Esto puede ser volcar el contenido de la base de datos, modificar los datos e incluso ejecutar el código.

El ejemplo que proporcionó es, de hecho, vulnerable a la inyección de SQL. Para propósitos de demostración, déjame simplificarlo un poco:

mysqli_query($conn, "SELECT trans FROM dictionary WHERE word = '$search'");

Dado un valor de security , la consulta resultante se verá así:

SELECT trans FROM dictionary WHERE word = 'security';

Esto es inocente y normal. Sin embargo, dado lo siguiente, un atacante puede obtener la versión de MySQL que está ejecutando:

' @@version -- -

Esto causaría que la consulta resultara en lo siguiente:

SELECT trans FROM dictionary WHERE word = '' @@version -- - ';

En última instancia, dependiendo de los permisos y la configuración, un atacante puede saltar de una base de datos a otra en su servidor de base de datos, leer archivos del sistema de archivos o ejecutar código. Este es un ejemplo de cómo un atacante puede leer archivos de un sistema operativo basado en Linux:

' LOAD_FILE('/etc/passwd') -- -'

Esto resultaría en la siguiente consulta:

SELECT trans FROM dictionary WHERE word = '' LOAD_FILE('/etc/passwd') -- -'

Hay un par de cosas a tener en cuenta en este momento:

  • No todas las vulnerabilidades de inyección de SQL son iguales
  • Las técnicas para leer archivos, ejecutar código y volcar bases de datos variarán ampliamente según el idioma, el servidor de base de datos back-end y las circunstancias que rodean a la propia vulnerabilidad.

Independientemente, recomiendo encarecidamente que se solucione una vulnerabilidad de inyección de SQL mediante la parametrización o la inclusión en la lista blanca de los comentarios de los usuarios según las necesidades de la funcionalidad en cuestión.

Comencé con la eliminación de PHP de la discusión porque la inyección de SQL no depende del lenguaje ni del marco, ya que afecta a cualquier idioma que permita la conectividad de la base de datos. Independientemente del idioma, las opiniones del usuario deben tratarse con sospecha y manejarse de manera adecuada.

    
respondido por el user79537 11.07.2015 - 03:37
fuente
1

Si está restringido a la declaración actual, la explotación también se limita a las capacidades del tipo de declaración actual .

En general, una SELECT statement permite:

  • leer datos de tablas y bases de datos accesibles
  • leer archivos utilizando la LOAD_FILE function
  • escribir archivos utilizando la INTO … syntax
  • ejecutar procedimientos almacenados

Por supuesto, la forma en que el servidor web procesa la consulta SQL, los permisos del usuario de MySQL y el punto de inyección dentro de la declaración puede tener más restricciones de explotación.

Sin embargo, en su caso, podría intentar encontrar la ubicación del directorio raíz de documentos del servidor web e intentar escribir un shell PHP en él. Esto le permitiría la ejecución de código PHP arbitrario y, por lo tanto, comandos en el servidor web.

    
respondido por el Gumbo 11.07.2015 - 14:29
fuente

Lea otras preguntas en las etiquetas