독개

SQL Injection-Union Injection

by #독개#

Union이란?

Union

- 둘 혹은 그 이상의 SELECT 구문의 결과를 합치는데 사용되는 연산자

- UNION 앞의 명령어와 뒤의 명령어를 함께 실행 할 수 있게 해주는 연산자 

Union Injection

- 앞의 정상 Query와 UNION 뒤의 공격 Query를 함께 실행하는 공격기법

- UNION 명령을 써서 앞의 SELECT구문과 내가 원하는 SELECT구문을 같이 실행시키게 하는 방법이라 보면됨

기본 형식

- SELECT <필드명> FROM <테이블명> WHERE <조건> UNION SELECT <필드명> FROM<테이블명> WHERE <조건> 

특징

- 두개이상의 select문으로 구성되어야 하며 union키워드로 구분

   ex) 4개의 select문 결합 : select union select union select union select

- SELECT문의 필드명의 갯수와, 조건의 자료형의 수가 일치해야한다.


이게 무슨말이냐?

SELECT id,pass FROM member WHERE id='admin' , pass='1234', phone='010-2222-4444' UNION

SELECT a,b FROM board WHERE a='x' , b='y', c='z'


필드수일치 2개 , 조건수 일치(Verchar : 2개 , Int : 1개)


조건

 조건 테이블명, 컬럼명, 컬럼타입을 획득해야함



ex) DB의 다른 테이블의 정보들을 Union으로 모두 확인하기

공격1 - 테이블명 알아내기 (having)
1) having절은 group by에 의한 결과를 제한할 때 사용한다.
   group by 에 의해 결과를 집계한 다음 having 절에 명시한 조건으로 맞지 않는 결과는 버린다.

2) -- 는 뒤에 오는 내용을 ‘single line comment(한 줄짜리 주석)로 만든다.

이는 다음과 같은 오류를 만들어낸다

이 에러메시지를 통해 table명이 bbs라는 것과 첫번째 컬럼명이 idx라는 것을 알 수 있다. 

이제 공격자는 모든 필드명을 알아낼 차례이다.

공격 2 - 필드명 알아내기 (group by)


이는 다음과같은 오류를 만들어낸다

두번째 컬럼명이 tid라는 것을 알 수 있다.


세번째 필드명을 알아내자.

'group by bbs.idx, bbs.tid having 1=1 --

이런식으로 반복하며 모든 컬럼명을 알아낼수 있다. (모든 필드명을 기입시 오류가 더이상 나지 않음)


공격 3 - 필드 타입 알아내기 (union)
공격자는 아직 각 컬럼의 타입을 모른다.
sum()은 int형의 자료만 받을수 있다.
타입에 대한 에러를 보기 위해 다음과 같은 공격 쿼리를 입력한다.
첫번재 컬럼 idx 확인


이오류가 뜨면 sum()에 들어간 자료형이 int인것이다.

두번째 컬럼 tid 확인

이오류가 뜨면 sum()에 들어간 자료형이 int가 아니란 것이다. union체크 전에 sum()에서 오류가 발생
이를 이용해 어떤 table의 어떤 column이든 type 을 추정할 수 있다.

union을 통해 컬럼의 갯수를 알수도 있다.
'union select null,null,null --
'union select null,null,null,null --
'union select null,null,null,null,null --
늘려가다 보면 에러 없을때가 테이블의 컬럼 갯수가 맞을때이다.

찾아낸 컬럼명과 자료형 정리


 테이블명

컬럼명 

자료형 

bbs

idx

int 

tid

verchar 

tName 

verchar 

tMail 

verchar 

tTitle 

verchar 

tContent 

verchar 

tfilename 

verchar 

tfilepath 

verchar 

tRead 

int 

tDate

datetime 


공격 4 - 데이터 추출하기

목적 

 DB에 저장되어있는 데이터 추출

방법

 테이블 명과 컬럼 명 및 컬럼의 필드 수, 타입이 모두 확인이 되면 union 연산을 통해 결과값을 게시판에 출력 

Information

_schma 

- DB의 메타 데이터를 제공하는 스키마로써 사용자 DB의 대한 정보를 확인해볼수 있음 (각DBMS마다 다름)

- Information_schema.tables (모든 테이블의 정보저장)    - MySQL

- Information_schema.columns (모든 컬럼의 정보저장)    - MySQL

- sysobjects (name:테이블명 xtype: U인게 유저가 만든거) - MsSQL


각 DBMS에따라 이런 기본적으로 생성되는 테이블이 있다. 여기서 이 DB의 테이블들을 다확인하거나 컬럼들을 다확인할수 있다.

우리 실습은 MsSQL로 진행되므로 구조를보면 이렇다



즉 xtype중 U인것만 선택해서 추출한다면 DB에 실질적인 테이블명을 다가져올수 있다.


이걸이제 웹에서 union을 통해 추출해보자


4-1 각컬럼의 값들이 어디에 쓰이는지 확인하기


각 필드갯수와 자료형을 잘맞춰서 union 인젝션 해본다.




아하! d와 b의 자리가 보기 좋겟구나. (만약 int형 자료를 나타내야할땐 1,2의 위치를 활용함되겠군)


4-2 필요한 데이터들 추출하기 (테이블, 원하는값)


d와 b의 컬럼에 내가 보고싶은 필드명을 적어서 추출해보자




이 DB에는 bbs라는 테이블과 member라는 테이블이 존재 하는구나


member 테이블의 데이터를 공격1,2를 통해서 추출해보면


 테이블명

컬럼명 

자료형 

member

idx

int 

bid

verchar 

bPass 

verchar 

bName 

verchar 

bPost

verchar 

bAddr1

verchar 

bAddr2

verchar 

bPhone

verchar 

bMail

verchar

bDate

datetime 


우리가 원하는건 bid와 bPass이다. 둘다verchar이므로 4-1의 d와 b자리에 넣으면 되겟군



bidbPass를 확인할수 있다.



블로그의 정보

독한 개발자

#독개#

활동하기