푸르미르

[web hacking]웹과 http기초 본문

SECURITY/웹해킹

[web hacking]웹과 http기초

((•_•)) 2021. 1. 19. 17:57

 웹은 크게 프레젠테이션티어, 로직티어, 데이터 티어라는 3계층 구조로 이루어져있다. 클라이언트 영역과 서버영역으로 웹을 나누게 되면 프레젠테이션티어는 클라이언트 영역에 속하며, 다른 티어들은 서버영역에 속한다.

내가 웹브라우저를 통해 구글로 접속했을 때 HTTP요청이 전송되어 인터넷을 통해 구글 서버영역으로 전달된다.

 

HTTP

HTTP는 웹을 구현하기 위한 네트워크 프로토콜이다. 이때 프로토콜은 송신호스트와 수신호스트 즉 클라이언트와 서버가 서로 통신하기 위한 일종의 규약이다. 

HTTP통신은 요청과 응답 두가지로 구성된다. 클라이언트 영역에서 서버영역으로 HTTP요청을 전송하고 웹서버는 해당요청을 처리한 후 HTTP응답을 통해 그 결과를 반환한다. 

 

HTTP요청 메세지

요청메세지의 구성은 

<메소드> <요청URI> <버전>

<헤더>

 

<바디>

이런식이다.

 

메소드

메소드는 서버에게 어떤 명령을 실행할지 알려주는 역할을 한다. 자주사용되는 메소드만 설명해보자면

  HTTP메소드 설명
  GET 지정된 리소스 요청 - 웹페이지 내용을 가져올 때 
  POST 클라이언트 데이터를 서버에 전달 - 로그인할 때 등
  PUT 지정된 리소스에 데이터 저장 - 데이터 덮어쓰기, 수정 등
  DELETE 지정된 리소스 삭제
  HEAD 지정된 리소스의 응답 헤더만 요청
  OPTIONS 지원되는 메소드 표시

GET, POST, PUT, DELETE는 데이터 관리를 위해 직접적으로 사용되는 메소드이다. 이 메소드들을 CRUD HTTP메소드라고 한다. 

 

요청URI

요청URI는 파라미터를 전달하는 경우에 따라 ?가 사용되어 구성될 수 있다. 

예를 들어 

/dvwa/vulneralbilities/sqli/?id=1&Submit=Submit

굵게 강조한 부분이 쿼드스트링이라고 파라미터=값 형태로 전달하며 여려개의 파라미터를 전달하는 경우, &특수문자를 사용하여 각 파라미터를 구분한다.

 

버전

버전은 HTTP버전을 표기한다.

 

요청헤더

요청메세지에서 사용된 헤더를 요청헤더라고 하고 응답메세지의 헤더를 응답헤더라고 한다. 헤더는 리스트의 형태로 여러개가 전송될 수 있으며 각 헤더는 헤더값을 가진다. 헤더값은 헤더에 따라 형식이 조금씩 달라질 수 있다.

요청 헤더 설명
Host 서버의 도메인 이름과 포트를 명시( 포트번호 생략시 보통 80번 포트임)
User-Agent 클라이언트 소프트웨어를 식별할 수 있는 헤더. (User-Agent를 조작한는 것을 유저 에이전트 스푸핑이라고 함)
Accept, Accept-Language, Accept-Encoding Accept헤더는 클라이언트가 어떤 컨텐트 타입을 처리할 수 있는지 서버에게 알려줌.
Accept-Language헤더는 클라이언트가 어떤 언어를 처리할 수 있는지를 서버에 알려줌.
Accept-Encoding헤더는 클라이언트가 처리할 수 있는 인코딩방식이나 압축알고리즘에 대한 정보를 알려줌.
Referer 이전 웹페이지의 주소를알려줌.(CSRF공격 대응방법 중 하나로 이 레퍼러 헤더의 값을 검사하기도 함.)
Content-type, Content-Length 바디가 존재하는 경우 바디의 종류와 전체 길이를 알려주는 헤더.
Cookie 쿠키를 전달하는 헤더. 쿠키는 변수와 값의 쌍으로 구성된 집합으로 여러 요청에 걸쳐 클라이언트에서 동일한 데이터를 전달할 필요가 있을 때 사용. 하나의 쿠키헤더를 통해 여러개의 쿠키를 전달할 수 있음. 쿠키는 애플리케이션 필요에 따라 여러 데이터를 전달할 수 있는데 가장 대표적으로 전달하는 데이터로는 세션ID가 있음.

세션ID는 사용자가 웹페이지를 요청할 때마다 새로 로그인을 해야하는 것을 막아준다. 웹사이트에 처음 로그인을 하게 되면 웹서버는 세션ID를 발급하여 쿠키값으로 만들고 응답헤더 중 Set-Cookie헤더를 통해 웹브라우저로 전달한다. 그러면 웹브라우저는 이 쿠키를 저장해 두었다가, 이후 해당 웹사이트에 요청을 할 때마다 세션쿠키를 쿠키 헤더를 통해 자동으로 보낸다. 그러면 웹서버는 쿠키에 있는 세션ID를 확인 하고 그 사용자가 이전에 '로그인 한 것으로 간주'하여 각종 권한을 부여해준다.

로그인한것으로 간주한다는 의미는 보안상 매우 중요하다. 다른사용자의 세션ID를 알아내어 해당 사용자만 권한을 가지고 있는 정보에 접근하는 것을 세션하이재킹 공격이라고 한다. 이 공격을 통해 그 사용자 권한으로 웹사이트에 접속하여 사용할 수 있기 때문에 주의가 필요하다.

 

바디

바디는 데이터가 전송되는 부분이다.

 

HTTP응답메세지

<버전> <응답코드> <응답코드 텍스트>

<헤더>

 

<바디>

 

응답코드/ 응답텍스트

숫자와 텍스트로 표시된다. 숫자는 status code라고 하는데 요청이 성공된것이나 에러의 종류를 알려준다. 응답 코드는 세자리 수로 표현되는데 100번대는 정보전달 목적, 200번대는 요청이 잘 처리되었음, 300번대는 웹페이지로 리다이렉트할 필요가 있을 때 사용된다. 그리고 400번대는 인증이 잘못된 리소스요청등 클라이언트가 원인이 되어 발생한 에러를 의미하며, 500번대는 서버쪽 에러를 의미한다. 

 

응답헤더

응답헤더 설명
Server 웹서버와 웹프레임워크이 버전 정보를 알려줌. 보안상의 이유로 삭제할 때도 있음.
Set-Cookie 서버에서 클라이언트로 쿠키를 전달할 때 사용. 쿠키는 웹브라우저에 저장되고 정해진 유효기간 동안 이후 요청메세지의 Cookie헤더를통해 다시 전송됨.
X-Frame-Options 웹페이지가 출력되는 것을 제어하는 헤더임. 클릭재킹 공격을 방지하기 위해 이 헤더를 사용할수 있음.
이 헤더가 DENY값을 가질 때 웹페이지를 프레임내에서 표시하지 않도록 하고,
SAMEORIGIN값을 가질 때에는 같은 도메인 안에서 요청된 웹페이지만 프레임으로 표시할 수 있도록 한다.
X-XSS-Protection Reflectied XSS공격이 탐지되었을 때 웹페이지가 로딩되는 것을 막아준다. 일반적으로 다음과 같이 사용된다.
X-XSS-Protection:1;mode=block
X-Content-Type-Options MIME스니핑을 차단하기 위해 사용하는 헤더.
X-Content-Type-Options:nosniff

Set-Cookie헤더의 형식은

Set-Cookie:<쿠키이름>=<쿠키값>;Expires=<날짜>;Path=<경로>;Secure;HttpOnly

이다. 쿠키이름과 값을 설정하는 것은 필수이며 이하의 옵션들은 생략될 수 있다. 하나하나 옵션들을 따져보자면

Expires옵션은 쿠키의 유효기간을 설정한다. 이것이 지정되지 않으면 세션이 종료될 때 까지이다.

Path옵션은 쿠키를 전송할 리소스의 경로를 지정한다.

Secure옵션은 앞에서도 세션하이재킹 공격을 말했다시피 http://로 요청되는 일반적인 HTTP요청으 모든 메세지가 평문으로 전송되기 때문에 네트워크 트래픽을 스니핑할 수 있는 공격자에게 데이터가 노출될 위험이 항상있어서 이Secure 옵션으로 지정한 쿠키는 HTTP요청시에는 전달되지 않고 HTTPS프로토콜을 요청이 암호화되어 전송될 때만 쿠키를 전달된다.

HttpOnly옵션은 역시 쿠키가 노출되지 않고 보호하기 위한 옵션이다. XSS공격은 자바스크립트를 이용하여 쿠키에 접근하여 쿠키값을 가져오는 공격인데 이 공격을 방지할 수 있게 한다. 

 

 

출처;book.naver.com/bookdb/book_detail.nhn?bid=13733655

'SECURITY > 웹해킹' 카테고리의 다른 글

[Webhaking.kr] Challenge 20  (0) 2021.10.05
[Webhaking.kr] Challenge 16  (0) 2021.10.05
[Webhacking.kr] Challenge 24  (0) 2021.09.29
[Webhacking.kr] Challenge 26  (0) 2021.09.27
[Webhacking.kr] Challenge 1  (0) 2021.09.27