-
[보안] Spring 에서 SQL Injection 방어 그리고 원리 (feat. Prepared Statement, JPA, MyBatis)Back End/보안 2023. 2. 13. 21:19
서문
회사 서비스에 AWS WAF 를 전역적으로 설정하면서 소량의 보안지식을 쌓을 수 있었다.
그러다 문득 Spring Application 은 SQL Injection 을 제대로 방어하고 있을까? 라는 궁금증이 생겨났다.
Spring 에서 XSS 필터는 따로 적용하는 것을 보았으나 SQLI 필터를 적용한 케이스를 보지 못하여 더욱 궁금하였다.
서칭 결과, Prepared Statement 를 사용하면 SQLI 를 막을 수 있다고 한다.
JDBC 에서 Prepared Statement 를 직접 사용해본 적이 있어 JDBC 스펙인 줄 알고, 구현을 해봤자 String 을 치환할 뿐 아닌가? 라는 생각에 도무지 어떻게 SQL Injection 을 막는다는 것인지 이해가 되지 않았다.
Prepared Statement 를 사용한 SQL Injection 방어 원리
그래서 더 서칭해본 결과 Prepared Statement 는 DB 스펙이라고 한다.
즉, DB 수준에서 미리 준비된 구문을 설정하고, 실행계획까지 다 세워놓는다.
그리고 파라미터만 입력받아 실행하는 것이다.
즉, String 을 Java 단에서 들고 있다가 단순히 치환하는 것이 아니라 DB 에 미리 실행계획을 생성해두고 파라미터 값만 받는다는 말이다.
예시를 들어 아래와 같은 쿼리문이 있다고 하자.
select * from adminTable where login_id = {loginId}
DB 는 미리 실행계획을 만들고 {loginId} 라는 파라미터만 기다리고 있다.
DB 는 들어올 Input 값을 String 값으로 기대하고 있다.
그리하여 유저가 1' or '1'='1 과 같은 입력을 하면 그저 String 값이 1' or '1'='1 인 유저를 찾을 뿐이다.
이해가 되지 않으시면 SQL Injection 대표예제와 원리를 참조하시길 바란다.
그리고 Prepared Statement 는 DB 입장에서 미리 실행계획을 짜놓은 상태에서 대기하기 때문에 효율도 좋다.
JPA 에서 IN 절을 사용할 때 Prepared Statement 의 효율 높이기도 한번 읽어보시면 좋다.
그럼 내 어플리케이션은 SQL Injection 을 막고 있을까?
SQL Injection 의 종류는 많다.
하지만 대표적인 공격인 String 치환 공격의 경우는 JDBC 를 근본으로 만들어진 기술이라면 Prepared Statement 를 사용하여 이미 막고 있을 것이다.
Java 진영에서 흔히 볼 수 있는 JPA 와 MyBatis 를 예로 들겠다.
JPA 는 Prepared Statment 를 사용하고 있을까?
Default 동작으로 사용하고 있다.
정확히는 JPA 의 ORM 인 Hibernate 가 사용하고 있다.
심지어 Native Query 에서도 Prepared Statement 를 사용하고 있다고 한다.
사용하는 코드부분을 찾아서 멋있게 첨부하고 싶었지만 시간대비 효율이 떨어지니 생략한다.공식 깃허브(https://github.com/hibernate) 에 들어가서 Prepared Statement 를 검색하면 무수한 코드가 나온다.
떼잉.. 찝찝해서 찾아보았다.
org.hibernate.loader.Loader 를 참조하시라
MyBatis 는 Prepared Statement 를 사용하고 있을까?
사용할 때도 있고 사용하지 않을 때도 있다.
쿼리문에 ${} 를 사용한다면 Statement, #{} 를 사용한다면 Prepared Statement 를 사용한다고 한다.
따라서 ${} 를 사용하고 있다면 SQL Injection 에 유의해야한다.
Reference
728x90'Back End > 보안' 카테고리의 다른 글
CSRF(Cross-Site Request Forgery) 개념부터 재현, 방어까지 (1) - CSRF 공격이란 무엇인가 (0) 2023.04.23 [보안] SQL Injection 대표예제와 원리 (0) 2023.02.13 [XSS] HTML Escape Characters 리스트 (1) 2022.12.19 [AWS] AWS WAF 오탐 예외처리 (AWS WAF False Positive Mitigation) (0) 2022.12.17 [보안] 웹서버 정보 감추기 - AWS Beanstalk 에서 Server Version Disclosure (Feat. .ebextension & .platform) (0) 2022.09.17