[Database] SQL Injection - 개념, 공격 방법, 방어 방법

·2021년 8월 2일
3

Database

목록 보기
3/3

1. SQL Injection이란?

응용 프로그램 보안 상의 허점을 의도적으로 이용해, 악의적인 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 공격 기법

  • 웹 애플리케이션이 백엔드에서 구동 중인 데이터베이스에 질의를 하는 과정에 사용되는 SQL 쿼리를 조작하여 데이터베이스를 대상으로 공격자가 의도한 악의적인 행위를 할 수 있는 Injection 기반의 웹 취약점
  • 공격에 성공하게 되면 조직 내부의 민감한 데이터나 개인 정보를 획득할 수 있으며, 심각한 경우에는 조직의 데이터 전체를 장악하거나 완전히 손상시킬 수 있다.



2. 공격 방법

1) 인증 우회

SQL 인젝션 공격의 대표적인 경우로, 로그인 폼(Form)을 대상으로 공격을 수행한다. 정상적인 계정 정보 없이도 로그인을 우회하여 인증을 획득할 수 있다.

예시 1

로그인 시, 아이디와 비밀번호를 input 창에 입력하게 된다. 아이디가 abc, 비밀번호가 만약 1234일 때 쿼리는 아래와 같은 방식으로 전송될 것이다.

SELECT * FROM USER WHERE ID = "abc" AND PASSWORD = "1234";

input 창에 비밀번호를 입력함과 동시에 다른 쿼리문을 함께 입력한다면?

"1234"; DELETE * USER FROM ID = "1";

보안이 완벽하지 않은 경우, 이처럼 비밀번호가 아이디와 일치해서 True가 되어 뒤에 작성한 DELETE 문이 데이터베이스에 영향을 줄 수도 있다.

예시 2

기본 쿼리문의 WHERE 절에 OR문을 추가하여 '1' = '1'과 같은 true문을 작성하여 무조건 적용되도록 수정한 뒤 DB를 마음대로 조작할 수도 있다.

select * from client where name='anjinma' and password=' or '1'='1

2) 데이터 노출

시스템에서 발생하는 에러 메시지를 이용해 공격하는 방법이다. 보통 에러는 개발자가 버그를 수정하는 면에서 도움을 받을 수 있지만, 해커들은 이를 역이용해 악의적인 구문을 삽입하여 에러를 유발시킨다.

예시

해커는 GET 방식으로 동작하는 URL 쿼리 스트링을 추가하여 에러를 발생시킨다. 이에 해당하는 오류가 발생하면, 이를 통해 해당 웹앱의 데이터베이스 구조를 유추할 수 있고 해킹에 활용한다.

url을 통해 파라미터를 주고받는 GET 방식은 해커가 단순히 url을 통해 전달될 파라미터를 조작하기만 한다면 손쉽게 SQL injection 취약점을 적용할 수 있다.

  • URL 쿼리 스트링 : 사용자가 입력 데이터를 전달하는 방법중의 하나로, url 주소에 미리 협의된 데이터를 파라미터를 통해 넘기는 것
    - http://test.com/login.php?id=abc1234 and password=''



3. 방어 방법

1) 입력 값에 대한 검증

검증 로직을 추가하여 미리 설정한 특수문자들이 들어왔을 때 요청을 막아낸다.


2) Error Message 노출 금지

데이터베이스 에러 발생 시 따로 처리를 해주지 않았다면, 에러가 발생한 쿼리문과 함께 에러에 관한 내용을 반환해 준다. 여기서 테이블명, 컬럼명, 쿼리문이 노출이 될 수 있기 때문에, 오류발생 시 사용자에게 보여줄 수 있는 페이지를 따로 제작하거나 메시지박스를 띄우도록 해야한다.


3) Prepared Statement 구문사용

서버의 php파일에 sql 쿼리문이 아래와 같이 고정되어 있고 외부의 입력으로는 이 템플릿을 변경할 수 없다면, ?에 들어가는 데이터는 단순히 문자열로 취급하기 때문에 SQL 인젝션은 발생할 수 없다.

INSERT INTO MyGuests VALUES(?, ?, ?)



출처

https://github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Database/SQL%20Injection.md
https://noirstar.tistory.com/264
https://www.bugbountyclub.com/pentestgym/view/52
https://m.mkexdev.net/427

profile
당근먹고 자라나는 개발자

0개의 댓글