Security - SQL 인젝션 (SQL Injection)
SQL Injection 이란 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위이다.
OWASP(Open Web Application Security Project) Top10중 첫번째에 속해 있으며, 공격이 비교적 쉬운 편이고 공격에 성공할 경우 큰 피해를 입힐 수 있는 공격이다. 이러한 Injection 계열의 취약점들은 테스트를 통해 발견하기는 힘들지만 스캐닝툴이나 코드 검증절차를 거치면 보통 쉽게 발견되기 때문에 탐지하기는 쉬운 편이다.
아래예시는 Injection공격을통해 ID와 PW를 알지못해도 로그인에 성공할 수 있다는 사실을 보여준다. (OR 1=1은 무조건 true이기때문에)
SELECT user FROM user_table WHERE id='입력한 아이디' AND password='입력한 비밀번호';
SELECT user FROM user_table WHERE id='admin' AND password=' ' OR '1' = '1';
피해사례
- 2017년 3월 "여기어때"라는 숙박어플의 대규모 개인정보 유출사건
방어방법
- XSS와 상당 부분 중복되지만, 기본적으로 유저에게 받은 값을 직접 SQL로 넘기면 안된다. 요즘에 쓰이는 거의모든 데이터베이스 엔진은 유저 입력이 의도치 않은 동작을 하는 걸 방지하는 escape함수와 prepared statement를 제공한다. prepared statement는 변수를 문자열로 바꾸는 것이라 안전하다.
<Reference>
- https://namu.wiki/w/SQL%20injection#s-2.1
- https://noirstar.tistory.com/264