SQL
Last updated
Was this helpful?
Last updated
Was this helpful?
SQL Injection은 서버에서 미리 정의해둔 미완성된 쿼리문에 악성 코드를 삽입하는 공격입니다. 사용자가 입력한 동적/정적 파라미터를 기존의 미완성된 쿼리에 삽입하여 완성한 뒤 DBMS에 질의함에 따라 결과를 출력해주는 과정에서 적절한 보안조치가 이루어지지 않는다면 비정상적인 행위를 일으킬 수 있습니다.
서버에서 정상적인 쿼리를 실행하는 데이터베이스 내에 있는 데이터 조회 시 명령입니다. 오라클은 owner와 table_name 컬럼에 대한 값을 지정할 때 반드시 모두 대문자로 지정해야 서버가 인식할 수 있습니다.
반면, 서버에서 정상적인 컨텍스트로 실행하는 스키마(유저)가 아닌 다른 스키마에 대한 데이터 조회 시 아래와 같이 쿼리문을 사용합니다.
Oracle에서는 공식적으로 시간 지연 발생을 위한 함수를 제공하지 않습니다. 대신 많은 양의 데이터를 조건문에 따라 질의함으로써 서버의 과부하를 일으켜 응답 시간을 지연시킬 수 있습니다. 이를 해비 쿼리라고 부릅니다.
본 페이지에서는 WAF, 솔루션 등에서 차단하는 SQLi에 대한 우회 방법을 다룹니다.
실행하고 싶은 쿼리는 위와 같지만 서버에서 admin 글자를 차단할 때를 가정합니다.
실행하고 싶은 쿼리는 위와 같이 idx 값이 1인 레코드 외에 전체 레코드지만, 서버에서 연산자를 차단할 때를 가정합니다.
tab(\n)
%0a
Vertical tab(\v)
%0b
Form feed(\f)
%0c
Carrige return(\r)
%0d
Prepare Statement 적용
화이트리스트를 이용한 사용자 입력값 검증
사용자 입력값 길이 제한 설정
SQLi 공격은 Prepare Statement 조치만으로도 대부분의 공격은 차단됩니다. 하지만 사전 컴파일 작업을 통해 데이터를 코드가 아닌 문자 자체로 인식시켜서 취약점을 없애는 Prepared Statement는 정렬(ORDER BY)과 같은 입력값을 방어하지는 못합니다. 따라서 화이트리스트를 통한 입력값 검증과 입력값 길이 제한 등을 통해 보안 조치가 가능합니다.