본문 바로가기
취약점/웹 취약점

[Web 취약점] Injection 공격 방법(SQL Injection 2 : union based injection)

by 인성패밀리 2021. 10. 26.
반응형

본문의 내용을 가지고

어떠한 프로그램에 공격을 시행하여 발생하는 일은

전적으로 공격을 시행한 본인에게 있습니다.

반드시 실습은 본인이 구축하여 시행하시길 바랍니다.

========================================================

실습 환경 : VMware

실습 com1 : kali linux

실습용 취약한 server : bee-box

 

※ kali와 bee-box는 검색하여 쉽게 설치가 가능합니다.

========================================================


SQL Injection 공격 방법 중 하나인 union based injection에 대해서 설명하겠습니다.

 

union based 공격 방법은 SQL의 문법 중 union의 기능을 이용한 방법입니다.

 

먼저 SQL에서 union 구문의 사용 방법입니다.

 

select * from table1 union select * from table2 => 중복 허용 안함

select * from table1 union all select * from table2 => 중복 허용

 

union 구문 양쪽에 select가 위치한 것을 볼 수 있습니다.

 

이제 이 구문을 활용해보겠습니다.

 

먼저 웹 페이지에서 데이터베이스 쪽에 select로 질의하는 것이 있는지 확인해보겠습니다.

select가 선택이라는 의미가 있으니까 검색 기능을 하는 웹 페이지는 select 문법을 사용할 것이다 라는 추측이 가능합니다. 

 

bee-box를 통해서 직접 실습해 보겠습니다.

 

보안 레벨은 low

 

검색 창에 DB에서 문자열을 구문하기 위해 사용하는 따옴표(')를 입력해보겠습니다.

에러가 난 것을 볼 수 있습니다.

 

에러의 내용을 보면 SQL 구문이 잘못되었다는 것을 알 수 있고, 사용하는 DataBase는 MySQL인 것으로 확인이 되었습니다. 이러한 에러가 나타났다면 SQL 구문을 삽입할 수 있다는 것을 의미합니다.

 

이번에는 정상적인 경우를 보겠습니다.

or를 입력했을 때

 

or를 입력했더니 title에 자세히 보면 or라는 단어가 검색이 된 것을 볼 수 있습니다. 그렇다면 SQL 구문은 select에 where 절을 추가해서 title에 보다 자세히 검색을 하는 것을 알 수 있습니다.

 

이제 공격을 진행해보겠습니다.

 

공격 방법

1. 컬럼 수 일치시키기

2. DB의 정보 알아내기

3. 공격하여 정보 탈취 및 각종 악의적인 행위

 

1. 컬럼 수 일치시키기

컬럼의 수를 일치 시켜야하는 이유는 사용할 union 구문이 컬럼의 수와 데이터 타입이 일치해야만 동작을 하기 때문입니다. 컬럼의 수 를 일치시켜보는 구문은 아래와 같습니다.

'union select all 1,2,3,....#

 

구문에서 각 구문의 역할은 무엇이냐면

먼저 '(따옴표)는 문자열을 구분하는 문자열로 이 문자열로 인해서 앞의 select 문장이 끝나게 됩니다.

다음에 나오는 union구문이 두 개의 select문을 합치는 역할을 하게 됩니다.

뒷 부분의 숫자 1, 2, 3, ...은 컬럼의 숫자를 일치시키기 위해서 하나씩 늘려가면서 테스트를 하는 것입니다.

마지막 #은 mysql에서 한 줄 주석을 처리하는 문자열입니다. 이 문자열로 인해서 뒤의 구문들은 주석처리되어 무시됩니다.

 

컬럼 수 확인하기

' union select all 1#

' union select all 1, 2#

' union select all 1, 2, 3#

.....

이런 식으로 하나씩 늘려가면서 테스트를 해보면 아래의 에러메세지를 보게 될 것입니다.

컬럼의 수가 일치하지 않는다는 구문이다.

 

컬럼의 수가 일치한다면 아래처럼 보일 것이다.

에러가 뜨지 않는다.

 

' union select all 1, 2, 3, 4, 5, 6, 7#을 하였더니 에러는 발생하지 않았습니다. 즉, 컬럼의 개수는 7개인 것으로 확인이 되었습니다. 또한 2, 3, 4, 5번 컬럼의 이름 대신에 다른 문장도 삽입이 가능합니다.

 

 

2. DB의 정보 알아내기

에러 구문을 통해서 사용하는 DB의 이름은 알아내었기 때문에 이번에는 MySQL의 버전을 알아보도록 하겠습니다.

 

삽입 구문 : ' union select all 1,2,3,4,@@versions,6,7#

mysql 5.0.96과 우분투에서 사용하는 것을 알 수 있음

 

삽입 결과 MySQL 5.0대 버전을 사용 중인 것으로 드러났습니다. 5.0버전부터 information_schema라는 메타데이터를 사용할 수 있습니다. 이 메타데이터에는 테이블 이름과 컬럼의 이름이 들어있습니다.

 

3. 공격하여 정보 탈취 및 각종 악의적인 행위

삽입 구문 : ' union select all 1,table_name,3,4,5,6,7 from information_schema.tables#

누가봐도 중요해보이는 users라는 테이블 이름이 검색되었습니다.

 

삽입 구문 : ' union select all 1,column_name,3,4,5,6,7 from information_schema.columns where table_name = users# 

users 테이블의 컬럼 이름을 조사하였더니 역시나 중요해보이는 column의 이름을 얻었습니다.

 

이제 테이블의 이름과 컬럼의 이름을 알았으니 이제 데이터를 조회할 수 있습니다.

삽입 구문 : ' union select all 1, id, login, password, email, 6, 7 from users#

아이디와 패스워드 이메일이 검색되었습니다.

 

 

 

여기까지 union based sql injection을 마치겠습니다.

오류가 있는 부분이 있거나 설명이 빈약하면 댓글로 지적해주시면 감사하겠습니다.

반응형

댓글