[DB]SQL Injection과 예방

무지성개발자·2023년 9월 14일

SQL Injection

SQL 주입 공격이라고도 불리며 보안 상의 허점을 의도적으로 이용해, 악의적인 SQL문을 실행되게 함으로써 DB를 비정상적으로 조작하는 공격 방법이다.
이미지의 예시는

INSERT INTO Students (이름) VALUES ('학생 이름');
INSERT INTO Students (이름) VALUES ('Robert');
DROP TABLE Students;
--');

이런식으로 테이블을 지웠지만, 일반적으로 OR 1=1 --을 사용하여 모든 row의 정보를 빼낸다. 개인정보 유출 사례가 SQL Injection이라고 볼 수 있다.

종류

Error Based SQL Injection

가장 많이 사용되는 방법으로 OR 1=1 --과 같이 1=1로 모든 조건을 성립시키고 뒤에 문구는 --로 주석처리 시켜 Table의 모든 정보를 얻는 방법이다.

Union based SQL Injection

Union은 두 개의 쿼리문의 결과를 하나의 테이블로 보여주는 연산자로 Union을 통해 원하는 쿼리문을 작성하는 방법이다.

Blind SQL Injection

  • Boolean based
    SQL 쿼리의 결과가 참/거짓이냐에 따라 응답이 다른 경우 사용된다. 참/거짓만을 판단할 수 있는 서버의 응답만으로 공격을 수행하므로 공격자는 논리적으로 문제가 없는 공격 쿼리를 작성하기 위해 많은 시간과 노력필요.

  • Time based
    SQL 쿼리의 결과가 참/거짓이냐에 따라 서버의 응답 시간을 제어할 수 있을 때 사용된다. Sleep(5000);과 같이 밀리초의 단위의 시간 동안 대기하는 SQL 명령을 사용해 공격의 성공 여부를 판단한다. 시간이 지연되면 SQL Injection에 취약하다고 간주.

예방

입력값 검사

SQL 구문으로 해석될 수 있는 특문 또는 SQL 예약어 문자 등을 치환/제거하여 예방. 하지만 일부 SQL Injection에 대해서 효과가 있어 이 방법만 의존 할 수 없다.

  • SQL 기호: 홑따옴표('), 겹따옴표("), 세미콜론(;), 대시(-), 샵(#), 슬래시샵 (/*) 등
  • SQL 구문: SELECT, INSERT, UPDATE, DELETE, UNION, GROUP BY, HAVING, ORDER BY 등

prepared statement사용

prepared statement는 매개변수화된 쿼리라고도 불린다. 이 방법을 사용하면 공격자는 SQL 쿼리의 구조를 알 수 없고, 어떤 HTTP 매개변수가 SQL 쿼리의 어느 부분에 전달되는지 알지 못해 SQL Injection 방어에 유용하다.

최소 권한 & 최소 기능 사용

서비스 중인 어플리케이션이 사용하는 DB계정을 최소 권한만 부여해서 사용해서 예방.


한 줄평 : SQL Injection 공격이 어떤건지는 알고 있었지만 예방법에 대해서는 처음 알아봤다. prepared statement는 단순히 sql문을 작성할 때 statement보다 쉽게 작성한다고만 생각했었는데...

참고 -
https://www.bugbountyclub.com/pentestgym/view/52
https://noirstar.tistory.com/264

profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

0개의 댓글