단축 URL의 위험성
단축URL 단축을 사용할 경우 어떤 위험이 발생하는 지 알아보고 해당 위험을 어떻게 예방하는지 알아보자.
단축 URL 이란
단축 URL이라고도 하며 URL 단축으로도 불린다. 위키백과를 참고하였을 경우 URL 단축(URL shortening)이 맞는 표기인 것으로 보인다.
URL 단축이란 말 그대로 길이가 긴 URL을 짧게 단축 시켜주는 기능이다. URL 단축 서비스는 URL 단축 서버의 주소 뒤에 6~7 자리 정도의 쿼리 (일종의 식별자로 보인다.)를 통해 서버에서 쿼리를 통해 식별 후 해당 사이트로 리다이렉트 해주는 서비스이다. 현재 서비스 중인 URL 단축 서비스로는 네이버(), 호야(https://hoy.kr/), bitly(https://bitly.kr/) 등등이 있다.
구글의 경우 가장 많이 보이던 단축 URL 이였지만 현재 서비스가 종료된 상태이다.(기존에 사용하던 사용자들은 해당 기간동안은 사용할 수 있는 것 같다.) 직접 생성해서 사용해보진 않았다.
위험성
URL 단축 기술의 가장 큰 위험성은 스팸, 피싱, 사기, 악성사이트 방문 유도 등이다. 이 부분은 따로 설명하지 않겠다.
나는 URL 단축 서비스를 이용 시 기업 및 일반 사용자가 간과할 수 있는 부분을 한번 짚어보려고 한다. 실제 크게 작용되지 않을 수 있지만, 잘못 사용할 경우 악의적인 해커들에게 큰 위험이 노출될 수 있기 때문에, 만약 내가 해커라면 URL 단축 서비스를 어떻게 이용할 것인지 설명 하겠다. (솔직히 거창한 기술이 아니다… 누구나 생각할 수 있는거지만 그냥 이렇게 한번 정리해보려고 함..) URL 단축 서비스를 이용하는 사람은 크게 두 분류로 볼 수 있다.
- 일반 사용자 일반 사용자의 경우 대부분 자신이 가지고 있는 링크를 전달하기 위해서 사용할 것이다. 이 경우에는 GET방식을 통해 파라미터를 전송하는 URL의 경우에 위험할 수 있다. 해당 파라미터에 민감한 정보가 있을 수 있고, 세션 정보 등이 포함되어 있을 수 있기 때문에 취약할 수 있다.
- 기업의 직원 및 개발자 기업의 직원 또는 개발자의 경우 업무 상 URL을 공유할 경우 가장 많이 사용될 것으로 보인다. 이때 기업의 중요정보 및 자산들이 외부에 노출될 위험이 존재한다. 나는 모의해킹 컨설팅을 하면서 이러한 경우를 종종 경험하였기 때문에 이 글을 포스팅을 하기로 하였다. 주로 개발 쪽에서 단축 URL을 주로 쓰는 이유는 QA 및 개발계의 어플리케이션(거의 안드로이드나 iOS일 것이다) 설치 파일을 공유하기 위해서 사용할 것이다. QA 나 개발계의 모바일 어플리케이션(안드로이드, iOS)의 경우 보안 솔루션이 적용되어 있지 않다. 그리고 보안에 취약한 경우가 대부분이다. 이는 해커의 좋은 먹잇감이기 때문에 절대 노출되지 않도록 단축 URL을 이용하지 않거나, 별도 로그인을 통해 다운로드 받을 수 있도록 해야한다.(경험한 일부 기업은 로그인을 통해 다운받을 수 있도록 운영하고 있었다.)
단축 URL 생성
단축 URL의 서비스 중 하나인 bitly 서비스를 이용하여 직접 단축 URL을 만들어본다. 위와 같이 손쉽게 단축 URL을 생성할 수 있다.
공격?
생성된 URL을 살펴보면 쿼리의 값이 3개의 숫자,알파벳 대소문자로 이뤄져있다. 해커 관점에서 본다면 해당 부분은 충분히 무차별대입 공격을 통해 유추가 가능하다.
해커는 쿼리의 값에 무차별 대입 공격을 통해 랜덤한 URL에 접근이 가능하다. 이때 단축 URL로 생성된 사이트 및 웹페이지가 민감한 정보를 담고 있다면 충분히 노출될 가능성이 크다. 파이썬을 통해 랜덤한 단축 URL을 생성한다. 소스코드는 아래와 같이 작성하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import random, requests
def URL_Create(len):
#result = "http://bitly.kr/" #bitly.kr -> 3~ 4자리
result = "http://goo.gl/" #goo.gl -> 6자리
number_list = "1234567890"
small_str_list = "abcdefghijklmnopqrstuvwxyz"
big_str_list = small_str_list.upper()
all_str = number_list + small_str_list + big_str_list
query = ""
count = 3
if len > 3 :
count = len
i = random.sample(all_str, count)
for j in i:
query += j
return result+query
def request_301(URL):
response = requests.get(URL, allow_redirects=False)
r_code = response.status_code
r_header = response.headers
if r_code == 301:
return r_header['Location']
else :
return "404"
if __name__ == "__main__":
for i in range(0, 200):
short_url = URL_Create(6)
test = request_301(short_url)
if test not in "404": print("[+] " + short_url + " ==> " + test)
결과
아래와 같이 랜덤으로 생성한 URL의 요청을 전송하여 단축 URL이 존재하는 URL만 출력하였다.
발견된 단축 URL 중 임의의 URL로 접근해 보았다. 아래와 같이 개인정보가 노출되는 페이지를 발견할 수 있었다. 외국사이트며 크리티컬한 정보는 아니지만 이처럼 개인의 정보가 노출될 수 도 있다.