SQL Injection
SQL Injection이란 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL문을 주입하고 실행되게 하여
데이터베이스가 비정상적인 동작을 하도록 조작하는 행위이다.
공격 종류 및 방법
Normal SQL Injection
논리적 에러를 이용한 SQL Injection으로 가장 많이 쓰이고 대중적인 공격 기법이다.
위 사진을 예시로 들면 1번 쿼리문은 로그인 시 많이 사용되는 SQL 구문이다. 해당 구문에 임의의 SQL 구문을 주입을
하게 되면 내용이 바뀌게 된다. 예시에서 주입한 것은 'OR 1=1 -- 로 User 테이블에 있는 모든 정보를 조회하게 됨으로써
가장 먼저 만들어진 계정으로 로그인에 성공하게 되는 것이다.
Union based SQL Injection
Union 명령어를 이용한 SQL Injection으로 Union 키워드는 두 개의 쿼리문에 대한 결과를 통합해서 하나의 테이블로
보여주게 하는 키워드이다. Union Injection을 성공하기 위해서는 Union 하는 두 테이블의 컬럼수와 데이터 형이
같아야 한다.
위 예시에서 1번 쿼리문은 입력값을 title과 contents 컬럼의 데이터랑 비교한 뒤 비슷한 글자가 있는 게시글을 출력하다.
여기에 Union Injection을 실행하여 컬럼 수를 맞춰서 SELECT 구문을 넣어주게 되면 두 쿼리문이 합쳐져서 출력이 된다.
따라서 성공하게 되면 id와 passwd가 게시글과 함께 하나의 테이블로 보여지게 되는 것이다.
Blind SQL Injection - Boolean based SQL Injection
평범한 SQL 삽입과 같이 원하는 데이터를 가져올 쿼리를 삽입하는 기술이지만 Blind SQL 삽입은 참과 거짓,
쿼리가 참과 거짓에 대한 반응을 구분할 수 있을때 사용되는 기술이다.
위 쿼리문으로 결과를 얻어 한글자씩 끊어온 값을 아스키코드로 변환시키고 임의의 숫자와 비교하여 참과 거짓을
비교하는 과정을 거쳐가며 일치하는 아스키 코드를 찾아낸다. 위 과정을 반복하여 결과들을 조합하여 원하는 정보를
얻어내는 것이다.
Blind SQL Injection - Time based SQL Injection
어떤 경우에는 응답의 결과가 항상 동일하여 해당 결과만으로 참과 거짓을 판별할 수 없는 경우가 있을 수 있다.
이런 경우 시간을 지연시키는 쿼리를 주입하여 응답시간의 차이로 참과 거짓 여부를 판별한다.
Stored Procedure SQL Injection
저장된 프로시저에서의 SQL Injection로 저장 프로시저는 일련의 쿼리들을 모아 하나의 함수처럼 사용하기 위한 것이다.
공격에 사용되는 대표적인 저장 프로시저는 MS-SQL에 있는 xp_cmdshell로 윈도우 명령어로 사용할 수 있게 된다.
단, 공격자가 시스템 권한을 획득 해야 하기 때문에 공격 난이도가 높다.
Mass SQL Injection
다량의 SQL Injection 공격으로 이름처럼 한번의 공격으로 다량의 데이터베이스가 조작되어 큰 피해를 입게 된다.
대응 방안
- 입력 값에 대한 검증
- Prepared Statement 구문 사용
- Error Message 노출 금지
- 웹 방화벽 사용
참고 블로그
'CS(Computer Science)' 카테고리의 다른 글
CS Study : 9주차 - 프로세스와 스레드 (0) | 2023.01.13 |
---|---|
CS Study 8주차 : SQL vs NoSQL (0) | 2023.01.07 |
CS Study 8주차 : 교착상태(Dead Lock) (0) | 2023.01.06 |
CS Study 7주차 : 트랜잭션(Transaction) (0) | 2022.12.22 |
CS Study 7주차 : 정규화(Normalization) (0) | 2022.12.22 |