CS공부/Database

SQL Injection

개발자 정지은 2023. 12. 8. 11:04

# SQL Injection 이란?

해커에 의해 조작된 SQL 쿼리문이 데이터베이스에 그대로 전달되어 비정상적 명령을 실행시키는 공격 기법


# SQL Injection 공격 방법

1. 인증 우회

보통 로그인 시, 아이디와 비밀번호를 input 창에 입력함

예를 들어, 아이디가 abc 비밀번호가 1234 일 때 다음과 같은 방식으로 쿼리가 전송됨

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

SQL Injection 으로 공격할 때 input 창에 비밀번호를 입력함과 동시에 다른 쿼리문이 함께 입력됨

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

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

이 밖에도 기본 쿼리문의 WHERE 절에 OR 문을 추가하여 '1' = '1' 과 같은 True 문을 작성 -> 무조건 적용되도록 수정한 뒤 DB를 마음대로 조작하기도 함

 

2. 데이터 노출

시스템에서 발생하는 에러 메시지를 이용해 공격하는 방법

보통 에러는 개발자가 버그를 수정하는 면에서 도움을 받을 수 있는 존재임

하지만 해커들은 이를 역이용해 악의적인 구문을 삽입하여 에러를 발생시킴

예를 들면, 해커는 GET 방식으로 동작하는 URL 쿼리 스트링을 추가하여 에러를 발생시킴 -> 오류가 발생하면 이를 통해 웹앱의 데이터베이스 구조를 유추함, 해킹에 활용


# 방어 방법

1. input 값을 받을 때, 특수문자 여부 검사하기

로그인 전, 검증 로직을 추가하여 미리 설정한 특수문자들이 들어왔을 때 요청을 막아냄

 

2. SQL 서버 오류 발생 시, 해당하는 에러 메시지 감추기 -> view 활용하기

view 를 활용하여 원본 데이터베이스 테이블에는 접근 권한을 높임

일반 사용자는 view로만 접근하여 에러를 볼 수 없도록 만들기

 

3. preparestatement 사용하기

preparestatement 를 사용하면, 특수문자를 자동으로 escaping 해줌 -> 전달인자 값을 ? 로 받음

이를 활용하여 서버 측에서 필터링 과정을 거쳐 공격을 방어함