# SQL Injection

해커가 조작된 SQL을 날려주어 디비를 손상시키나 정보를 빼앗아가는 공격기법이다.
대표적인 사건의 예로 2017년도에 "여기어때"의 개인정보 유출 사건이 있다.

# 공격 방법

  1. 논리적 에러를 활용한 공격
    로그인을 위해 아이디와 패스워드가 필요하다고 하면, 아래와 같이 쿼리가 나가게 된다.
SELECT * FROM members WHERE id = "input1" AND pwd = "input2"
1

그런데 이와 같은 sql에 논리적인 에러로 "1 == 1"과 같이 항상 참인 값을 넣어 패스워드가 다르더라도 정보를 빼올 수 있게 만든다.

SELECT * FROM members WHERE id = "input1" OR 1 == 1 -- pwd = "input2"
1

이렇게 쿼리를 변경하여 가장 처음에 만든 아이디로 로그인이 될 수 있고 DB를 원하는대로 조작할수 있다.

  1. Error Message를 활용 시스템이 동작하며 발생하는 에러메시지를 활용해 DB의 구조를 유추할 수 있다. 악의적으로 GET 방식으로 동작하는 URL에 쿼리스트링을 추가해 에러를 유발하고 이 에러를 확인하여 DB의 구조를 알고 공격에 참고할 수 있다.

# 방어 방법

  1. 입력값에 대한 검증하기
    SQL이 왔을 때 그 값이 적절한 값인지 확인하여주는 방법이다. 적절하지 않은 값을 블랙리스트로 추가하고 블랙리스트 건을 제외하는 방법은 굉장히 다양한 방법에 대하여 적응해야하기때문에 사실싱 불가능하다. 따라서 화이트리스트 방식으로 적절한 쿼리인지 확인하고 적용해주면 된다.

  2. Error Message 노출 금지 DB의 에러를 일반 사용자들이 볼 수 없도록 조치한다.

  3. Prepared Statement 구문 사용 사용자의 입력값이 데이터베이스로 들어가기 전에 DBMS에서 미리 컴파일하여 ?로 값을 미리 설정해두고 실행을 하지 않고 대기를 한다. 추후에 공격 쿼리가 들어와도 의미없는 단순한 문자열로 판단하여 원하는대로 실행이 되지 않는다.