2011-01-05 7 views
31

Recientemente, mi sitio fue pirateado mediante inyección SQL. El hacker usó la siguiente consulta para obtener mi nombre de base de datos. No puedo entender esta consulta que escribieron.El sitio ha sido pirateado a través de la inyección SQL

Consulta:

=-999.9%20UNION%20ALL%20SELECT%20concat(0x7e,0x27,Hex(cast(database()%20as%20char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536-- 

Después de la consulta se corrió mostró un resultado entero, algo así como "74545883".

¿Puede explicar cómo funciona la consulta?

+7

Por favor, no firme sus consultas, sabemos quién es usted – sethvargo

+1

¿Es esa la única entrada que tiene en su registro? –

+6

por favor, no firmes tus consultas - por un momento, me preguntaba qué significa la firma de una consulta mysql :) –

Respuesta

0

En primer lugar, la consulta parece que está codificada en HTML. Reemplace el %20 s con espacios y se volverá un poco más legible. También están convirtiendo parte de la consulta en una representación hexadecimal de algo. Pruebe la decodificación hexadecimal de esa parte de la declaración también.

Se crea un riesgo de inyección SQL cuando intenta crear un SQL dinámicamente como una cadena, y luego enviarlo al DBMS. Imagine una cadena como esta se almacena en el sistema para su uso en una barra de búsqueda, etc:

SELECT * FROM SOME_TABLE WHERE SOME_COLUMN=

para completar la consulta y dejar que el ataque en el, que tendrían que hacer su entrada como esta:

'x' or 1=1

En ese caso la consulta se convertirá en:

SELECT * FROM SOME_TABLE WHERE SOME_COLUMN='x' or 1=1

SOME_COLUMN podría ser cualquier variable, no importa dónde falla, lo único que importa es que 1=1 es SIEMPRE verdadero, lo que da potencialmente acceso al atacante a cada fila en esa tabla.

Ahora que ya lo conoce, revise el código y reemplace todas las consultas creadas dinámicamente por las Declaraciones preparadas. El sitio de OWASP tiene una gran cantidad de recursos para la codificación de defensa, así:

www.owasp.org

3

La consulta devuelve el nombre de base de datos utilizando DATABASE(), que luego se convierte a un valor hexadecimal usando HEx() función.

Una vez que tuvieron presente que podrían utilizar UNHEX función

Tener un vistazo a las UNHEX ejemplos

mysql> SELECT UNHEX('4D7953514C'); 
     -> 'MySQL' 
mysql> SELECT 0x4D7953514C; 
     -> 'MySQL' 
mysql> SELECT UNHEX(HEX('string')); 
     -> 'string' 
mysql> SELECT HEX(UNHEX('1267')); 
     -> '1267' 

Es bueno saber cómo entraron, pero en general, es necesario corregir su código para evitar la inyección de SQL.

+0

@astander - me preguntó cómo funcionaba la consulta. Lo interpreté como "cómo evitaron mi (falta de) prevención", no "qué hace cada una de estas funciones aquí dentro". Siento que una persona debería poder realizar una consulta de google para "mysql HEX", pero un novato puede no estar sintonizado para escapar de las consultas y los intentos de inyección de mysql comunes, ¿sí? – sethvargo

+2

Si puede googlearlo, puede google Inyección SQL ... –

+0

googlear "mysql HEX" le dirá qué hace la función (como lo ha vinculado), pero buscar en Google "inyección de mysql" no le dirá por qué SU consulta particular fue pirateada ... – sethvargo

19

Parece un overflow attack. Ellos UNION -ed con su consulta existente.la sustitución de toda su %20 con (espacio) ya que sus rendimientos con codificación URL:

=-999.9 UNION ALL SELECT CONCAT(0x7e,0x27,Hex(cast(database() as char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536- 

Descomponerlo:

  1. la =-999.9 se está por finalizar su consulta actual
  2. 0x31303235343830303536 es NULL - que son sólo coincidiendo con el número de columnas en su consulta existente. Si tuviera SELECT * FROM users y users tenía 4 columnas, la UNION también debe tener 4 columnas. Como resultado, solo usaron `valores NULL para poblar esas columnas.
  3. la verdadera confusión está en el CONCAT(). Ellos son la combinación de 126, 39, nombre de base de datos como valor hexadecimal, 39, y 126
  4. -- es un comentario MySQL - se ignora el resto de su consulta después de

A juzgar por este ataque, sospecho que son no envolviendo entrada en mysql_real_escape_string(), lo que permitió atacar para saltar fuera de su consulta y ejecutar la suya.

Consulte owasp.org para obtener más información.

+1

unhex (0x31303235343830303536) dio '% H V'. ¿Una tarjeta de visita tal vez? Es un gran número - entre 2^78 y 2^79. –

+0

puede ser mysqls max_int - ¿un intento de desbordamiento? – sethvargo

+2

gracias por el downvote sin comentarios – sethvargo

5

Esta no es la consulta completa, en realidad la persona ingresó esta cadena en su aplicación web.

Ahora, reemplace primero% 20 con el espacio en blanco en la parte sindical, que se obtiene:

SELECT concat(0x7e,0x27,Hex(cast(database() as char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536-- 

Parece que el usuario pone la cadena en algún lugar donde estaban confiados en su número. Entonces, ves que primero hay un número (999.9) para completar la condición original de la consulta. Luego, se agrega una parte de UNIÓN. Finalmente, después de la parte UNION, los caracteres de comentario se agregan (-) para que el resto de la consulta (que podría estar siendo agregada por su sistema) se pase por alto.

Podemos formatear el código para una mejor comprensión:

SELECT 
    concat 
    (
     0x7e, 
     0x27, 
     Hex(cast(database() as char)), 
     0x27, 
     0x7e 
    ), 
    0x31303235343830303536, 
    0x31303235343830303536, 
    0x31303235343830303536 

Ahora, subcadena de la primera columna del resultado contendrá la forma hexagonal codificada de su nombre datbase. En realidad, debería ser rodeado por comillas simples (0x27), luego otra vez rodeados de ~ (0x7E)

1
-999.9 UNION ALL SELECT 
CONCAT('Hex(cast(database() as char))'), 
0x31303235343830303536, 
0x31303235343830303536, 
0x31303235343830303536 

creo que debe tener otras entradas en el registro, si no sabía de antemano que usted tiene 3 columnas .

1

Este es un exemple de inyección usando Havij El 0x7E y 0x27 corresponden a ~ y 'wich será utilizado para enmarcar la pantalla HTML como id = 999999.9 + union + all + seleccione + 0x31303235343830303536, (seleccione + concat (0x7e, 0x27, unhex (Hex (cast (sample_tbl.name + as + char))), 0x27,0x7e) + desde + test.sample_tbl + Solicitar + by + ID + límite de + 0,1) + - Esta consulta hará que ~ 'Alfred' ~, que es el valor del campo del nombre de la columna, desde el sample_tbl mesa en la prueba de la tabla

~ 'r3dm0v3_hvj_injection' ~ es el código de la firma Havij unhex 0x7233646D3076335F68766A5F696E6A656374696F6E acuerdo con http://www.string-functions.com/hex-string.aspx

+0

Probaron la misma inyección de MySQL en mi web, pero lo intentaron en la página sin ninguna consulta de base de datos, todo se basa en archivos :-) – qub1n

-1

Si él tiene la forma hexagonal de su nombre de base de datos que usted dice es '74545883'. Al deshecharlo, habría obtenido el nombre real de la base de datos.

Cuestiones relacionadas