일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 웹해킹
- 웹개발
- 포렌식
- 워게임
- node.js
- Express
- 이진트리
- wargame.kr
- 뷰
- MongoDB
- bootstrap
- gitbash
- NavBar
- 웹해킹기초
- 워게임추천
- 이진탐색트리
- 그래프
- 포렌식워게임
- 자바기초
- materialize
- nodeJS
- 자료구조
- node
- CTF
- mongoose
- GIT
- 자바문제풀이
- 자바
- 써니나타스
- 웹기초
- Today
- Total
보안 전공생의 공부
DreamHack | 웹해킹 기초강의 요약(1) 본문
출처 : 드림핵_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
&
&
&
<
<
<
>
>
>
ex)
<body> Hello World ! </body>
로 된 문자열을 인코딩하면 (body태그도 문자열로 인식하게 할 것이다 !)
<body> Hello World ! </body>
가 되는 것이다.
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 |