웹 모의해킹 (HTTP 요청 메세지)
oolongeya
·2021. 8. 21. 18:05
HTTP (Hyper Text Transfer Protocol)
- 웹을 구현하기 위한 네트워크 프로토콜
- 웹사이트 주소 앞부분 http:// 라는 것이 HTTP 프로토콜이다
- 로그인과 같이 중요한 정보가 통신될 때는 암호화 통신을 위해 http:// 대신 https// 로 HTTPS로 접속
프로토콜이란?
송신 호스트와 수신 호스트, 즉 클라이언트와 서버가 서로 통신을 하기 위한 일종의 규약
HTTP 통신은 요청과 응답 두 가지로 구성된다.
클라이언트 영역 -> 서버 영역 (HTTP 요청)
서버 영역 -> 클라이언트 (HTTP 응답)
HTTP 요청 메시지와 응답 메시지 예제 1
실습용 가상 이미지에 있는 DVWA 웹 어플리케이션 로그인 시 전송 메시지
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
32
|
POST /dvwa/login.php HTTP/1.10
Host: 192.168.56.106
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0)
Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US, en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://192.168.56.106/dvwa/login.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 88
Cookie: security=impossible; PHPSESSID=2d0e37d5d057158ef95db774f43fc408
Connection: close
Upgrade-Insecure-Requests: 1
username=admin&password=password&Login=Login&user_token=4b3975577d23a9
bc4e28e5b39810cc00
HTTP/1.1 200 OK
Date: Tue, 02 Jan 2018 09:50:50 GMT
Server: Apache/2.2.8 (Ubuntu) DAV/2 mod_fastcgi/2.4.6 PHP/5.2.4-
2ubuntu5 with Suhosin-Patch mod_ssl/2.2.8 OpenSSL/0.9.8g
X-Powered-By: PHP/5.2.4-2ubuntu5
Expires: Tue, 23 Jun 2009 12:00:00 GMT
Cache-Control: no-cache, must-revalidate
Pragma: no-cache
Content-Length: 7398
Connection: close
Content-Type: text/html;charset=utf-8
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.
w3.org/TR/xhtml1/DTD/xhtmll-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
|
# HTTP 요청 메세지
=========================
<메소드> <요청 URI> <버전>
<헤더>
<바디>
|
cs |
첫째 줄에는 항상 메소드, 요청 URI, 버전 이고
둘째 줄부터 빈 줄까지는 여러 개의 헤더로 구성된다.
빈 줄 이후 부분은 바디라고 하며 이 부분을 통해 데이터가 전송된다.
데이터를 전송할 필요가 없는 경우 바디 부분 없이 첫 줄과 헤더만으로 메세지가 구성될 수도 있다.
(참고)
HTTP 메세지에서는 줄 바꿈을 나타내기 위해서 CR(Carriage Return, \r)과 LF(Line Feed, \n)라는 특수 문자를 사용한다. CRLF와 같이 두 개의 문자를 함께 사용한다.
CRLF는 메세지의 각 라인이 끝임을 알려주는 중요한 구분자이다.
특히 헤더와 바디가 구분될 때 빈 줄이 있는데, 이 경우 CRLFCRLF 처럼 CRLF가 두 번 사용된다.
CRLF를 강제로 전송하여 의도치 않은 결과를 초래하도록 만드는 CRLF 인젝션,
HTTP 응답 스플리팅(HTTP response splitting)과 같은 웹 공격 기법도 있다.
=========================================
POST(1) /dvwa/login.php(2) HTTP/1.10(3)
Host: 192.168.56.106
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0)
Gecko/20100101 Firefox/57.0
=========================================
(1) 과 같이 HTTP 요청 메세지의 처음은 HTTP 메소드로 시작한다.
메소드 (Method) 란?
서버에게 어떤 명령을 실행할 지 알려주는 역할
<자주 사용하는 메소드>
HTTP 메소드 | 설명 |
GET | 지정된 리소스 요청 |
POST | 클라이언트 데이터를 서버에 전달 |
PUT | 지정된 리소스에 데이터 저장 |
DELETE | 지정된 리소스 삭제 |
HEAD | 지정된 리소스의 응답 헤더만 요청 |
OPTIONS | 지원되는 메소드 표시 |
GET 메소드
지정된 리소스(예, html, jpg/gif 등 이미지 파일, js 등 스크립트 파일)를 요청하는 메소드
웹 페이지나 각종 이미지 파일들의 내용을 가져올 때 사용
POST 메소드
데이터를 클라이언트 쪽에서 서버 쪽으로 전달할 때 사용하는 메소드
게시판에 글을 쓰거나, 특정한 데이터를 전달할 때 사용
위 예제에서도 로그인을 위한 사용자 이름과 패스워드를 전달하기 위해 사용
PUT 메소드
지정된 리소스에 데이터를 저장하는 메소드
데이터를 덮어쓰기 때문에 리소스를 수정할 때도 종종 사용
DELETE 메소드
지정된 리소스를 삭제하는 메소드
이 4개의 메소드는 데이터 관리를 위해 직접적으로 사용되는 메소드
과거에는 대부분 GET, POST 메소드 위주로 사용했지만,
최근에는 PUT과 DELETE 메소드도 많이 사용한다.
이처럼 데이터 관리를 위해 사용하는 GET, POST, PUT, DELETE 메소드를 CRUD HTTP 메소드 라고 한다.
CRUD( Create, Read, Update, Delete)의 앞글자를 딴 것
데이터 관리를 위한 것이기 때문에 CRUD는 HTTP뿐만 아니라 데이터베이스에서 사용되는 SQL명령어와도 비슷하다.
CRUD | HTTP | SQL |
Create | PUT/POST | INSERT |
Read | GET | SELECT |
Update | PUT/POST | UPDATE |
Delete | DELETE | DELETE |
HEAD 메소드
응답 헤더의 정보들만 확인하고자 할 때 사용
데이터는 전송되지 않기 때문에, 대용량의 파일을 다운로드하기 전, 데이터의 길이를 확인하는 용도로 사용가능
OPTIONS 메소드
특정 리소스가 어떤 메소드를 처리할 수 있는지 확인할 때 사용
요청 URI
=========================================
POST/dvwa/login.php(2) HTTP/1.10(3)
Host: 192.168.56.106
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0)
Gecko/20100101 Firefox/57.0
=========================================
(2)에 표시된 부분은 요청 URI(uniform resource identifier) 이다.
요청 URI는
http://www.host.com/index.html과 같이
특정 리소스의 위치를 프로토콜과 호스트명을 모두 포함하여 표기한 완전한 URI가 될 수도 있다.
/index.html 처럼 상대적인 경로만 표시할 수도 있다.
위의 요청 메세지 예시에서 /dvwa/login.php가 요청 URI가 되는 것이다.
이 경우 호스트 헤더의 호스트 주소가 사용되어 이때의 완전한 URI는 http://192.168.56.106/dvwa/login.php 이다.
요청이 파라미터를 전달하는 경우에는 다음과 같이 ?과 사용되어 요청 URI를 구성될 수 있다.
/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit
굵게 강조한 ? 뒤의 부분이 쿼리스트링 이다.
파라미터=값 의 형태로 파라미터를 전달.
여러개의 파라미터를 전달하는 경우 & 문자로 파라미터들을 구분한다.
id=1, Submit=Submit 인 것이다.
버전
=========================================
POST(1)/dvwa/login.php(2) HTTP/1.10(3)
Host: 192.168.56.106
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0)
Gecko/20100101 Firefox/57.0
=========================================
(3)은 요청 메세지가 사용하고 있는 HTTP 버전을 표기한다.
응답 메세지에도 버전이 표기되는데 이렇게해서 클라이언트와 서버의 프로토콜 버전을 서로 확인할 수 있다.
요청 헤더 (Header)
============================================================
POST /dvwa/login.php HTTP/1.10
Host: 192.168.56.106
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0)
Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US, en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://192.168.56.106/dvwa/login.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 88
Cookie: security=impossible; PHPSESSID=2d0e37d5d057158ef95db774f43fc408
Connection: close
Upgrade-Insecure-Requests: 1
username=admin&password=password&Login=Login&user_token=4b3975577d23a9
bc4e28e5b39810cc00
============================================================
요청 메세지의 둘째 줄부터 빈 줄이 나타날 때까지의 부분에는 헤더를 통해 추가적인 정보가 전달
헤더 중에서는 요청, 응답 메세지 양쪽 모두에서 사용하는 헤더도 있고,
한쪽에서만 사용하는 헤더도 있다.
요청 메시지에서 사용된 헤더를 요청 헤더라 하고
응답 메세지에서 사용된 헤더를 응답 헤더라 한다.
헤더는 리스트의 형태로 여러 개가 전송될 수 있으며 각 헤더는 아래와 같은 형식이다.
헤더이름: 헤더 값
헤더 값은 헤더에 따라 형식이 조금 달라질 수도 있다.
요청 헤더 중 자주 사용되는 헤더들 몇 가지가 있다.
Host 헤더
Host: 192.168.56.106
호스트 헤더는 서버의 도메인 이름과 포트를 명시한다.
포트 번호는 생략될 수 있으며 이때는 일반적으로 웹 서비스에서 사용되는 80번 포트를 의미한다.
포트 번호를 포함하게 되면 host.com:port(예 : 192.168.56.106:443) 처럼 표시된다.
User-Agent 헤더
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0)
Gecko/20100101 Firefox/57.0
User-Agent 헤더는 클라이언트 소프트웨어를 식별할 수 있는 헤더이다.
웹 브라우저가 예라면, 웹 브라우저의 이름과 버전이 표시되며 웹 브라우저가 실행 중인 시스템의 환경, 브라우저가 사용하는 플랫폼 정보등이 추가로 포함될 수 있다.
웹 브라우저 이외에도 검색 엔진의 웹 로봇, 모바일 어플리케이션 등 웹 욫어을 수행하는 클라이언트들을 User-Agent에 자신의 정보를 보내어 웹 어플리케이션이 헤더의 내용을 확인하고 헤더에따라 다르게 동작할 수 있도록 해준다.
즉 User-Agent를 가짜로 이용하는 악성 봇, 자동화 프로그램들이 있다.
이처럼 User-Agent를 조작하는 것을 유저 에이전트 스푸핑(User agent spoofing)이라고 한다.
Accept, Accept-Language, Accept-Encoding 헤더
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US, en;q=0.5
Accept-Encoding: gzip, deflate
Accept 헤더는 클라이언트가 어떤 컨텐트 타입을 처리할 수 있는지 서버에게 알려준다.
위의 예제에서는 여러 개의 값들이 전달되는데 서버에서는 이 헤더에 지정된 타입 중에서 하나를 정하여 응답한다.
Accept-Language 헤더는 클라이언트가 어떤 언어를 처리할 수 있는 지 서버에게 알려주는 데
사용한다.
Accept-Encoding 헤더는 클라이언트가 처리할 수 있는 인코딩 방식이나 압축 알고리즘에 대한 정보를 알려준다.
Referer 헤더
Referer: http://192.168.56.106/dvwa/login.php
레퍼러 헤더는 이전 웹 페이지의 주소를 알려준다.
만약 웹 페이지의 링크를 눌러 새로운 페이지를 요청하는 경우,
새로운 페이지의 주소가 요청 URI 가 되고, 링크를 제공한 페이지의 주소가 레퍼러 헤더를 통해 표시된다.
따라서 레퍼러 헤더를 참조하면, 요청이 웹사이트 내부에서 요청된 것인지, 외부에서 요청된 것인지 알 수 있다.
이로 인해 CSRF 공격의 대응 방법 중 하나로 레퍼러 헤더의 값을 검사하기도 한다.
Content-Type, Content-Length 헤더
Content-Type: application/x-www-form-urlencoded
Content-Length: 88
바디가 존재하는 경우 바디의 종류와 길이를 알려주는 헤더이다.
요청 메시지, 응답 메세지 둘 다 사용 가능하다.
요청 메세지에서 Content-Type 헤더는 다음과 같은 값 중 하나를 가진다
application/x-www-form-urlencoded | 위 예제와 같이 파라미터=값 의 형태 ( 예 : username=admin ) 아스키문자로 표현할 수 있는 데이터를 전송할 때 사용한다. 여러개의 데이터를 보낼 때는 &로 구분한다. 가장 자주 쓰이는 형태이다. |
multipart/form-data | 파일 등의 바이너리 데이털르 전송할 때 사용한다. |
application/json | json 데이터를 전송할 때 사용한다. |
text/xml | XML 데이터를 전송할 때 사용한다 |
Cookie 헤더
Cookie: security=impossible; PHPSESSID=2d0e37d5d057158ef95db774f43fc408
쿠키를 전달하는 헤더이다. 쿠키는 변수와 값의 쌍으로 구성된 집합으로
여러 요청에 걸쳐 클라이언트에서 동일한 데이터를 전달할 필요가 있을 때 사용한다.
쿠키 헤더는 다음과 같은 형식을 가지며 하나의 쿠키 헤더를 통해 여러 개의 쿠키를 전달할 수 있다.
Cookie: cookie1=value1, cookie2=value2
쿠키는 애플리케이션의 필요에 따라 여러 가지 데이터를 전달할 수 있는데, 가장 대표적으로 전달하는 데이터로는 세션 ID가 있다. (세션 ID가 반드시 쿠키를 통해 전달되는 것은 아니다. 파라미터나 URL을 통해 전달되는 경우도 있다)
위의 예제에서는 PHPSESSID라는 쿠키가 세션ID를 전달하는 쿠키로 사용되고 있다.
PHP 에서 세션관리를 위해 사용하는 쿠키 이름이다.
세션 유지
HTTP 자체는 기본적으로 이전 상태를 저장하지 않는(Stateless) 프로토콜인데,
만일 웹사이트에서 이전 상태를 알아야 할 필요가 있는 경우에는 이와 같은 세션 ID를 구현하여 세션을 유지한다.
예: 웹사이트에서 사용자 아이디와 비밀번호를 입력하는 로그인 과정
만약 세션을 유지하지 않게 되면, 사용자가 웹사이트에 처음 로그인에 성공한다고 해도
그 정보를 다음 번에 알 수가 없기 때문에, 사용자가 웹 페이지를 요청할 때마다 새로 로그인해야 한다.
이와 같은 문제를 해결하기 위해, 어떤 사용자가 웹사이트에 처음 로그인을 하게 되면,
웹 서버는 세션 ID를 발급하여 쿠키 값으로 만들고 응답 헤더 중 Set-Cookie 헤더를 이용해서 웹 브라우저로 전달한다.
그러면 웹 브라우저는 이 쿠키를 저장해 두었다가, 이후 해당 웹사이트에 요청을 할 때마다
세션 쿠키를 쿠키 헤더를 통해 자동을 보냅니다. 이렇게 함으로써 사용자가 로그인을 따로 하지 않더라도, 로그인된 사용자라는 것을 알려줄 수 있게 되는 것이다.
요청을 받은 웹 서버는 쿠키에 있는 세션ID를 확인하고, 그 사용자가 이전에 로그인한 것으로 간주하여 각종 정보를 보여주고 필요한 권한을 부여해 줍니다.
로그인한 것으로 간주한다 라는 의미는 보안상 아주 중요하다.
이 의미는 어떤 사용자의 세션ID를 알게되면, 누구나 그 사용자의 권한으로 웹사이트에 접속해 사용할 수 있다.
이와 같이 다른 사용자의 세션ID를 알아내어 해당 사용자만 권한을 가지고 있는 정보에 접근하는 것을
세션 하이재킹 공격이라고 한다.
크로스 사이트 스크립팅 공격은 이렇게 다른 사용자의 세션ID를 알아내는 것을 주 목적으로 하여 사용자의 권한을 탈취하기 위해 사용한다.
즉 세션ID는 노출되지 않도록 철저히 보호해야 한다.
바디
username=admin&password=password&Login=Login&user_token=4b3975577d23a9
bc4e28e5b39810cc00
데이터가 전송되는 부분이다.
Content-Type에 따라 형태가 달라진다.
예제에서는 application/x-www-form-urlencoded 형식이 사용되어, username, password, Login, user_token
4개의 파라미터가 전달되고 있음을 알 수 있다.
username=admin
password=password
Login=Login
user_token=4b3975577d23a9bc4e28e5b39810cc00
이 게시물은 최봉환 저자님의 화이트 해커를 위한 웹 해킹의 기술 서적을 정리한 글입니다.
글에 대한 정보와 저작권은 '화이트 해커를 위한 웹 해킹의 기술' 서적에 있습니다.
'네트워크, 웹 (Network & Web) > Archive' 카테고리의 다른 글
웹 모의해킹 (웹 보안) (0) | 2021.08.29 |
---|---|
웹 모의해킹 (HTTP 응답 메세지) (0) | 2021.08.28 |