쏭의 개발 블로그
[DB] SQL injection 본문
1. SQL Injection이란?
공격자가 악의적인 의도를 갖는 SQL구문을 삽입하여 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 기법
- 웹 애플리케이션이 백엔드에서 구동 중인 데이터베이스에 질의를 하는 과정에서 사용되는 SQL 쿼리를 조작하여 데이터베이스를 대상으로 공격자가 의도한 악의적인 행위를 할 수 있는 injection 기반의 웹 취약
1) 대표적인 공격 방법
(1) Error based SQL injection - 논리적 에러를 이용한 SQL injection
싱글 쿼드(’), 세미콜론(;)과 같이 SQL 문법 오류를 유발하는 특수문자를 사용하고 오류메세지를 통해 데이터베이스 정보를 유출하거나 의도치 않은 결과를 실행시킬 수 있는 공격
설명
더보기
입력값에 대한 검증이 없음을 확인, 악의적인 사용자가 SQL구문 주입
- 악의적인 사용자가 ‘ OR 1=1 -- 을 주입
- WHERE절을 모두 참으로 만들고 -- 뒤의 구문을 모두 주석처리 해줌
(결론)
- USERS 테이블의 모든 정보를 조회하게 됨으로써 가장 먼저 만들어진 계정으로 로그인 성공하게 됨
- 보통은 관리자 계정을 맨 처음 만들기 때문에 관리자 계정에 로그인 할 수 있게 됨
(2) Union based SQL injection - Union 명령어를 이용한 SQL injection
Union 키워드를 활용하여 다른 테이블의 정보를 함께 조회하여 데이터를 유출 할 수 있는 공격
설명
더보기
- (원래 쿼리) 입력값을 title과 contents컬럼의 데이터랑 비교한 뒤 비슷한 글자가 있는 게시글 출력
- 입력값으로 Union 키워드와 함께 컬럼수를 맞춰서 select문을 넣어줌
- 사용자의 id와 password를 요청하는 쿼리문
- 두 쿼리문이 합쳐져서 하나의 테이블로 보여지게됨
- 사용자의 개인정보가 게시글과 함께 화면에 보여지게 됨
(3-1) Blind SQL injection - Boolean 기반 SQL
쿼리문의 실행 결과가 참/거짓 만을 반환할 때 사용하는 공격 서버가 응답하는 로그인 성공과 로그인 실패 메시지를 이용하여 DB의 테이블 정보를 추출
설명
더보기
- 임의로 가입한 abc123이라는 아이디와 함께 ASCI(…)>100 --구문을 주입
- 테이블명을 조회하는 구문
- limit함수로 하나의 테이블만 조회하고 SUBSTR함수로 첫글자만 뽑아 ASCII를 통해 ascii값으로 변환해줌
- 테이블명 USERS → ‘U’ ascii값으로 조회
- 100이라는 숫자 값과 비교한 후 boolean값 반환
- ‘U’의 ascii값과 100이라는 숫자 비교
- 거짓 → 로그인 실패 / 참 → 성공
- 참이 될 때까지 100이라는 숫자를 변경해가면서 비교
(3-2) Blind SQL injection - Time 기반 SQL
서버로부터 특정한 응답 대신에 참 혹은 거짓의 응답을 통해서 데이터베이스의 정보를 유추하는 기법
설명
더보기
현재 사용하고 있는 데이터베이스의 길이를 알아내는 방법
- 악의적인 사용자가 abc123’ OR (LENGTH(DATABASE())=1 AND SLEEP(2)) -- 구문을 주입
- LENGTH(DATABASE())=1가 참이면 SLEEP(2)가 동작, 거짓이면 동작X
- 숫자 1부분을 조작하여 데이터베이스 길이를 알아낼 수 있음
2) 방어 방법
(1) 입력값에 대한 검증
- 로그인 전 검증 로직을 추가하여 미리 설정한 특수문자들이 들어왔을 때 요청을 막아
- 서버단에서 화이트리스트 기반으로 검증해야함
(2) Prepared Statement 구문 사용
- Prepared Statment 사용 시 사용자의 입력값이 데이터베이스 파라미터로 들어가기전에 DBMS가 미리 컴파일하여 실행하지 않고 대기
- 사용자의 입력값을 문자열로 인식하므로 공격 쿼리가 들어가도 공격자의 의도대로 작동X
(3) 에러 메세지 노출 금지
view를 활용하여 원본 데이터베이스 테이블에 접근 권한을 높임
- 공격자가 SQL injection을 수행하기 위해서는 데이터베이스의 정보가 필요
- 데이터베이스 에러 시 따로 처리해주지않았다면 에러가 발생한 쿼리문과 함께 에러에 관한 내용을 반환
(4) 웹 방화벽 사용
https://noirstar.tistory.com/264
https://2jinishappy.tistory.com/m/333
'DB' 카테고리의 다른 글
[DB] 트리거(Trigger) 간단 정리 (0) | 2023.02.11 |
---|---|
[DB] 저장 프로시저 (0) | 2023.02.11 |
[DB] Redis (0) | 2023.02.11 |
[DB] Transaction Isolation Level 트랜잭션 고립수준 (1) | 2023.02.01 |
[DB] 트랜잭션(Transaction) (0) | 2023.01.31 |