❗️JdbcTemplate을 사용하며 발생할 수 있는 SQL Injection 위험 문제와 방지에 관하여∙∙∙
SQL Injection
은 응용 프로그램 보안 상의 허점을 의도적으로 이용해, 악의적인 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작 하는 코드 인젝션 공격 방법이다.
공격자에 의해서 취약한 컴퓨터 프로그램 코드를 삽입하고 실행을 변경하는 방식으로 이용된다.
SQL의 문법을 이용해 데이터베이스의 데이터를 읽거나 수정 또는 원래 쿼리의 의미를 손상시킬 수 있다.
JdbcTemplate
을 사용하며 select
문에서 발생할 가능성이 있는 공격 문제이다.
2017년 3월 '여기어때'의 대규모 개인정보 유출 사건도 SQL Injection으로 인한 피해였다고 한다.
Q. injection 과 select 문에서 어떻게 발생할 가능성이 있는가?
로그인을 예시로 들 수 있다.
만약, 악의적인 사용자가 아래와 같이 값을 넣게 된다면
{ "id" : "
admin
", "password" : "password' OR 1=1 --
" }
password 는 만약 password 가 일치하는 것과 상관없이 OR 문에 따라
1=1 은 항상 true 이기 때문에 맞는 것으로 실행 될 수 있다.
따라서 현재 jdbcTemplate 에서 쿼리(sql)는 String으로 작성되어있기 때문에 Respose(keyword) 변수를 조작 할 수 있다면 인젝션 문제점에 노출될 수 있다.
현재 파라미터로 들어가는 ?
는 기본적으로 스트링 양 끝에 따옴표(' '
)를 붙이기 때문에 이를 통해서 포장을 해줄 수 있다.
String sql = "select * from Table where id like '%" + param +"%'"
대신에 아래와 같이 리팩토링 해준다면
String sql = "select * from Table where id like ? "
String params = "%"+param+"%"
param
부분이 ' '
부분으로 둘러쌓인 채 쿼리가 실행되므로 인젝션의 위험을 방지 할 수 있다.
JdbcTemplate API 문서에 나와있는 메서드에 대한 설명 요약 부분을 보면 위험한 메서드를 구별할 수 있다. 따라서 이를 참고하여 개발할때 유의하며 개발할 필요성이 있다.
[참고]
https://ko.wikipedia.org/wiki/SQL_%EC%82%BD%EC%9E%85
http://yoonbumtae.com/?p=2842
https://github.com/HomoEfficio/dev-tips/blob/master/Spring%20JdbcTemplate%20%EC%82%AC%EC%9A%A9%20%EC%8B%9C%20%EC%A3%BC%EC%9D%98%20%EC%82%AC%ED%95%AD.md
https://noirstar.tistory.com/264