[DB]SQL Injection과 예방

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

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개의 댓글