출처: dreamhack 01.Introduction of Webhacking
https://dreamhack.io/lecture/courses/6
- Web Browser (웹 브라우저)
웹에 접속하기 위해 사용하는 소프트웨어입니다.
- Web Resource
웹 상에 존재하는 모든 콘텐츠입니다. (HTML, CSS, JS, PDF, PNG 등)
- URI (URL)
URI는 Uniform Resource Identifier의 약자로 리소스를 식별하기 위한 식별자입니다.
- HTTP (HyperText Transfer Protocol)
인터넷 서비스에서는 서비스 대상 간 통신 규약(Protocol)을 지정하여 통신합니다.
HTTP는 웹을 이용하기 위한 통신 규약입니다.
- HTTPS (HyperText Transfer Protocol Secure)
기존 HTTP 데이터를 암호화하여 통신합니다.
- Cookie
웹 브라우저에 저장하는 데이터입니다.
- Session
서버에 저장하는 데이터입니다.
- Domain Name
인터넷(웹) 네트워크상에서 컴퓨터를 식별하는 이름입니다. (e.g. www.naver.com은 네이버의 서버 컴퓨터를 식별하는 이름입니다.)
- Server
서버는 인터넷상에서 사용자에게 서비스를 제공하는 컴퓨터입니다.
그 중 웹 서버는 사용자(웹브라우저)와 HTTP를 이용하여 통신하는 서버입니다.
- Application
서버에서 설정한 특정 기능들을 수행하는 소프트웨어입니다.
- DataBase (DB)
데이터를 저장하기 위해 사용하는 데이터 저장소입니다.
모든 취약점은 사용자의 입력 값에서부터 발생합니다. 사용자의 입력 값은 웹 브라우저를 통해 전송되기 때문에 웹 해킹을 공부하기 위해서는 브라우저가 하는 행위를 필수적으로 이해하고 있어야 합니다.
-브라우저별 특징
제조사 | 구글 | 마이크로소프트 | 애플 | 모질라 재단 |
Javascript 엔진 | V8 | ChakraCore | JavascriptCore | Spider Monkey |
HTML/CSS 엔진 | Blink | EdgeHTML | Webkit | Gecko |
사생활 보호/보장 (EDNS) | X | X | X | O |
패스워드 동기화 | O | O | O | O |
웹 리소스는 웹에서 사용하는 콘텐츠. http://dreamhack.io/index.html 주소를 입력하게 되면 dreamhack.io에 존재하는 /index.html 리소스에 대해 요청을 수행하는 것을 의미합니다.
URI는 Uniform Resource Identifier의 약자로 리소스를 식별하기 위한 식별자입니다. 웹에 접속할 때 웹 사이트의 주소(위치)를 이용해 접근하는 것은 URL이자 URI를 사용한 것입니다.
- Scheme
- 웹 서버에 접속할 때 어떤 체계(프로토콜)를 이용할지에 대한 정보를 담고 있습니다.
- Host
- Authority의 일부로써 접속할 웹 서버의 호스트(서버 주소)에 대한 정보를 가지고 있습니다.
- Port
- Authority의 일부로써 접속할 웹 서버의 포트에 대한 정보를 가지고 있습니다.
- Path
- 접속할 웹 서버의 경로에 대한 정보를 가지고 있으며 / 문자로 구분됩니다.
- Query
- 웹 서버에 전달하는 파라미터 (추가적인 정보)이며 URI에서 ? 문자 뒤에 붙습니다.
- Fragment
- 메인 리소스 내에 존재하는 서브 리소스에 접근할 때 이를 식별하기 위한 정보를 담고 있으며 URI에서 # 문자 뒤에 붙습니다.
http://example.com/path?search=1#fragment
Scheme
http://
웹 브라우저가 어떤 통신 규약 (프로토콜)을 사용할지 지정합니다. 보통 http/https를 사용합니다. 이 외에도 mailto, tel을 통해 메일 클라이언트나 연락처 프로그램을 열기도 합니다.
Host
example.com
웹 브라우저가 어디에 연결할지 정하는 호스트 주소입니다. 도메인이나 IP Address가 호스트로써 사용될 수 있습니다.
Path
/path
웹 브라우저가 연결하려고 하는 리소스에 대한 경로입니다.
Query
?search=1
웹 브라우저가 서버에게 전달하는 파라미터 입니다.
Fragment
#fragment
웹 브라우저만 가지고 있는 데이터입니다. 메인 리소스 (페이지) 내에서 서브 리소스를 식별할 때 사용합니다.
인코딩 : 암호화 <--> 디코딩 : 복호화
Encryption (인크립션) : 양방향 암호 알고리즘입니다. 일치한 알고리즘과 유효한 키를 가지고 있다면 원래의 정보로 복원이 가능합니다.
웹에서 사용하는 대표적인 인코딩은 URL과 HTML Entity가 있습니다.
- URL Encoding(percent encoding)
URI 구조내에서 예약어(구분자)로 사용되는 문자들을 전송하고자 할 때 사용합니다.
인코딩 방식은 입력된 문자를 Ascii아스키테이블에서 매칭되는 Hex 값 앞에 % 문자를 붙이면 됩니다.
? | %3F |
# | %23 |
& | %26 |
= | %3D |
- HTML entity Encoding
HTML 문서 내에서 사용하는 문자열들이 HTML에서 사용하는 태그로 인식하지 않도록 하기 위해 사용합니다.
인코딩 방식은 입력된 문자를 Ascii테이블에서 매칭되는 Hex 값 앞에 &#x를 붙이거나, 주요한 문자들에 대해서 지정되어 있는 Entity name을 사용하여 인코딩할 수 있습니다.
& | & | & |
< | < | < |
> | > | > |
HTTP 또는 HTTPS는 URI의 구성 요소 중 Scheme (Protocol)에 해당.기본 포트로 80(HTTP), 443(HTTPS) 포트를 사용
<Request 구조 >
Method Path Version
ex) GET /index.html HTTP/1.1
Header: 사용자와 서버가 상호작용하기 위한 정보를 담는 부분
Body: 사용자가 입력한 데이터가 서버에 전달 시 데이터를 담는 부분
<METHOD>
- OPTIONS
- 요청하는 리소스가 허용하는 메소드 목록을 반환합니다.
- 예를 들어 /login페이지가 OPTIONS, GET, POST 메소드만 허용하는 경우 OPTIONS, GET, POST가 반환됩니다.
- HEAD
- GET 메소드와 동일하지만, Response의 Body 부분은 받지 않고, Header만 받습니다.
- 서버 쪽 데이터를 검색하고 요청하는데 사용(책)
- (e.g. 서버의 상태 확인 등)
- GET
- 리소스를 요청합니다.
- (e.g. 게시물/프로필 보기, 이미지 등)
- POST
- 특정 리소스 생성 및 데이터 추가를 위해 값을 제출할 때 사용합니다.
- (e.g. 게시물/프로필 생성 등)
- GET보다 보안 좋음(URL을 통한 노출 없음)
- PUT
- 특정 리소스의 내용을 보낸 값으로 설정합니다.
- 데이터를 지정된 URI장소에 지정된 이름으로 저장(책)
- (e.g. 생성/업데이트 등)
- PATCH
- 특정 리소스의 내용 중 보낸 값의 key만 변경합니다.
- (e.g. 게시글 업데이트 등)
- DELETE
- 특정 리소스를 삭제합니다.
- (e.g. 게시물 삭제 등)
- TRACE
- 요청받은 값을 Response의 Body로 다시 클라이언트에게 되돌려줍니다.
- 요구 메세지의 최종 수신처까지 루프백 검사용으로 사용된다. 즉 클라이언트가 보내는 요구 메세지가 거쳐 가는 프록시나 게이트웨이의 중간 경로와 최종 수신 서버에 이르는 경로를 알아내는 데 사용된다.(책)
<HEADER>
- Host
- 데이터를 보내는 서버의 주소를 의미합니다.
- Cookie
- 사용자를 식별하기 위해 사용하는 정보입니다.
- User-Agent
- 사용자가 사용하는 프로그램의 정보를 나타냅니다.
- Referer
- 페이지 이동 시 이전 URI의 정보를 나타냅니다.
- Content-Type
- 사용자가 전달하는 데이터의 처리 방식과 형식을 나타냅니다. 사용자와 서버 간의 데이터 처리 방식이 일치되어야 정상적으로 데이터 통신이 이루어집니다.
developer.mozilla.org/ko/docs/Web/HTTP/Headers
예시2
POST /index.html HTTP/1.1
Host: dreamhack.io
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
Content-Length: 19
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 // 사용자가 전달하는 데이터의 처리 방식과 형식
foo=bar&hello=world //body
HTTP Response는 사용자의 요청에 대한 서버의 응답을 의미합니다.
HTTP Response의 구조 중 가장 첫번째 줄에는 Version과 사용자의 요청에 대한 서버의 상태 응답 코드인 Status code로 구성됩니다.
두 번째 줄부터는 Header 부분입니다. Header 부분의 각 줄은 이름: 값의 형태로 이루어집니다. Header의 끝을 표시하기 위해 CRLF를 한 번 더 출력한 후,
서버의 응답 데이터 부분인 Body로 구성됩니다.
웹 해킹에서는 사용자의 입력에 의한 서버의 응답을 주목해야 합니다. 예를 들어 악의적인 입력을 보냈을 때 500 Status code(Internal Server Error)를 응답하면 해당 입력이 서버에 어떠한 영향을 끼쳤다고 짐작할 수 있고 취약점으로 도출해낼 수도 있습니다.
<Response 구성요소>
- Version -HTTP의 버전을 나타냅니다.
- Status code -사용자의 요청에 대한 서버의 처리 결과를 나타냅니다.
- Header
- e.g. 사용자(웹 브라우저)에서 서버의 응답 데이터를 처리하는 방식 및 형식에 대한 정보, 서버에서 사용자를 식별하기 위한 쿠키 발급 정보 등
- 사용자와 상호작용하기 위한 데이터를 담는 부분으로 사용됩니다.
- Body- 서버가 사용자에게 응답하는 데이터를 담는 부분입니다.
<Status code> 중 주로 사용되는 code들
다른 code들에 대한 내용은 mozilla docsdeveloper.mozilla.org/ko/docs/Web/HTTP/Status 에서 확인할 수 있습니다.
- 200번 영역
- 200 OK
- 201 Created
- 사용자의 요청에 대한 서버의 처리가 성공하였음을 나타냅니다.
- 300번 영역
- 301 Moved Permanently
- 302 Found
- 사용자가 요청한 리소스가 다른 경로로 변경된 경우를 나타내는 영역입니다. 웹 브라우저에서 300번 영역의 응답 상태 코드가 반환되면, Response Header에 포함되어 있는 Location 헤더의 값으로 리다이렉션 합니다.
- 400번 영역
- 400 Bad Request
- 사용자가 전달한 데이터 또는 구조의 잘못된 문법으로 인하여 서버가 요청을 이해할 수 없음을 의미합니다.
- 403 Forbidden
- 사용자가 해당 웹 리소스에 접근할 권리를 가지고 있지 않음을 나타냅니다.
- 404 Not Found
- 사용자가 요청한 웹 리소스의 경로에 대해 응답할 데이터가 없음을 나타냅니다.
- 405 Method Not Allowed
- 사용자가 요청한 Method가 서버에서는 허용하지 않는 Method임을 나타냅니다.
- 사용자가 서버에 요청하는 구조 또는 데이터가 잘못되었음을 나타내는 영역입니다.
- 500번 영역
- 500 Internal Server Error
- 서버의 에러가 발생하였음을 나타냅니다.
- 503 Service Unavailable
- 서버가 사용자의 요청을 처리할 준비가 되지 않았음을 나타냅니다.
- 서버의 에러와 관련된 영역입니다.
<Response- Header>
- Content-Type
- 서버의 응답 데이터를 웹 브라우저에서 처리할 방식과 형식을 나타냅니다.
- Content-Length
- 서버가 사용자에게 응답해주는 데이터의 길이를 나타냅니다.
- Server
- 서버가 사용하는 소프트웨어의 정보를 나타냅니다.
- Allow
- 허용되는 Method 목록을 사용자에게 알려줄 때 사용합니다.
- Location
- 300번 영역의 응답 코드 사용 시 변경된 웹 리소스의 주소를 나타냅니다.
- Set-Cookie
- 사용자에게 쿠키를 발급할 때 사용합니다. 해당 헤더를 받은 웹 브라우저는 해당 쿠키를 저장합니다.
-Request-
GET /index.html HTTP/1.1
Host: dreamhack.io //서버주소
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36 //사용자가 사용하는 프로그램 정보
-Response-
HTTP/1.1 200 OK
Server: Apache/2.4.29 (Ubuntu) //서버가 사용하는 소프트웨어 정보
Content-Length: 61
Connection: Keep-Alive
Content-Type: text/html //서버의 응답 데이터를 웹 브라우저에서 처리할 방식과 형식
<!doctype html> //body
<html>
<head>
</head>
<body>
</body>
</html>
Request
POST /login HTTP/1.1
Host: dreamhack.io
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
Content-Length: 16
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
username={공격코드}
Response
HTTP/1.1 500 Internal Server Error
Server: Apache/2.4.29 (Ubuntu)
Content-Length: 0
Connection: close
Content-Type: text/html
'보안공부' 카테고리의 다른 글
보안공부 방학 커리큘럼 (0) | 2022.12.31 |
---|---|
영단어 webhacking 101-챕터 5까지 (0) | 2022.01.08 |