¿Posibilidad de inyección de SQL en el nombre de la tabla que filtra las comillas invertidas?

7

Estoy revisando una aplicación que tiene algo como esto:

table_name = table_name.replace(''', '')
c.execute('SELECT * FROM '' + table_name + ''')

¿Esto es realmente explotable si el atacante controla el campo nombre_tabla? El idioma es python y la base de datos es sqlite fwiw

    
pregunta bwbrowning 25.04.2013 - 01:21
fuente

2 respuestas

4

Hay algunas cosas que un atacante podría hacer con ese código que tal vez no quieras.

  • Si su entrada es SQLITE_MASTER , podrían recuperar los metadatos.
  • Si su entrada es databasename.tablename , entonces podrían recuperar datos de otra base de datos.
  • Si su entrada es (select load_extension(...) from tablename) , es posible que puedan cargar una extensión.

O podrían ejecutar cualquier consulta de selección que quisieran envolviéndola entre paréntesis.

    
respondido por el davidwebster48 26.04.2013 - 06:17
fuente
0

A veces tienes que concatenar cadenas para hacer sentencias de SQL. Por supuesto, debes ser muy cuidadoso en tales circunstancias. Los nombres de tablas variables son una de esas situaciones.

En este caso, probablemente debas usar una función incorporada como quoteIdentifier para asegurarte de enfrentar todas las circunstancias necesarias.

También agregaría una restricción a los caracteres permitidos:

 if(table_name.match(".*[^a-zA-Z_].*")) throw_big_error();

Sí, eso limita los nombres de las tablas más allá de lo que admite el RDBMS subyacente.

¿Tiene un requisito para admitir nombres de tablas con espacios en ellos? ¿O es aceptable prohibir los caracteres especiales en los nombres de tablas? Si puedes, hazlo.

"Simplemente hazlo bien en lugar de preguntar si hacerlo mal es seguro".

Ya que estás revisando el código, este es el comentario al codificador.

    
respondido por el Ben 25.04.2013 - 10:56
fuente

Lea otras preguntas en las etiquetas