'Union Select'에 해당되는 글 1건

  1. 2017.01.21 Oracle 테스트 환경 구축 + Union Select 쿼리 정리
2017. 1. 21. 16:17 :: 웹 보안

안녕하세요. Message 입니다.

오늘은 SQL Injection, Union Select 테스트를 위해

ORACLE 기반의 테스트 환경을 구축하고 DB 쿼리문을 정리하는 글을 포스팅하려 합니다.

쿼리문은 인젝션 포인트에서 Union Select 구문을 날리는 순서대로 진행하고자 합니다.

 

 

-----------------------------------------------------------------------------------------------------------------

0x00 준비

-----------------------------------------------------------------------------------------------------------------

 

 

ORACLE 공식 홈페이지에서 ORACLE Database Express Edition 11g Release2 (XE) 를 다운받습니다.

무료(OTN License)이며, 기본으로 내장된 테이블만으로도 각종 실습이 가능합니다.

URL : https://www.oracle.com/index.html

 

이후에 Next 쭉쭉~ 진행하시면 되며

중간에 입력하는 패스워드는 데이터베이스 접속 시 사용됩니다.

 

 

 

설치가 완료되었다면 구동시켜봅니다.

시작버튼을 누르고 Oracle 설치 폴더에서 Start Database를 실행시켜서 아래와 같은 창이 뜨는지 확인합니다.

 

이후에 동일 폴더에서 Get Started 버튼을 누르면 아래와 같은 ORACLE HOME 메인 페이지로 접속됩니다.

이때 루프백주소(127.0.0.01) 8080 포트로 접속되므로,

각종 프록시 도구나 기타 서버 프로그램과의 포트 충돌에 주의해야 합니다. 

 

 

 

-----------------------------------------------------------------------------------------------------------------

0x01 실행

-----------------------------------------------------------------------------------------------------------------

 

메인 페이지에서 Application Express 으로 이동합니다.

로그인창에서는 SYSTEM(유지보수용, DB생성 권한 없음) 계정으로 접속하며, 위에서 설정한 ID/PW를 입력합니다.

참고로 계정은 SYS(오라클 Super), SYSTEM(유지보수용), SCOTT(sample ID, 실습용), HR(sample ID, 실습용) 등이 있습니다.

 

Application Express 탭에서 Create New 항목을 이용하여 계정을 생성합니다.

계정 생성이 완료되었다면, 우측 Getting Started의 Login Here 버튼을 클릭하여 로그인창으로 넘어갑니다.

 

방금 생성한 계정 또는 기존의 계정으로 로그인합니다.

 

SQL Workshop을 눌러 생성한 계정의 DB를 살펴봅니다.

 

이제 SQL Commands 항목으로 이동하면 쿼리문을 날릴 수 있는 페이지가 나옵니다.

 

 

 

-----------------------------------------------------------------------------------------------------------------

0x02 테스트 & 실습

-----------------------------------------------------------------------------------------------------------------

 

1. DB종류 판별

실제로 진단을 수행할 경우에는 어떤 DB인지 알 수 없으므로 아래 쿼리문을 이용하여 확인합니다.

일차적으로는 주석으로 MYSQL 또는 MSSQL/ORACLE 등의 여부를 판단합니다.

- "#" → MYSQL

- "--" → MSSQL, OACLE

 

결과값을 통해 주석을 "--" 문자로 사용하는 DB라는 결과가 나온다면

특수문자를 어떻게 받아들이느냐로 간편히 DB를 구분할 수 있습니다.

MSSQL의 경우에는 "||" 문자를 OR 연산자로 인식하지만, ORACLE은 'AB' || 'CD" 를 문자열 'ABCD'로 인식합니다.

즉, 인젝션 포인트에서 아래의 쿼리문이 참으로 판단되어 결과값이 잘 나온다면 ORACLE 입니다.

 

 

2. 전체 테이블 확인 + 로그인 유저의 테이블 확인

초반부에서 잠깐 언급했지만, 일단 ORACLE 설치가 완료되면 별도의 테이블 생성 없이

기본적으로 제공되는 테이블들이 있기 때문에 바로 실습이 가능합니다.

DB에 어떤 테이블들이 존재하는지 ALL_TABLES 테이블명으로 질의할 수 있습니다.

제가 설치한 버전에서는 89개의 테이블이 나왔습니다.

 

만약 특정 DB 계정을 얻는데 성공했다면, 로그인한 계정이 소유한 테이블이 무엇인지 확인할 필요가 있습니다.

이럴경우에는 아래와 같이 USER_TABLES 테이블명으로 질의할 수 있습니다. 18개 테이블이 나왔습니다.

 

그중에 제가 사용한 테이블은 EMPDEMO_USERS 테이블입니다.

아무래도 각종 DB 서적에서 자주 사용되는 테이블이다보니 친숙하기도 했고,

특히 EMP 테이블은 Union Select 쿼리를 날릴때 DATE 속성이 있던 케이스가 있어서 선택했습니다.

 

 

3. 컬럼 개수 확인

Union Select를 이용한 Injection 공격 수행을 할 경우, 질의하는 테이블의 컬럼 개수를 알아내야 합니다.

왜냐하면 Union Select 자체가 앞선 Select 구문과 합쳐져서 나오기 때문이지요.

이럴때 Order By + 숫자(컬럼) 질의를 이용하면 컬럼의 개수를 알아낼 수 있습니다.

아래와같이 숫자를 1로 할 경우, EMPNO 컬럼의 오름차순으로 정렬되지만,

숫자를 9로 지정할 경우, 해당되는 속성이 없어서 결과값이 반환되지 않습니다. 즉 컬럼 개수를 알 수 있죠.

 

 

4. 컬럼 타입 확인

Union Select의 경우 컬럼의 타입도 맞춰 주어야 검색이 가능합니다.

일반적으로는 아래 질의문과 같이 컬럼 개수만큼 숫자 + 문자를 넣어주며 공격 쿼리문을 날립니다.

하지만 앞선 SELECT 문에서 검색되는 컬럼들의 타입과 일치하지 않으면 에러가 나지요.

SELECT * FROM EMP WHERE EMPNO > 7500 UNION SELECT 1, '2', 3, '4', 5, '6', 7, 8 FROM EMP;

 

하지만 컬럼의 타입이 위에서 언급한 DATE일 경우도 있으므로, 숫자 + 문자 + DATE 등의 경우의 수가 너무 복잡해집니다.

이럴때는 컬럼의 개수만큼 NULL을 넣어주고, 맨 앞에서부터 하나씩 숫자와 문자 등을 넣어주며 타입을 맞춰주면 됩니다.

 

이때 DATE 속성의 경우에는 아래와 같이 타입을 캐스팅 해주지 않으면 에러가 발생합니다.

 

 

5. 컬렴명 확인

이젠 UNION SELECT 테이블명에 원하는 테이블을 넣고, 동일 타입에 해당 테이블 컬럼을 넣어주어 DB 데이터를 뽑아내면 됩니다.

테이블명은 ALL_TABLES를 이용하여 알아내면 되지만, 우리는 아직 해당 테이블의 컬럼명을 모릅니다.

테이블의 컬럼명은 아래와 같이 ALL_TAB_COLUMNS 테이블명을 이용하여 얻어냅니다.

이때도, USER_TAB_COLUMNS 테이블명을 이용하면, 현재 계정의 권한으로 어떤 속성에 접근이 가능한지 선별할 수 있습니다.

 

 

6, BONUS. 출력 팁

깨알같은 팁이지만, UNION SELECT를 이용해 게시판 등에서 원하는 쿼리를 뽑을 경우

어떤 데이터가 무엇을 의미하는지 모르는 상황이 발생할 수 있습니다.

이럴때는 CONCAT 함수와 || 문자를 이용하여 깔끔한 출력값을 얻어낼 수 있습니다.

 

 

 

-----------------------------------------------------------------------------------------------------------------

0x03 마무리

-----------------------------------------------------------------------------------------------------------------

 

이것저것 쿼리를 날리다보면, 오타여서 오류가 발생하는지, 쿼리가 잘못된건지 기타 이유를 파악하는데 시간이 너무 오래 걸렸습니다.

그럴바엔 직접 DB에 쿼리를 날리면서 실습을 해보고자 포스팅을 하게 되었습니다.

덤으로 어느정도 DB에 대한 막연함이 사라진것 같기도 하네요!

읽어주셔서 감사합니다.

 

 

posted By Message.

Commit your way to the LORD, trust in him and he will do this. [PSALms 37:5]

 

posted by Red_Message