Oracle의 경우 일반적으로 Blind SQL Injection으로 데이터 추출 시 Substr()내장함수를 사용하기 위해 한 행만 추출해야 한다.
하지만 방화벽이나 기타 필터에 의해 “ROWNUM”이라는 문자열이 필터링 될 경우 이를 우회하기 위해 Row_Number()함수를 사용할 수 있다.
오라클의 시스템테이블의 테이블명, 컬럼명들은 이미 정해져 있다.
우선 모든 컬럼명을 조회하는 쿼리 및 결과는 다음과 같다.
[실행쿼리] SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS; |
[실행결과] 21091개의 행이 선택 [ ..... ] |
다음은 RowNum을 사용하여 상위 1개의 결과만 조회하는 쿼리 및 결과는 다음과 같다.
[실행쿼리] SELECT COLUMN_NAME FROM ( SELECT ROWNUM R, COLUMN_NAME FROM ALL_TAB_COLUMNS ) WHERE R = 1; |
[실행결과] 1개의 행이 선택 [ DUMMY ] |
이를 Rownum()이 아닌 Row_Number()를 사용하여 한 행만 추출해 보겠다.
[실행쿼리] SELECT COLUMN_NAME FROM ( SELECT COLUMN_NAME, ROW_NUMBER() OVER (ORDER BY COLUMN_NAME) R FROM ALL_TAB_COLUMNS ) WHERE R = 1; |
[실행결과] 1개의 행이 선택 [ ABORT_STEP ] |
단지 순서의 차이만 있을 뿐, 추출한 모든 데이터의 집합은 같다.
순위함수에는 ROW_NUMBER(), RANK(), DENSE_RANK()함수가 있다.
ROW_NUMBER()는 다른 순위함수와는 달리 정렬 후
“동일한 값에 동일한 순위를 부여하지 않고 유일한 순위를 부여“ 한다.
'Web Security > Web_Hacking' 카테고리의 다른 글
WebShell] CAIDAO (0) | 2017.01.05 |
---|---|
[Web_Hacking] 프록시 툴(BurpSuite) (0) | 2014.09.24 |