Skip to content

SQL Injection

해커에 의해 조작된 SQL 쿼리문이 데이터베이스에 그대로 전달되어 비정상적 명령을 실행시키는 공격 기법


공격 방법

1) 인증 우회

보통 로그인을 할 때, 아이디와 비밀번호를 input 창에 입력하게 된다. 만약 애플리케이션이 사용자 입력을 문자열로 이어 붙여 SQL을 만든다면 공격에 취약해진다.

SELECT * FROM USER WHERE ID = "abc" AND PASSWORD = "1234";

예를 들어 아래처럼 검증 없이 문자열을 이어 붙이면,

SELECT * FROM USER WHERE ID = '" + id + "' AND PASSWORD = '" + password + "';

공격자는 입력값에 SQL 조각을 넣어 조건을 바꿀 수 있다.

sql
' OR '1'='1

그러면 인증 조건이 항상 참이 되도록 만들어 로그인 우회를 시도할 수 있다.

추가로 DB 드라이버가 다중 문장 실행을 허용하면 ; DELETE ... 같은 2차 명령 삽입도 가능해질 수 있다.


2) 데이터 노출

에러 메시지, 응답 차이, 실행 시간 차이를 이용해 DB 구조나 데이터를 추론하는 방법이다.

예를 들면 공격자는 URL 파라미터나 폼 입력값에 악성 구문을 넣어 에러 기반(Error-based), UNION 기반, Blind SQL Injection 등을 시도한다.



방어 방법

1) Prepared Statement / Parameterized Query 사용하기

가장 중요한 방어책이다. 사용자 입력을 SQL 문자열에 직접 이어 붙이지 않고, 파라미터로 바인딩해서 SQL 코드와 데이터를 분리한다.

2) 입력값 검증은 보조 수단으로 사용하기

길이, 형식, 허용 문자 등을 검증하는 것은 도움이 되지만, 특수문자 차단만으로 SQL Injection을 막을 수는 없다. 블랙리스트 방식은 우회되기 쉽다.

3) 에러 메시지는 숨기고, DB 권한은 최소화하기

사용자에게는 일반화된 오류만 보여주고, 자세한 SQL 오류는 서버 로그로만 남긴다. 또한 애플리케이션 DB 계정에는 꼭 필요한 권한만 부여해 피해 범위를 줄인다.

4) 불필요한 기능은 줄이기

다중 문장 실행(multi-statement), 과도한 동적 SQL, 관리자 권한 계정 사용은 가능한 한 피하는 것이 좋다.