본문 바로가기
04. 시큐어코딩

시큐어코딩(26) - SQL Injection: Hibernate

by 김덕환 2017. 11. 23.
반응형

1. 정의


SQL 삽입공격 : Hibernate(SQL Injection: Hibernate)


외부의 신뢰할 수 없는 입력을 적절한 검사 과정을 거치지 않고 Hibernate API의 SQL 질의문 생성을 위한 문자열로 사용하면, 공격자가 프로그래머가 의도하지 않았던 문자열을 전달함으로써 질의문의 의미를 왜곡시키거나 그 구조를 변경하여 임의의 데이터베이스 명령어가 수행되도록 할 수 있다. 



2. 해결방법


- 질의문의 생성 시 상수 문자열만 사용한다. 외부의 입력에 따라 질의문을 수정해야 한다면 인자를 받는 질의문을 상수 문자열로 생성한 후, 쿼리의 인자값을 setParameter(),set<타입이름>() 등의 메소드를 사용하여 설정한다.



3. 예제


========================== 안전하지 않은 코드의 예 ==========================


public void listHoney()

{

Session session = new Configuration().configure().buildSessionFactory().openSession();

try

{

Properties props = new Properties();

String fileName = "Hibernate.properties";

FileInputStream in = new FileInputStream(fileName);

props.load(in);


// 외부로부터 입력을 받음

String idValue = props.getProperty("idLow");


// 외부 입력을 검증없이 SQL qeuery문의 인자로 사용한다. 

Query query = session.createQuery("from Address a where a.name='" + idValue);

query.list();

}

catch (IOException e) { ... }

}


============================================================================


위의 예제는 외부의 입력(idValue)을 아무 검증과정 없이 질의문에 그대로 사용하고 있다. 만일, 외부의 입력으로 n' or '1'='1 과 같은 문자열이 입력되면, 다음과 같은 질의문이 생성되어 테이블 내의 모든 레코드가 반환된다. 

(from Address a where a.name='n' or '1'='1')



============================== 안전한 코드의 예 =============================


public void listHoney()

{

Session session = new Configuration().configure().buildSessionFactory().openSession();

try

{

Properties props = new Properties();

String fileName = "Hibernate.properties";

FileInputStream in = new FileInputStream(fileName);

if (in == null || in.available() <= 0) return;

props.load(in);


// 외부로 부터 입력을 받는다.

String idValue = props.getProperty("idLow");


// 입력값에 대한 유효성을 검사한다. 

if (idValue == null || "".equals(idValue)) idValue = "defaultID";


// SQL query 문장을 작성한다.

Query query = session.createSQLQuery("select h from Honey as h where h.id '= :idVal‘");

query.setParameter("idVal", idValue);

query.list();

}

catch (IOException e) { ... }

}


============================================================================



위의 코드처럼 외부 입력(idValue)에 따른 인자값은 setParameter 메소드를 사용하여 설정함으로써 질의문의 구조가 바뀌는 것을 방지할 수 있다. 

반응형