티스토리 뷰

SQL Injection의 개념

  • 클라이언트로부터 데이터베이스에 접속 시도 및 질의하는 과정에 사용되는 SQL 쿼리를 조작하여 악의적인 행위를 할 수 있는 웹 취약점 중 하나
  • 공격에 성공 시 내부 데이터나 개인 정보를 획득할 수 있으며, 최악의 경우에는 조직의 데이터 전체를 조작하거나 손상시킬 수 있음

 

공격 방법

 

Error based SQL Injection

 

아이디가 abc, 비밀번호가 1234일 때 로그인 시 사용되는 쿼리문은 보통 아래와 같다.

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

 

만약 아이디 입력창에 입력값에 대한 검증이 없는 것이 확인되면 아이디 입력창에 ‘ OR 1=1 -- 를 입력하여  WHERE 절에 WHERE 절을 모두 참으로 만들고, -- 를 넣어줌으로 뒤의 구문을 모두 주석 처리할 수 있습니다.

SELECT * FROM USER WHERE ID = ' 'OR 1=1 -- ' AND PASSWORD = '1234';

결론적으로 User 테이블에 있는 모든 정보를 조회하게 됨으로 써 가장 먼저 만들어진 계정으로 로그인에 성공하게 되며 보통은 관리자 계정을 맨 처음 만들기 때문에 관리자 계정에 로그인 할 수 있게 됩니다. 관리자 계정을 탈취당하게되면 관리자의 권한을 이용해 또 다른 2차피해를 초래할 수 있습니다.

 

방어 방법

 

입력 값 검증

SQL Injection 에서 사용되는 기법과 키워드 종류는 많기 때문에 사용자의 입력 값에 대한 검증이 필요합니다. 서버 단에서 화이트리스트 기반으로 검증해야 합니다. 블랙리스트 기반으로 검증하게 되면 수많은 차단리스트를 등록해야 하고, 하나라도 빠지면 공격에 성공하게 되기 때문입니다. 공백으로 치환하는 방법도 많이 쓰이는데, 이 방법도 취약한 방법입니다. 예를 들어 공격자가 SESELECTLECT 라고 입력 시 중간의 SELECT가 공백으로 치환이 되면 SELECT 라는 키워드가 완성되게 됩니다. 공백 대신 공격 키워드와는 의미 없는 단어로 치환되어야 합니다.

 

 

Prepared Statement 구문 사용

 Prepared Statement 구문을 사용하게 되면, 사용자의 입력 값이 데이터베이스의 파라미터로 들어가기 전에DBMS가 미리 컴파일 하여 실행하지 않고 대기합니다. 그 후 사용자의 입력 값을 문자열로 인식하게 하여 공격쿼리가 들어간다고 하더라도, 사용자의 입력은 이미 의미 없는 단순 문자열 이기 때문에 전체 쿼리문도 공격자의 의도대로 작동하지 않습니다.

 

 

Error Message 노출 방지

공격자가 SQL Injection을 수행하기 위해서는 데이터베이스의 정보(테이블명, 컬럼명 등)가 필요합니다. 데이터베이스 에러 발생 시(catch 발생 시) 따로 에러 문구를 만들어 주지 않는다면, 에러가 발생한 쿼리문 및 에러에 관한 내용을 리턴하기 때문에 테이블명 및 컬럼명 그리고 쿼리문이 노출이 될 수 있습니다.

 

 

웹 방화벽 사용

웹 방화벽은 서버 내에 직접 설치하는 소프트웨어 형, 네트워크 상에서 서버 앞 단에 직접 하드웨어 장비로 구성하는 하드웨어 형, DNS 서버 주소를 웹 방화벽으로 바꾸고 서버로 가는 트래픽이 웹 방화벽을 먼저 거치도록 하는 프록시 형이 있습니다.

 

반응형

'Programming & CS > Security' 카테고리의 다른 글

[보안/해킹] 웹 보안 취약성  (3) 2022.08.16
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함