보안 전공생의 공부

DreamHack | 웹해킹 기초강의 요약(1) 본문

공부/web

DreamHack | 웹해킹 기초강의 요약(1)

수잉 2021. 1. 15. 11:03

출처 : 드림핵_Introduction of Webhacking

해킹 : 본래의 의도와는 다른 행위를 발생시키는 것. 그러기 위해서는 설계 또는 운영의 약점을 찾을 수 있어야한다.

이를 위해서는 설계자, 운영자보다 해당 시스템에 대한 더 높은 이해도를 가지고 있어야 한다.

< 웹이란 무엇인가 ? >

 = 월드 와이드 웹(World Wide Web, WWW, W3)

사전적 의미인 거미줄처럼, 인터넷상에서 각각의 사용자(컴퓨터)가 연결되어 서로 정보를 공유한다는 의미에서 유래되었다.

 : 인터넷상 서비스 중 HTTP를 이용해 정보를 공유하는 통신 서비스

- 서비스 제공하는 대상 : 웹 서버(Web Server)

- 서비스 받는 사용자 : 웹 클라이언트(Web Client)

웹브라우저라는 소프트웨어의 등장&발전 → 웹에 대한 대중적 접근성 증가

다양한 형태의 서비스 가능

⇒가장 많이 사용되는 인터넷 서비스가 됨

웹의 역사

ex) Microsoft 홈페이지의 서비스

과거 서비스 : 단순히 정보 제공, Internet Explorer 다운로드할 수 있도록 제공하는 기능

최근 서비스 : 사용자가 회원가입/로그인, 원하는 정보 검색, 제품 구매 등의 기능

 

 

< 웹 기초 지식 >

◇ 키워드 정리

- Web Browser(웹 브라우저) : 웹에 접속하기 위해 사용하는 소프트웨어

- Web Resource : 웹 상에 존재하는 모든 콘텐츠 (HTML, CSS, JS, PDF, PNG 등)

- URL : Uniform Resource Identifier의 약자, 리소스를 식별하기 위한 식별자

- HTTP : HyperText Transfer Protocol의 약자, 인터넷 서비스에서는 서비스 대상 간 통신규약(Protocol)을 지정해 통신한다. HTTP는 웹을 이용하기 윈한 통신 규약

- HTTPS : HyperText Transfer Protocol Secure의 약자, 기존 HTTP 데이터를 암호화해서 통신한다.

- Cookie : 웹 브라우저에 저장하는 데이터

- Session : 서버에 저장하는 데이터

- Domain Name : 인터넷(웹) 네트워크상에서 컴퓨터를 식별하는 이름

(ex : www.naver.com 은 네이버의 서버 컴퓨터를 식별하는 이름)

- Server : 인터넷상에서 사용자에게 서비스를 제공하는 컴퓨터

그 중 웹 서버는 사용자(웹브라우저), HTTP를 이용해 통신하는 서버이다.

- Application : 서버에서 설정한 특정 기능들을 수행하는 소프트웨어

- DataBase(DB) : 데이터를 저장하기 위해 사용하는 데이터 저장소

▶ Web Browser

문서 편집을 위해 워드 프로세서 소프트웨어를 사용하는 것처럼

웹을 사용하기 위해 웹 브라우저를 사용한다.

HTTP를 통해 인터넷 상에서 통신을 하며 서버로부터 전달받은 다양한 웹 리소스들을 가공해 사용자가 웹과 HTTP의 동작 원리를 알지 못해도 웹을 할 수 있도록 도와주는 소프트웨어이다.

대중적인 웹 브라우저 → Chrome, Edge, Safari, Firefox 등

※ 모든 취약점은 사용자의 입력 값에서부터 발생한다.

사용자의 입력 값은 웹 브라우저를 통해 전송되기 때문에 브라우저가 하는 행위를 필수적으로 이해하고 있어야 한다.

웹브라우저와 서버의 통신 (출처 : https://game116.synology.me/kbp_home/cg_edu/cnu/web_server_basic.htm)

▶ Web Resource

웹에서 사용하는 콘텐츠

ex) 웹 브라우저의 주소창에 http://dreamhack.io/index.html 주소 입력하면

dreahack.io에 존재하는 /index.html 리소스에 대해 요청을 수행하는 것

웹 리소스를 가리키는 주소 : URL(Uniform Resource Locator)

< 페이지를 구성하는 대표적인 웹 리소스들>

- HTML(Hyper Text Markup Language) : 웹 문서 뼈대를 구축하기 위한 마크업 언어. 정해진 태그, 속성을 지정해 문서 구성

- CSS(Cascading Style Sheets) : HTML이 표시되는 방법을 정의하는 스타일 시트 언어. 이미지,태그,글자 등 출력 스타일 설정

- JS(JavaScript) : Client Side Script를 이용해 페이지 내에서의 행위들 설정

▶URL

URI 는 Uniform Resource Identifier, 리소스를 식별하기 위한 식별자이다.

http://example.com/path?search=1#fragment (원하는 정보까지 도달)

URL 은 Uniform Resource Locator, 리소스의 위치를 식별하기 위한 URI의 하위 개념이다.

http://example.com/path (path의 위치를 표기)

웹에 접속할 때 웹 사이트의 주소(위치)를 이용해 접근하는 것이 이를 이용하는 것이다.

· URI의 구성요소 : Scheme, Authority(Userinfo, Host, Port), Path, Query, Fragment

 

출처 : 드림핵

http://example.com/path?search=1#fragment

」URL 」URI

 

- Scheme : 웹서버 접속시 어떤 체계(프로토콜) 이용할지에 대한 정보

- Host : Authority의 일부, 접속할 웹 서버의 호스트(서버주소)에 대한 정보,

웹 브라우저가 어디에 연결할지 정함

Domain Name 이나 Internet Protocol(IP) Address가 사용된다!

( IP Address는 네트워크상에서 통신이 이루어질 때 장치를 식별하기 위해 사용되는 주소. 불규칙한 숫자로 이루어져 있어 사람이 외우기 쉬운 의미를 부여하기 위해 Domain Name을 사용 )

Domain Name을 이용해 Host를 조회할 때 Domain Name과 IP Adress 정보를 매핑해 저장하는 DNS(Domain Name Server)에서 조회해 등록된 IP Address를 가져와 사용한다.

nslookup 명령어 : Domain Name의 정보 확인 가능

- Port : Authority의 일부, 접속할 웹 서버의 포트에 대한 정보

- Path : /문자로 구분, 접속할 웹 서버의 경로에 대한 정보

- Query : ?문자 뒤, 웹 서버에 전달하는 파라미터(추가적인 정보)

- Fragment : #문자 뒤, 메인 리소스 內 존재하는 서브 리소스에 접근할 때 이를 식별하기 위한 정보

▶ Encoding

문자, 기호 등의 정보, 형태를 표준화, 보안 등의 목적으로 다른 형태나 형식으로 변환하는 처리, 처리방식

알고리즘이 모두 공개되어 있고, 키와 같은 여소가 포함 X → 누구든 원래의 정보로 복원 가능

- Encryption : 양방향 암호 알고리즘, 일치한 알고리즘과 유효한 키를 가지고 있으면 원래의 정보로 복원 가능

- Decoding : 변환된 형태를 원래 형태로 변경하는 것

<웹에서 사용하는 대표적인 인코딩>

- URL Encoding (percent encoding)

URI 구조 內 예약어(구분어)로 사용되는 문자들 전송하고자 할 때 사용

예약어는 URI구조 내에서 문법적으로 중요한 의미 가짐

→ 문법적으로 사용하지 않을 경우 반드시 인코딩해 사용해야 함

방식 : 입력된 문자를 ASCII 표에서 매칭되는 Hex 값으로 바꾸고, 앞에 % 붙이면 됨

문자

URL 인코딩

?

%3F

#

%23

&

%26

=

%3D

NULL

%00

ex)

example.com 에 a=?b, c=&d 의 데이터를 보내기 위해서는

http://example.com/?a=%3Fb&c=%26d 의 형태로 전송해야 한다.

- HTML entity Encoding

HTML 문서 內 사용하는 문자열들이 HTML에서 사용하는 태그로 인식하지 않도록 하기 위해 사용

방식 : 입력된 문자를 ASCII표에서 매칭되는 Hex값으로 바꾸고, 앞에 &#x를 붙이거나, 주요한 문자들에 대해 지정된 Entity name을 사용

문자

Entity name encoding

Entity number encoding

&

&amp;

&#x26;

<

&lt;

&#x3C;

>

&gt;

&#x3E;

ex)

<body> Hello World ! </body>

로 된 문자열을 인코딩하면 (body태그도 문자열로 인식하게 할 것이다 !)

&lt;body&gt; Hello World ! &lt;/body&gt;

가 되는 것이다.

ASCII 표

▶ HTTP

HTTP 또는 HTTPS( 핵심 구조와 동작원리가 동일해 HTTP로 통칭) URI의 구성요소 中 Scheme(Protocol)에 해당

- Protocol : 컴퓨터 내부 혹은 컴퓨터 사이에서 어떻게 데이터를 교환할지 정의하는 규칙 체계

https://example.com URI는 HTTPS방식으로 example.com 서버와 통신한다는 것

· 웹에서 이뤄지는 통신을 정의한 프로토콜

- HTTP(HyperText Transfer Protocol) : 모든 데이터를 암호화 되지 않은 평문으로 전송

- HTTPS(HyperText Transfer Protocol Secure Socket Layers) : HTTP 문제점인 데이터의 평문 전송 보완하기 위해 만들어짐. 공개키 암호화를 사용해 클라이언트와 서버가 키를 교환해 비교적 안전함

( 출처 : http://blog.wishket.com)

TCP TLS(암호화된 TCP) 사용해 통신하고

기본 포트로 80(HTTP), 443(HTTPS) 포트를 사용

(포트 번호는 서버의 설정을 통해 변경가능하다. 무조건 80, 443으로 서비스되는 것 X → 웹서버 중 많이 사용되는 톰캣 서버의 기본 포트 번호 = 8080)

HTTP → Request / Response 로 나눠짐

( 출처 : https://developer.mozilla.org/ko/docs/Web/HTTP/Messages )

< HTTP Request >

서버에 대한 요청

사용자와 서버가 통신하기 위해서는 서로 이해할 수 있는 데이터 구조를 전달해야 한다.

첫번째 줄 : Method, Path, version 으로 구성

- Method : 사용자가 서버에 요청 시 수행하고자 하는 동작

ex) OPTIONS, GET, POST, PUT 등등

- Path : 웹 리소스의 경로

- Version : 사용하는 HTTP의 버전

Method : POST, Path : 별다른 경로가 없는 웹사이트 메인 접속하는 경우에 루트를 의미하는 / 경로가 반드시 포함된다 !

(관련 글

https://djkeh.github.io/articles/Why-do-we-put-slash-at-the-end-of-URL-kor/ )

 

URL 끝에 ‘/’ 는 왜 붙이는 걸까?

트레일링 슬래시(trailing slash) 기초 복습 및 관련 내용

djkeh.github.io

, Version : HTTP/1.1 임을 확인할 수 있다.

두 번째 줄 ~ : Header 부분

이름 : 값 형태로 이뤄진다.

Header의 끝부분은 CRLF로 줄바꿈을 한다.

(Carrage Return(CR) Line Feed(LF) : 커서를 현재 행의 맨 좌측과 수직 아래로 이동시키는 문자열 즉, 줄 바꿈을 의미한다. hex 코드로는 0x0d, 0x0a 이며, 아스키 코드에서 표현 방식은 "\r\n" 이다.)

마지막 : Body로 구성 (사용자의 데이터를 담는 부분)

< HTTP Response >

사용자의 요청에 대한 서버의 응답

첫번째 줄 : Version, Status Code로 구성

- Version : HTTP의 버전

- Status Code : 사용자의 요청에 대한 서버의 상태 응답 코드

200번 영역 : 사용자의 요청에 대한 서버의 처리 성공

200 OK, 201 CREATED

300번 영역 : 사용자가 요청한 리소스가 다른 경로로 변경된 경우

301 Moved Permanently, 302 Found

400번 영역 : 요청하는 구조나 데이터가 잘못되었음

403 Forbidden, 404 Not Found

500번 영역 : 서버의 에러와 관련된 영역

500 Internal Server Error, 503 Service Unavailable

Version : HTTP/1.1

Status Code : 403 Forbidden 이다.

두번째 줄 ~ : Header 부분

이름 : 값 형태로 이뤄짐

끝부분에 CRLF 한 번 더 출력

마지막 : Body로 구성 (서버의 응답 데이터 부분)

※ 웹 해킹에서는 사용자의 입력에 의한 서버의 응답을 주목해야 한다 !

만약 악의적인 입력을 보냈을 때 500 Status code(Internal Server Error) 응답 → 해당 입력이 서버에 어떤 영향 끼쳤다고 짐작 가능, 취약점 도출

▶ Cookie

HTTP는 Request, Response의 쌍이 독립적으로 구성되어 통신하는 connectionless, stateless 프로토콜이다.

- connectionless 속성 : 하나의 요청에 대한 하나의 응답 , 네트워크 연결을 끝맺는 것

불특정 다수의 사용자에게 서비스되어야 하는 웹의 특성상 계속 연결상태를 유지하는 것은 서버 부하로 이어질 수 있어 갖게 된 속성

(최근에는 네트워크, 서버 등의 성능 향상으로 HTTP/1.1부터 Keep-Alive를 통해 일정 시간 동안 사용자와 서버가 계속 연결을 맺고 있는 방식을 사용 )

요청에 대한 응답이 끝난 후, 사용자 드림이와 서버의 연결이 끊겼음을 확인할 수 있다

- stateless 속성 : 네트워크 연결이 끝맺을 때 상태를 유지하지 않는

HTTP 요청마다 새로운 커넥션을 열기 때문에 사용자 인증을 계속해서 해야한다. 이러한 단점을 개선하기 위해 상태를 유지하기 위한 Cookie가 생겨났다.

웹브라우저는 HTTP Response의 Set-Cookie Header 또는 Javascript 의 document.cookie를 통해 데이터를 쿠키에 저장한다.

( 출처 : https://velog.io/@namezin/Cookie )

데이터를 key=value; 쌍으로 쿠키에 저장하고 ; 뒤에 쿠키의 만료시간, 접근할 수 있는 도메인 등 추가 옵션을 설정할 수 있다.

추후 HTTP 요청을 보내 때 웹 브라우저가 자동으로 헤더에 쿠키를 추가해 전송한다.

쿠키는 인증 상태를 포함할 수 있고, 사용자의 브라우저에 저장된다.

인증 상태의 쿠키를 저장하면 이렇게 악용 가능하다.

▶ Session

서버에 데이터를 저장하기 위해 사용

세션을 활용해 인증상태를 포함한 데이터를 서버에 저장하고 해당 데이터에 접근할 수 있는 유추불가능한 랜덤함 문자열 키(Session ID) 를 만들어 응답한다.

브라우저는 해당 키를 쿠키에 저장하고 이후 HTTP 요청을 보내면 서버에서 키에 해당하는 데이터를 가져와 인증상태를 확인한다.

※ 쿠키 vs 세션 : 쿠키는 데이터 자체를 사용자가 저장, 세션은 서버가 저장

'공부 > web' 카테고리의 다른 글

[Wargame.kr] strcmp  (0) 2021.02.18
[Wargame.kr] WTF_CODE  (0) 2021.02.16
Comments