brunch

You can make anything
by writing

C.S.Lewis

by Younggi Seo Jul 30. 2018

해커에게 필요한 웹 구조 해부하기 1

HTTP: 인터넷의 멀티미디어 배달부

이전 섹션에서 PHP 언어를 통해 HTML 파싱(구문 해석)을 하려는 것을 예고했지만, 줄기나 가지를 쳐내는 부분보다 일단 뿌리에 해당하는 웹 구조에 대해서 다루고 난 다음, 기교를 부려볼 작정이다.


누가 보면 도움이 될까? HTTP 1.x 프로토콜 기반의 웹 동작 방식을 알고 해킹을 시도하려는 블랙햇 해커. 반대로 웹의 취약점을 파악하고 해당 취약점의 노출을 막고 미연에 해킹 사고를 방지하고자 하는 화이트햇 해커, 혹은 정반대의 이 두 의도를 모두 알고 웹 구조의 이해를 잡으려는 그레이 햇 해커 대상.

어떻게 활용할 것인가? HTTP / HTTPS 프로토콜로 송수신되는 네트워크 메시지의 데이터 페이로드를 분석해서 악성코드 삽입 여부의 정탐(True Positive)이 목적.

무엇을 다루나? 7 계층 애플리케이션 계층에서 오고 가는 메시지의 헤더와 데이터 페이로드 부분의 분석(HTML Parsing)을 하기 위한 HTML 마크업 언어로 작성된 일반적인 웹사이트의 구조와 동작 원리



근무지가 안동 경북도청이라서 근처에 관광지인 도산서원을 다녀올 기회가 있었다. 도산서원을 들어서기 전에 주변의 풍경을 감상하고 퇴계 이황이 제자들을 가르쳤던 이 도산서원에 다다랐다. 서원에서는 역대 최고의 기온을 경신하는 여름의 날씨에도 불구하고 견학을 나온 학생들이 가이드 선생님의 말씀에 따라 천자문을 읊고 있었다. 도산서원의 전경을 보노라면, 각기 다른 용도의 서원의 건물로 이어진 구조와 HTTP 프로토콜을 통해 전달되는 네트워크 상의 구조를 서로 유비 추론해서 개념의 정립이 가능할 거라는 영감이 떠올랐다.






그리고 아래는 무선 네트워크에서 많이 쓰이는 WAP(Wireless Application Protocol) 프로토콜들이 인터넷의 각 계층별 프로토콜들과 대응을 그린 표이다. 인터넷 애플리케이션 계층의 대표적 프로토콜이 HTML과 HTTP 프로토콜이 보이며, SSL 암호화 프로토콜이 있는데 이건 HTTP 프로토콜로 보내어질 때, HTTPS로 바뀌어 암호화된 메시지로 전달된다.




위의 기반 지식은 HTTP 웹 구조를 파악하기 전에 본인의 워크스테이션(호스트 서버) 바깥에서 통신이 어떻게 이루어지는지에 대한 배경을 알기 위해 제시했다. 이제 HTML(Hyper '마크업' 언어) 웹페이지의 상호(서버와 클라이언트) 통신을 위한 규약인 HTTP에 대해 파헤쳐 해커들이 가장 쉽게 해킹을 시도하는 경로들 중 하나인 XSS(Cross Site 게시판 서버단 공격) 및 CSRF(강제성 Cross Site 게시판 Client 단 공격)류의 Injection(악성코드 삽입) 공격을 방어하기 위한 제반 지식을 알아보자. 물론 이 과정에서 필요한 웹쉘(Webshell: 해커들이 사이트의 게시판에 미리 업로드시켜 놓은 악성코드 쉘 스크립트) 공격이 이러한 침투 공격류에 대부분 활용된다는 것을 안다면 개발자들이 웹사이트를 작성할 때, '보안을 위한 코딩'을 마냥 무시하는 업계 관행을 줄이는데 일조하리라.



그리고 이러한 웹 기반의 취약점 분석을 위한 툴은 이미 시중에 널려있다. 대표적으로 Acunetix로 아래 링크된 페이지를 통해 실제로 구매할 시 비용을 확인할 수 있다(https://www.acunetix.com/ordering/). 프리웨어는 보안업계에 종사하는 개인의 프로파일 식별이 이루어진다면 20일 간 무료로 다양한 용도의 스캔이 가능하다. 기업용으로 거의 7백만 원 이상이 들기 때문에 전문적으로 사이트의 취약점 방지를 예방하기 위한 업체가 아닌 이상 구입할 필요는 없을 듯하다. 왜냐하면 타사의 저렴한 제품으로도 웹 취약점 분석이나 아니면 지금의 나처럼 개인연구 목적으로는 웹사이트 분석을 구글 크롬을 통해서든 파이썬이든 PHP이든 CSS(Cleint Side Script) 언어로 직접 해볼 수도 있기 때문이다.



HTTP 프로토콜은 메시지를 전달하기 위한 규칙을 약속한 하나의 프로토콜로 크게 헤더 부분과 데이터(페이로드) 부분으로 나뉘어 있다. 헤더 부분에서 해커들이 눈여겨보는 정보가 다섯 가지가 있다. 아래는 웹서버가 설정해서 클라이언트 브라우저에 보낼 때 주목해야 할 헤더 정보이다.


1) Set-Cookie: 이 값은 사용자의 세션이 유지되도록 보장하기 위하여 가장 흔하게 클라이언트에 제공하는 세션 식별자(쿠키)이다. 해커가 사용자의 세션을 훔칠 수 있다면 공격자는 그 애플리케이션 내에서 해당 피해자인 척 가장할 수 있다.


2) Content-Length: 이 값은 응답문의 바이트 단위 길이다. 이 값은 해커가 응용프로그램의 응답을 해독할 때 바이트 단위의 데이터를 예상할 수 있으므로 도움이 된다. 특별히 (반복적으로 추측하는) 무작위 대입법에 활용할 만한다.


3) Location: 이 값은 응용프로그램이 사용자를 다른 페이지로 보낼 때 사용된다. 이 정보는 해커에게 도움이 되는데, 예를 들어 애플리케이션에서 성공적으로 인증한 후에만 접근 가능한 페이지를 가리키도록 이용할 수 있기 때문이다.


다음은 클라이언트 브라우저가 웹 서버에 보내는 주요 헤더 정보이다.


4) Cookie: 하나(또는 여러 개)의 쿠키는 사용자의 세션을 유지하기 위해 헤더에 담겨 서버로 되돌려 보내진다. 이 쿠키의 헤더 값은 set-cookie로 발행한 헤더 값과 언제나 일치해야 한다. 이 값은 응용프로그램의 유효한 세션 값을 제공하므로 다른 응용프로그램 사용자를 공격할 때 사용할 수 있다. 다른 쿠키들 중엔 그리 흥미로운 것이 없는데, 예를 들어 원하는 언어를 영어로 설정하는 그런 따위이다(정말 번역을 이따위로 하나- 필자 주).


5) Referrer: 이 헤더 값은 다른 웹 페이지를 요청할 때 이전에 열었던 페이지를 목록으로 만든다. 이 헤더 값은 곧 "마지막으로 방문한 페이지"를 뜻하며, 이 값은 쉽게 바꿀 수 있기 때문에 의존한다면, 값을 변조하여 쉽사리 우회할 수 있다.


이상으로 여기까지 HTTP의 개관이라면 필자 나름의 개관을 시도하였다. 물론, "HTTP 완벽 가이드"라는 책을 펼쳐보시면 알겠지만 알아야 할 제반 개념은 더욱 많다. 하지만 서두에 언급하였듯이 당신이 만약 '쇼미 더 머니'에 나오는 일개 아마추어 래퍼처럼 일 라운드에서 지금껏 듣지도 보지도 못한 랩으로 기성 래퍼의 영혼을 일탈시킬 정도의 핵(hack) 펀치를 날릴 포부의 해커가 되는 게 목적이라면 곁가지에 해당하는 개념의 내용들은 파이널 스테이지에서 참조해도 될 것이다. 그리고 다음 편에서 HTML이라는 현재까지 가장 많이 쓰이는 개발자 마크업 언어로 작성된 웹 사이트에 필요한 개념 환기를 하겠다.




참조

1) Gourley, D., & Totty, B. (2002). HTTP: The definitive guide. Beijing: OReilly. 한국어판 HTTP 완벽 가이드

2) 웹 해킹 가이드북 (2015).











매거진의 이전글 동명이인 찾기 알고리즘
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari