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 메소드를 사용하여 설정함으로써 질의문의 구조가 바뀌는 것을 방지할 수 있다.
'04. 시큐어코딩' 카테고리의 다른 글
시큐어코딩(28) - Missing Authentication for Critical Function (0) | 2017.12.01 |
---|---|
시큐어코딩(27) - Reliance on Untrusted Inputs in a Security Decision (0) | 2017.11.24 |
시큐어코딩(25) - Download of Code Without Integrity Check (0) | 2017.11.23 |
시큐어코딩(24) - Unsafe Reflection (0) | 2017.11.23 |
시큐어코딩(23) - Process Control (0) | 2017.11.23 |