CS
[DB] SQL 인젝션 (SQL Injection )
D0HAN.
2021. 7. 10. 20:09
✔️SQL 인젝션(SQL Injection)이란?
보안상의 취약점을 의도적으로 이용하여 악의적 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 방법중 하나.
*코드 인젝션의 종류에는 SQL 인젝션, HTML 스크립트 삽입, evaluation 취약점, 객체 삽입, 원격 파일 삽입, 셸 삽입 등이 있다.
1. Error Based SQL Injection
- 논리적 에러를 이용한 인젝션 방법
- 가장 많이 쓰이고, 대중적
- 공격 방법
보통 로그인을 할때 아래와 같은 쿼리문으로 인증한다.SELECT * FROM Users WHERE id = 'aaa' AND password = 'qwer1234@'
이때 id에admin
, 패스워드에password' OR 1=1 --
를 입력하면SELECT * FROM Users WHERE id = 'admin' AND password = 'password' OR 1=1 -- ....
OR뒤의 값이 항상 참이고, 그 후의 쿼리문은 주석처리가 되므로 비밀번호를 입력하지 않고도 로그인 할 수 있게 된다.
2. Union based SQL Injection
- 원래의 요청에 추가 쿼리를 삽입하여 정보를 얻어냄
- 2개 이상의 쿼리를 요청하여 하나의 테이블로 결과를 얻는다.
- 단, 2개의 테이블이 동일한
필드 개수
와데이터 타입
을 가져야 하므로 사전공격을 통해 미리 알아놔야 함. 방법 - 공격 방법
게시글을 검색할때 아래와 같은 쿼리문을 입력한다.SELECT * FROM Board WHERE title LIKE '%INPUT%' OR contents '%INPUT%'
input 에'UNION SELECT null,id,password FROM Users--
를 넣어주게 되면 (이때 Board테이블의 칼럼 갯수에 맞추어 null이라는 빈 컬럼을 추가한 것) Board 테이블의 id, password를 알아낼 수 있다.
3. Blind based SQL Injection
- DB로부터 특정 데이터 전달받지 않고, 참 거짓만 알 수 있을 때 사용
- 오류 메세지가 출력되지 않는 사이트에서 위의 기법을 사용할 수 없을 때, 취햑점 여부를 판단
- 서버가 응답하는 로그인 성공과 실패 메시지를 이용하여 DB 테이블 정보 등을 추출할 수 있다
- 공격 방법
테이블 명을 알고 싶을때, input에' and 1=1 --
과'and 1=2 --
의 넣어보고 참일 때와 거짓일 때의 출력값을 알아낸다. 그리고'and ASCII(SUBSTR(SELECT name FROM Table)name from Table limit 0,1),1,1)) <67
과 같은 방식으로 참이 될 때까지 숫자를 변경해가며 테이블 명을 한 글자씩 알아낼 수 있다. 이와 같은 방식으로 컬럼 수,테이블 이름 등을 알 수 있다.
SLEEP, WATI, BENCHMARK등을 이용해 참과 거짓을 알아내는 방법도 있다.
4. Stored Procedure based SQL Injection
- Stored Procedure는 일련의 쿼리를 하나의 함수처럼 실행하기 위한 쿼리의 집합
- SQL Injection 의 취약점으로 인해 웹에서 Stored Procedure에 대한 접근 권한 가져서 실행 가능
- 시스템 권한을 획득해야 하므로 공격 난이도가 높으나 성공한다면 서버에 직접적인 피해를 입힐 수 있다.
🚨 SQL 인젝션 대응 방안
- 입력값 검증
- 화이트리스트 방식으로 지정된 형식의 문자만 검증
- 특수문자 등의 에러 발생 유무 확인
- db_name()으로 DB명 추출 여부 확인
- SQL 오류 발생시 에러 메세지 표시하지 않음
- 별도로 처리해주지 않을 경우 에러가 발생한 쿼리문과 함께 에러에 관한 내용을 반환함.
이 때 테이블 명, 컬럼명, 쿼리문이 노출 될 수 있기 때문에 메세지가 표시되지 않도록 처리해 주어야 함.
- 별도로 처리해주지 않을 경우 에러가 발생한 쿼리문과 함께 에러에 관한 내용을 반환함.
- 저장 프로시저 사용
- 사용하고자 하는 쿼리에 미리 형식을 지정하여 지정된 형식의 데이터가 아니면 쿼리문이 실행되지 않도록 함.
- 서버 보안
- 최소 권한 유저로 DB운영
- 목적에 따라 쿼리 권한 수정
- 신뢰할 수 있는 네트워크, 서버에 대해서만 접근 허용
- 웹 방화벽 사용
참고
https://ko.wikipedia.org/wiki/%EC%BD%94%EB%93%9C_%EC%9D%B8%EC%A0%9D%EC%85%98
https://ko.wikipedia.org/wiki/SQL_%EC%82%BD%EC%9E%85
https://dailylearn.tistory.com/14
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=shackerz&logNo=220449932926
http://blog.plura.io/?p=6056