본문 바로가기

Information Security/Hacking

SQL Injection

반응형

아래 내용들은 DataBase 용어의 기본적 이해가 선행이 필요

* SQL Injection : 웹 애플리케이션의 입력 파라미터를 변조(악성 쿼리) 후 삽입하여 DB의 비정상 접근 시도, DB정보 열람, 시스템 명령 실행 등을 수행

- DB에 악성 스크립트 삽입을 통해, 접근 대상을 악성 사이트로 redirect

- Stored Procedure(저장된 프로시저)를 통한 OS 명령어 실행

 

 

 

* SQL Injection 공격 방식 분류

이름 개요 예시
Form
SQL Injection
- HTML Form 기반 어플리케이션의 사용자 인증 쿼리문의 조건절(where절)이 항상 참이 되도록 쿼리문 조작

- 성공 시, 반환되는 DB Record(행 = Row)셋의 첫 번째 Record에 해당하는 사용자 권한 획득
1.
웹 페이지 HTML 입력 Form에 SQL 쿼리문의 특수문자 입력 (에러 유발)

2.
Where(조건절)에 항상 참이 되는 구문 삽입

3.
인증 무력화
Union
SQL Injection
- 2개 이상의 select문(Field 개수 동일 및 Field 타입 호환 필수)을 결합하는 union select 쿼리 이용

- union all(쿼리 결과를 중복 포함하여 출력) 또는 일반 union(쿼리 결과를 중복 제거하여 출력) 구문을 사용
1.
order by절의 컬럼 인덱스 지정 오류 또는 union select문 컬럼 개수 오류 유발(오류 발생 인덱스 이전까지가 컬럼 갯수)로 '확실한 컬럼 개수 파악 선행'

2.
쿼리문 삽입 시, 선행 select문의 where(조건절)의 '첫 레코드 값'을 빈값('')로 설정

3.
후행 union select문에서 '다음 레코드 값'을 원하는 값으로 지정(패스워드 임의 변경 등에 활용)

4.
결과값 반환으로 정보 노출
Stored Procedure SQL Injection - 저장 프로시저(Stored Procedure - 일련의 쿼리를 하나의 함수처럼 실행하는 쿼리 집합)를 입력 파라미터 뒤에 삽입, 명령어를 연속 수행시킴 1.
선행하는 파라미터와 값(예-xxx.php?no=111)뒤에 세미콜론(;) 입력

2.
그 뒤, 수행 시킬 저장 프로시저를 입력하여 명령어를 연속적으로 수행
(예- xxx.php?no=111;EXEC master..xp_dirtree 'C:\')

3.
C:\의 파일목록 모두 출력
Mass
SQL Injection
- 한 번의 공격으로 대량(Mass)의 DB 값이 변조, 홈페이지에 치명적 영향을 미치는 공격

- DB값 변조 시, 악성 스크립트(보통 js, swf, exe 이용) 삽입으로 악성코드 유포지로 리다이렉트, 악성 코드 설치 등 수행
1.
SQL Injection 방식들을 다양하게 활용, 테이블 컬럼 데이터들을 변경할 수 있게 준비

2.
변경할 수 있는 컬럼들 모두에 악성코드 및 악성코드 유포지 삽입 등 수행

 

 

 

* SQL Injection 공격유형 분류

유형 개요 사례
Error-Based
SQL Injection
- DB 쿼리에 대한 에러값을 기반으로 점진적 DB 정보를 획득하는 방식 1.
테이블 및 컬럼 정보 획득

2.
다음 부분의 컬럼 정보 획득

3.
사용하는 DB 및 버전정보 획득
Blind
SQL Injection
- 오류 메세지 반환 목적이 아닌, 쿼리 결과의 참과 거짓을 통해 의도치 않은 SQL문 실행

- 쿼리 결과의 참/거짓에 대한 반응 형태에 대한 파악 선행

- 많은 비교 과정을 거치기 때문에, 자동화 도구 이용
1.
조건절에 항상 참이 되는 구문 삽입으로 내부 정보 전체 노출

2. 
from information_schema.tables (DB 모든 테이블 정보를 가진 테이블) 조회
+ (where table_type='base table'은 사용자 생성 테이블 조건 지정)

3. 
출력 레코드 개수를 제한하는 limit pos, len 함수를 지정, 순차적으로 정보를 얻어냄
(pos는 0부터 시작하는 시작행,
len는 출력 레코드 개수를 의미 - 각각 1씩 증가시킬 수 있음)
+ (예) limit 0,1

4.
출력 문자열 수를 지정하는 substr(문자열),pos,len) 함수를 지정, 순차적으로 정보를 얻어냄
(1부터 시작하는 pos부터, len 부분만큼 문자열 추출 - 각각 1씩 증가시킬 수 있음)
+ (예) substr((필요 구문),1,1)


*
- 위 다양한 공격 구문들을 통해 조회한 정보가 가진 문자와, 지정한 문자를 비교
- union select로 한문자씩 조회 후, 매칭되는 정보에 따라 컬럼별 출력 위치 짐작, 추가 공격 가능
(나머지 모두 null처리, 필요 위치에 concat(여러 문자를 하나로 합치는 기능) 구문으로 필요 정보 조회 등) 

 

 

 

* SQL Injection 대응 방안

대응 방안 내용
입력값 필터링 - DB와 연동하는 스크립트의 모든 파라미터에 대해 사용자 입력값 필터링
(특수문자 및 SQL 관련 문자 이스케이프 처리)
(ex - php.ini 파일 magic_quotes_gpc = On 또는 (mysql_real_escape_string()등의 이스케이프 목적 라이브러리 함수 사용

- 입력 문자열 길이 제한

- 입력 문자가 숫자인 경우, 숫자가 확실한 지 체크하는 함수 사용
확장 프로시저 제거 - OS 명령어 실행, SQL Injection에 이용될 수 있는 확장 프로시저 제거
(ex - MS-SQL의 master..xp_cmdshell, xp_startmail, xp_sendmail 등)
PreparedStatement(선처리 질의문)
클래스 이용
- 일반 질의문(Statement)은 요청시 마다 동적 쿼리 생성(DB에서 컴파일(쿼리 분석 및 최적화), 권한 체크, 쿼리 실행 단계)을 거쳐 성능 문제 및, 의도 치 않은 쿼리 실행

- 외부의 입력값(변경될 수 있는 값)을 제외한 쿼리 부분을 미리 컴파일 후, 변경되는 값만 Bind(반복적으로 입력값만을 지정)하여 실행하여 입력되는 변수값을 항상 문자열 변수로 다룸

- 그 외, 웹 로그 및 DB 테이블 확인, 취약점 진단, DB 사용자 권한 제한 등

 

 

 

* SQL Injetcion 취약점 스캐너(툴)

이름 특징
Nikto - GNU 기반 오픈소스의 리눅스 기반 툴
SQLMap - Python으로 개발
- 블라인드 SQL Injection 자동으로 수행
Absinthe - GUI 기반
- 블라인드 SQL Injection 자동으로 수행
- DB 스키마와 목록을 자동화 과정으로 다운로드

 

 

반응형

'Information Security > Hacking' 카테고리의 다른 글

DNS 보안  (0) 2021.01.07
DoS & DDoS (Destributed Denial of Service)  (0) 2020.12.27
CSRF (Cross-Site Request Forgery)  (0) 2020.12.27
XSS (Cross-Site Scripting)  (0) 2020.12.27
OWASP 2017 (Open Web Application Security Project)  (0) 2020.12.27