쏭의 개발 블로그

[DB] SQL injection 본문

DB

[DB] SQL injection

songu1 2023. 2. 11. 15:57

1. SQL Injection이란?

공격자가 악의적인 의도를 갖는 SQL구문을 삽입하여 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 기법

  • 웹 애플리케이션이 백엔드에서 구동 중인 데이터베이스에 질의를 하는 과정에서 사용되는 SQL 쿼리를 조작하여 데이터베이스를 대상으로 공격자가 의도한 악의적인 행위를 할 수 있는 injection 기반의 웹 취약

 

1) 대표적인 공격 방법

(1) Error based SQL injection - 논리적 에러를 이용한 SQL injection

싱글 쿼드(’), 세미콜론(;)과 같이 SQL 문법 오류를 유발하는 특수문자를 사용하고 오류메세지를 통해 데이터베이스 정보를 유출하거나 의도치 않은 결과를 실행시킬 수 있는 공격

설명

더보기

입력값에 대한 검증이 없음을 확인, 악의적인 사용자가 SQL구문 주입

  1. 악의적인 사용자가 ‘ OR 1=1 -- 을 주입
  2. WHERE절을 모두 참으로 만들고 -- 뒤의 구문을 모두 주석처리 해줌

(결론)

  • USERS 테이블의 모든 정보를 조회하게 됨으로써 가장 먼저 만들어진 계정으로 로그인 성공하게 됨
  • 보통은 관리자 계정을 맨 처음 만들기 때문에 관리자 계정에 로그인 할 수 있게 됨

 

(2) Union based SQL injection - Union 명령어를 이용한 SQL injection

Union 키워드를 활용하여 다른 테이블의 정보를 함께 조회하여 데이터를 유출 할 수 있는 공격

설명

더보기
  1. (원래 쿼리) 입력값을 title과 contents컬럼의 데이터랑 비교한 뒤 비슷한 글자가 있는 게시글 출력
  2. 입력값으로 Union 키워드와 함께 컬럼수를 맞춰서 select문을 넣어줌
    • 사용자의 id와 password를 요청하는 쿼리문
  3. 두 쿼리문이 합쳐져서 하나의 테이블로 보여지게됨
    • 사용자의 개인정보가 게시글과 함께 화면에 보여지게 됨

 

(3-1) Blind SQL injection - Boolean 기반 SQL

쿼리문의 실행 결과가 참/거짓 만을 반환할 때 사용하는 공격 서버가 응답하는 로그인 성공과 로그인 실패 메시지를 이용하여 DB의 테이블 정보를 추출

설명

더보기
  1. 임의로 가입한 abc123이라는 아이디와 함께 ASCI(…)>100 --구문을 주입
    • 테이블명을 조회하는 구문
  2. limit함수로 하나의 테이블만 조회하고 SUBSTR함수로 첫글자만 뽑아 ASCII를 통해 ascii값으로 변환해줌
    • 테이블명 USERS → ‘U’ ascii값으로 조회
  3. 100이라는 숫자 값과 비교한 후 boolean값 반환
    • ‘U’의 ascii값과 100이라는 숫자 비교
    • 거짓 → 로그인 실패 / 참 → 성공
  4. 참이 될 때까지 100이라는 숫자를 변경해가면서 비교

 

(3-2) Blind SQL injection - Time 기반 SQL

서버로부터 특정한 응답 대신에 참 혹은 거짓의 응답을 통해서 데이터베이스의 정보를 유추하는 기법

설명

더보기

현재 사용하고 있는 데이터베이스의 길이를 알아내는 방법

  1. 악의적인 사용자가 abc123’ OR (LENGTH(DATABASE())=1 AND SLEEP(2)) -- 구문을 주입
  2. LENGTH(DATABASE())=1가 참이면 SLEEP(2)가 동작, 거짓이면 동작X
  3. 숫자 1부분을 조작하여 데이터베이스 길이를 알아낼 수 있음

 

2) 방어 방법

(1) 입력값에 대한 검증

  • 로그인 전 검증 로직을 추가하여 미리 설정한 특수문자들이 들어왔을 때 요청을 막아
  • 서버단에서 화이트리스트 기반으로 검증해야함

(2) Prepared Statement 구문 사용

  1. Prepared Statment 사용 시 사용자의 입력값이 데이터베이스 파라미터로 들어가기전에 DBMS가 미리 컴파일하여 실행하지 않고 대기
  2. 사용자의 입력값을 문자열로 인식하므로 공격 쿼리가 들어가도 공격자의 의도대로 작동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