mysql - reales - sql injection manual
El sitio ha sido pirateado a través de SQL Injection (7)
Recientemente, mi sitio fue pirateado mediante inyección SQL. El pirata informático usó la siguiente consulta para obtener mi nombre de base de datos. No puedo entender esta consulta que escribieron.
Consulta:
=-999.9%20UNION%20ALL%20SELECT%20concat(0x7e,0x27,Hex(cast(database()%20as%20char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536--
Después de ejecutar la consulta, mostró un resultado entero, algo así como " 74545883
".
¿Puedes explicar cómo funciona la consulta?
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 lo envía al DBMS. Imagine una cadena como esta almacenada en su sistema para usar en una barra de búsqueda, etc.
SELECT * FROM SOME_TABLE WHERE SOME_COLUMN=
Para completar la consulta y permitir el ataque, necesitarían hacer su aporte así:
''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
SIEMPRE es verdadero, lo que da potencialmente acceso al atacante a cada fila en esa tabla.
Ahora que ya lo conoce, revise su código y reemplace todas las consultas creadas dinámicamente con una Declaración preparada. El sitio OWASP también tiene muchos recursos para la codificación defensiva:
Esta no es la consulta completa, en realidad la persona ingresó esta cadena en su aplicación web.
Ahora, primero reemplace% 20 con espacio en blanco en la parte de unión, obtiene:
SELECT concat(0x7e,0x27,Hex(cast(database() as char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536--
Parece que el usuario colocó la cuerda en algún lugar donde esperabas un 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, la subcadena de la primera columna del resultado contendrá la forma codificada hexadecimal del nombre de tu base de datos. En realidad, debe rodearse de comillas simples (0x27), y luego rodearse de ~ (0x7e)
Este es un ejemplo de inyección usando Havij. El 0x7e y el 0x27 corresponden a ~ y ''que se usarán para enmarcar la pantalla HTML como id = 999999.9 + union + all + select + 0x31303235343830303536, (seleccione + concat (0x7e, 0x27, unhex) (Hex (cast (sample_tbl.name + as + char))), 0x27,0x7e) + from + test
.sample_tbl + Order + by + id + limit + 0,1) + - Esta consulta mostrará ~ ''Alfred'' ~ cuál es el valor del campo del nombre de la columna, de la tabla sample_tbl en la prueba de la tabla
~ ''r3dm0v3_hvj_injection'' ~ es el código de la firma Havij unhex 0x7233646D3076335F68766A5F696E6A656374696F6E según http://www.string-functions.com/hex-string.aspx
La consulta devolvió el nombre de la Base de Datos usando DATABASE() , luego lo convirtió a un valor hexadecimal usando la función HEx() .
Una vez que tenían esto, podían usar la función UNHEX
Eche un vistazo a los ejemplos de UNHEX
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 llegaron, pero en general, debe reparar su código para evitar la inyección de SQL.
Parece un ataque de desbordamiento . Ellos UNION
-ed con tu consulta existente. reemplazando todo su %20
con (espacio) ya que sus rendimientos codificados en url:
=-999.9 UNION ALL SELECT CONCAT(0x7e,0x27,Hex(cast(database() as char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536-
descomponerlo:
- the
=-999.9
acaba de finalizar su consulta actual -
0x31303235343830303536
esNULL
; solo coinciden con el número de columnas en su consulta existente. Si teníaSELECT * FROM users
y losusers
tenían 4 columnas, laUNION
también debe tener 4 columnas. Como resultado, solo usaron `valores NULL para poblar esas columnas. - la verdadera confusión está en el
CONCAT()
. Están combinando 126, 39, el nombre de la base de datos como valor hexadecimal, 39 y 126 -
--
es un comentario de mysql - ignora el resto de tu consulta después
A juzgar por este ataque, sospecho que no estás ajustando la entrada en mysql_real_escape_string()
, que permitió atacar para saltar fuera de tu consulta y ejecutar la suya.
Vea owasp.org para más información.
Sí, tiene la forma hexadecimal del nombre de su base de datos que dice que es ''74545883''. Al desatarlo, habría obtenido el nombre real de la base de datos.
-999.9 UNION ALL SELECT
CONCAT(''Hex(cast(database() as char))''),
0x31303235343830303536,
0x31303235343830303536,
0x31303235343830303536
Creo que debe tener otras entradas en su registro, si no sabía de antemano que tiene 3 columnas.