본문 바로가기

보안/시큐어코딩

오라클 Database Code를 사용할 때 SQL 인젝션 취약점 제거

저장 프로시져는 특정 작업을 수행하는 SQL문의 논리적인 셋이다. 한번 컴파일 되어서 데이터베이스 서버에 저장되어 클라이언트가 호출해서 실행하도록 한다. 일반적으로 저장 프로시져는 맹목적으로 안전하다고 생각한다. 하지만 종종 그렇지 않을 때가 있다.  저장 프로시져에서 동적 SQL을 잘못 사용하게 되는 경우 SQL 인젝션 취약점을 가질 수 있다.

오라클에서는 다음경우에 dynamic SQL을 사용한다.

1. EXECUTE IMMEDIATE statements,

2. DBMS_SQL package

3. Cursors.

다음 예제들은 SQL 인젝션 공격에 안전한 dynamic SQL작성 방법을 설명하고 있다.

Execute Immediate Statement

Vulnerable Usage

 

sqlStmt:= 'SELECT emp_id FROM employees WHERE emp_email = ''' ||  email || '''';

EXECUTE IMMEDIATE sqlStmt INTO empId;

 Secure Usage

--Execute Immediate - named parameter

sqlStmt := 'SELECT emp_id FROM employees WHERE emp_email = :email';

EXECUTE IMMEDIATE sqlStmt USING email;


 

 

--Execute Immediate - positional parameter

sqlStmt := 'SELECT emp_id FROM employees WHERE emp_email = :1 and emp_name = :2';

EXECUTE IMMEDIATE sqlStmt USING email, name;

 

  

DBMS_SQL Package

Vulnerable Usage

 

 

 

sqlStmt := 'SELECT emp_id FROM employees WHERE emp_email = '''  || email || '''';

empcur:= DBMS_SQL.OPEN_CURSOR;

DBMS_SQL.PARSE(empcur, sqlStmt, DBMS_SQL.NATIVE);

DBMS_SQL.EXECUTE(empcur);

 Secure Usage

 

 

 

 

sqlStmt := 'SELECT emp_id FROM employees WHERE emp_email = :email';

empcur := DBMS_SQL.OPEN_CURSOR;

DBMS_SQL.PARSE(empcur, sqlStmt, DBMS_SQL.NATIVE);

DBMS_SQL.BIND_VARIABLE(empcur, ':email', email);

DBMS_SQL.EXECUTE(empcur);

 

Cursor with dynamic query

Vulnerable Usage

 

sqlStmt := 'SELECT emp_id FROM employees WHERE emp_email = ''' || email || '''';

OPEN empcur FOR sqlStmt;

 

Secure Usage

 

sqlStmt := 'SELECT emp_id FROM employees WHERE emp_email = :email';

OPEN empcur FOR sqlStmt USING email;