SQL 주입 공격이라고도 불리며 보안 상의 허점을 의도적으로 이용해, 악의적인 SQL문을 실행되게 함으로써 DB를 비정상적으로 조작하는 공격 방법이다.
이미지의 예시는
INSERT INTO Students (이름) VALUES ('학생 이름');
INSERT INTO Students (이름) VALUES ('Robert');
DROP TABLE Students;
--');
이런식으로 테이블을 지웠지만, 일반적으로 OR 1=1 --
을 사용하여 모든 row의 정보를 빼낸다. 개인정보 유출 사례가 SQL Injection이라고 볼 수 있다.
가장 많이 사용되는 방법으로
OR 1=1 --
과 같이 1=1로 모든 조건을 성립시키고 뒤에 문구는 --로 주석처리 시켜 Table의 모든 정보를 얻는 방법이다.
Union은 두 개의 쿼리문의 결과를 하나의 테이블로 보여주는 연산자로 Union을 통해 원하는 쿼리문을 작성하는 방법이다.
Boolean based
SQL 쿼리의 결과가 참/거짓이냐에 따라 응답이 다른 경우 사용된다. 참/거짓만을 판단할 수 있는 서버의 응답만으로 공격을 수행하므로 공격자는 논리적으로 문제가 없는 공격 쿼리를 작성하기 위해 많은 시간과 노력필요.
Time based
SQL 쿼리의 결과가 참/거짓이냐에 따라 서버의 응답 시간을 제어할 수 있을 때 사용된다.
Sleep(5000);
과 같이 밀리초의 단위의 시간 동안 대기하는 SQL 명령을 사용해 공격의 성공 여부를 판단한다. 시간이 지연되면 SQL Injection에 취약하다고 간주.
SQL 구문으로 해석될 수 있는 특문 또는 SQL 예약어 문자 등을 치환/제거하여 예방. 하지만 일부 SQL Injection에 대해서 효과가 있어 이 방법만 의존 할 수 없다.
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