다음 시간의 웹 해킹 첫 실습을 위해 필요한, 웹에 대해 더 구체적인 배경지식 전반을 다룹니다.
URI는 Uniform Resource Identifier의 약자로 리소스를 식별하기 위한 식별자입니다. 우리에게 좀 더 친숙한 용어인 URL은 Uniform Resource Locator의 약자로 리소스의 위치를 식별하기 위한 URI의 하위 개념입니다.
웹에 접속할 때 웹 사이트의 주소(위치)를 이용해 접근하는 것은 URL이자 URI를 사용한 것입니다. 최근 들어 URI와 URL을 혼용해서 사용하는 추세이기 때문에 드림핵에서는 상위 개념인 URI로 통합하여 설명합니다.
URI는 Scheme, Authority (Userinfo, Host, Port), Path, Query, Fragment의 구성 요소를 가집니다. 각 요소에 대한 상세한 설명은 해당 요소를 이용한 공격 기법을 다룰 때 설명하고, 지금은 웹에 접속할 때 사용되는 가장 기본적인 요소만 다루겠습니다.
아래는 자주 쓰이는 웹 URI 구성 요소를 설명합니다.
Scheme: 웹 서버에 접속할 때 어떤 체계(프로토콜)를 이용할지에 대한 정보를 담고 있습니다.
Host: Authority의 일부로써 접속할 웹 서버의 호스트(서버 주소)에 대한 정보를 가지고 있습니다.
Port: Authority의 일부로써 접속할 웹 서버의 포트에 대한 정보를 가지고 있습니다.
Path: 접속할 웹 서버의 경로에 대한 정보를 가지고 있으며 / 문자로 구분됩니다.
Query: 웹 서버에 전달하는 파라미터 (추가적인 정보)이며 URI에서 ? 문자 뒤에 붙습니다.
Fragment: 메인 리소스 내에 존재하는 서브 리소스에 접근할 때 이를 식별하기 위한 정보를 담고 있으며 URI에서 # 문자 뒤에 붙습니다.
추가적인 URI의 정보는 공식 스펙(RFC)인 RFC 3986에서 확인할 수 있습니다.
Encoding(인코딩) 은 문자 또는 기호 등의 정보, 형태를 표준화, 보안 등의 목적으로 다른 형태나 형식으로 변환하는 처리 혹은 그 처리 방식을 말합니다. 이렇게 변환된 형태를 원래 형태로 변경하는 것을 Decoding(디코딩)이라고 합니다.
Encoding (인코딩) : 알고리즘이 모두 공개되어 있고 키와 같은 요소가 포함되어 있지 않아서 모두가 원래의 정보로 복원이 가능합니다.
Encryption (인크립션) : 양방향 암호 알고리즘입니다. 일치한 알고리즘과 유효한 키를 가지고 있다면 원래의 정보로 복원이 가능합니다.
웹에서 사용하는 대표적인 인코딩은 URL과 HTML Entity가 있습니다.
URI 구조 내에서 예약어(구분자)로 사용되는 문자들을 전송하고자 할 때 사용합니다. 예약어는 URI 구조 내에서 문법적으로 중요한 의미를 가지고 있기 때문에 문법적으로 사용하지 않을 경우에는 반드시 인코딩해 사용해야 합니다.
GET 메소드로 a=?b,c=&d의 데이터를 보내기 위해서는 http://example.com/?a=%3Fb&c=%26d의 형태로 전송되어야 서버에서도 정상적으로 데이터를 해석하여 처리할 수 있습니다.
인코딩 방식은 입력된 문자를 Ascii테이블에서 매칭되는 Hex 값 앞에 % 문자를 붙이면 됩니다.
HTML 문서 내에서 사용하는 문자열들이 HTML에서 사용하는 태그로 인식하지 않도록 하기 위해 사용합니다.
인코딩 방식은 입력된 문자를 Ascii테이블에서 매칭되는 Hex 값 앞에 &#x를 붙이거나, 주요한 문자들에 대해서 지정되어 있는 Entity name을 사용하여 인코딩할 수 있습니다.
| 문자 | Entity name encoding | Entity number encoding |
|---|---|---|
| & | & | & |
| < | < | < |
| > | > | > |
URI 구성 요소 중 Host는 웹 브라우저가 어디에 연결할지 정하게 됩니다. Domain Name이나 Internet Protocol(IP) Address가 Host에 사용됩니다.
e.g. http://example.com/path1?search=1#fragment => Host: example.com
IP Adress는 네트워크상에서 통신이 이루어질 때 장치를 식별하기 위해 사용되는 주소입니다. 불규칙한 숫자로 이루어진 IP Address를 사람이 외우기 쉽고, 의미를 부여하기 위해 Domain Name을 사용합니다.
Domain Name을 이용해 Host를 조회할 때는 Domain Name과 IP Adress 정보를 매핑해 저장하는 Domain Name Server(DNS) 에서 조회해 등록된 IP Address를 가져와 사용합니다. 웹 브라우저에서 http://example.com/ 주소로 접속할 경우 DNS에서 example.com(Domain Name)의 IP와 통신합니다.
nslookup 명령어를 사용해 Domain Name의 정보를 확인할 수 있습니다.
$ nslookup example.com
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: example.com
Address: 93.184.216.34