Try Attack/Web Hacking[basic]

WEB 기초

D4tai1 2020. 5. 4.

안녕하세요.

 

또 처음으로 돌아왔네요..

 

 

저는 웹지식에 대한 부실공사가 너무 잘돼있어서

 

이번에 웹 기반지식을 깔끔하게 다져볼까 합니다.

 

 

1. 각각의 기능과 종류

[그림1] 웹서비스 동작구조

 

1) 브라우저

 

▶ Internet Explorer, Firefox, Chrome 등이 있습니다.

 

 사용자가 웹서비스 요청시 사용합니다.

 

 서버로부터 온 응답을 해석하여 화면에 보여줍니다.

 

 브라우저가 해석하는 클라이언트 언어는 html, css, java_script가 있습니다.

 


 

2) 웹서버

 

IIS, Apache, Tomcat, nginx 등의 웹서비스데몬이 있습니다.

 

 사용자가 요청한 데이터를 읽습니다.

 

 웹서버만으로 처리할 수 없는 것은

WAS(Web Application Server)와 DB(Database)서버와 함께 처리합니다.

 


 

3) WAS

 

 ASP, ASP.net, CGI, JSP, PHP 등이 있습니다.

 

 주로 정적인데이터(html, png, css 등)를 웹서버에서 처리한다면

 

 웹어플리케이션서버는 동적인데이터(DB를 조회하거나 서블릿컨테이너 등)를 처리합니다.

 


 

4) DB

 

 Oracle, MySQL, MsSQL 등 수십가지가 있습니다.

 

 

 

- 결국 사용자 요청에 대한 응답데이터를 만들어 전송하는 행위랍니다.

 

 

 


 

2. HTML 송수신 과정

 

1-1) 세션연결

 

1-2) 데이터 송수신(요청한 html을 응답)

▶ .html을 받았다면 웹페이지를 브라우저에 띄울 수 있죠?

 

1-3) 세션종료

 

그러나 웹페이지를 브라우저에 띄울 때 이미지파일 등 추가자원이 필요하다면?

 


 

2-1) 새로운 세션연결

 

2-2) 데이터 송수신(그림파일의 경로를 요청, 그림파일로 응답)

▶ 그림파일을 받았으니 브라우저에 띄울 수 있죠?

 

2-3) 세션종료

 

 

이와 같은 과정을 반복한답니다.

단 빨라서 보이지 않을 뿐이죠

하하

 


 

3. 직접확인

 

1) 개발자도구 

 

크롬브라우저에서

 

F12를 열어 개발자도구를 열고

 

naver.com에 접속을 하였습니다.

 


 

2) network 탭

 

[그림2] Chrome 개발자도구

 "index.html"에서 필요한 데이터를 받아온 자취를 확인할 수 있죠?

 


 

 3) 속성

 

[1] Name

 

 요청한 파일명을 말합니다.

 

 하나씩 클릭해보면 이미지를 누르면 이미지가 나오고

js파일이면 자바스크립트의 내용을 확인할 수 있습니다.

 

 스타일시트도 마찬가지로 확인가능합니다.


[2] Status

 

 HTTP 상태코드를 말합니다.


[3] Type

 

 요청한 파일이 어떤파일인지를 말합니다.

 

 이미지면 jpeg, png 등으로 나오겠고

js면 script로 나오겠고

css면 stylesheet로 나오겠죠?


[4] Initiator

 

 .html내 어느코드가 이 파일을 요청하는지를 의미합니다.

 

 누르면 .html파일 내 요청한 곳을 확인할 수 있습니다.


[5] Size

 

 응답받은 파일의 크기를 의미합니다.

 

 처음들어가는 경우는 전부 받아오기 때문에 사이즈가 나오지만

다시접속하는 경우 메모리캐시나 디스크캐시 등에 필요한정보가 남아있습니다.

(새로 얻어오지 않고 로컬자원을 사용하기 때문에 빠르겠죠?)


[6] Time 

 

 마이크로초(백만분의 일초)단위 기준입니다.

 

 즉, 네이버에 접속시 페이지가 바로 보여지지만 

실제로는 굉장히 많은 통신을 하며 세션을 맺고 끊는다는 의미겠죠?


[7] Waterfall

 

 받아온 순서대로 얼마나걸린지 정렬을 해줍니다.

(연결시간, 요청시간, 대기시간, 응답시간, 다운로드시간 등)

 

 어떤 데이터를 얻어오는데 어떤행위를 하면서 어느정도의 시간이 걸렸다는 것과 같이

순서에 따른 소요시간을 알 수 있답니다.

 


[그림3] 헤더정보 확인

 

추가로 Name에 있는 파일명을 누르면 

 

헤더정보를 직접 확인하거나 미리볼 수 있답니다.

 


4. HTTP 요청 및 응답 패킷

 

[그림4] HTTP Request

 

1) HTTP Request 구성
[1] GET /275 HTTP/1.1
▶ GET메서드 요청, 페이지디렉터리는 /275, HTTP/1.1 


[2] Host: ccurity.tistory.com
▶ ccurity.tistory.com 도메인을 요청


[3] Referer: https://www.google.com
▶ 경유지(참조) URL을 말하며 여기를 통해서 접속했다는 것을 알 수 있음


[4] User-Agent: Mozilla/5.0(Windows NT 10.0; Win64; x64)    ...중략...   Chrome/81.0.4044.131
▶ 사용자가 요청한 OS 및 웹브라우저 종류


[5] Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;   ......이하 생략
▶ 요청한 데이터 타입


[6] Cookie: a=123; b=234; JSESSIONID=abcdefghijklmnopqrst123456;
▶ 클라이언트에 저장된 사용자의 상태정보(쿠키)

 

1-1) 메서드(추가설명)

▶ 클라이언트가 서버에 요청하는 목적이나 종류를 의미합니다.

 

메서드 내용
GET URL에 해당하는 서버의 자원을 얻기위한 전송요청
(2084자 이하, ?id="파라미터"& 등등, body는 없음)
POST 서버가 처리할 자료를 전송, 주로 GET으로 보낼 수 없는 것
(길이제한 없음,  \r\n\r\n 뒤 작성하는 부분이 body)
HEAD URL에 해당하는 서버의 자원 중 헤더만 요청
TRACE 요청한 자원이 수신되는 경로를 확인하는 기능
PUT URL내 자원을 생성하는 기능(서버 내 파일쓰기)
DELETE URL내 자원을 삭제하는 기능(서버 내 정보제거)
OPTIONS 요청한 URL이 어떤 메서드를 지원하는지 확인하는 기능

 불필요한메서드사용 취약점 : TRACE, PUT, DELETE 등은 사용자가 웹서비스 이용시 필요하지 않는 메서드죠?

서버에서 해당메서드가 들어오면 다른 메서드로 변경하여 응답을 하거나 요청을 갔다 버려서 취약점을 없앨 수 있습니다.

 


[그림5] HTTP Response

 

2) HTTP Response 구성
[1] HTTP/1.1 200 OK
HTTP버전과 요청에 대한 응답코드

[2] Date: Mon, 04 May 2020 22:43:54 GMT



[3] Server: Apache
웹서버의 정보

[4] Content-Length: 70754

응답패킷의 길이

[5] Content-Type: text/html; charset=utf-8
컨텐츠의 종류, 여기서는 utf-8인코딩으로 구성된 html


[6] body[\r\n\r\n(개행 2번 이후)]

Content-Type에서 html이라고 했으니 html의 코드가 들어있겠네요.
<!doctype html> .. 생략

 

[그림6] 응답코드

 301은 리다이렉트시킬 때 사용

 

주로 인증과 관련된 페이지에서 300대 코드가 발생했다면 인증 실패를 의미

 

주로 짧은 시간 내 대량의 404에러가 발생한다면 스캐너툴이나 크롤러를 돌렸을 가능성이 있음!

 


 

5. 궁금증

 

※ 쿠키는 말이죠?

 클라이언트에 저장되는 키와 값으로 저장된 데이터입니다.

▶ 이름, 값, 유효시간, 도메인, 요청경로으로 구성됩니다

▶ 좀 더 말하면 4KB이하의 문자열로 구성되어 있죠

 

 

 쿠키와 세션의 동작방식은?

 클라이언트가 서버에 페이지를 요청(?id=abc&pw=1234)하겠죠?

 서버는 데이터베이스를 조회해서 해당 회원이 있다면

 서버의 세션공장에서 클라이언트에 대한 세션ID를 생성합니다.

 열심히 만들었으니 HTTP헤더(Set-Cookie)에 쿠키내에 세션ID를 포함해서 응답합니다.

  - Set-Cookie: <cookie_name>=<cookie_value>

▶ 클라이언트가 다시 요청할 때는 HTTP헤더(Cookie)에 쿠키를 포함해서 요청합니다.

  - Cookie: <cookie_name>=<cookie_value>

 서버에서 쿠키를 검증 후 세션ID를 통해 해당 클라이언트 정보를 가져옵니다.

정보를 처리 후 응답 시 쿠키의 필요에 따라 쿠키정보를 업데이트 후 HTTP헤더에 쿠키를 포함해서 응답합니다.

▶ 쿠키의 유효시간이 만료되지 않는 한 브라우저 종료 후 재접속해도 인증정보가 남아있죠!

 

 

 엇, 그러면 세션은 뭔가요?

 세션은 쿠키를 바탕으로 사용자정보를 관리합니다. 단 파일이 아닌 메모리상에서 말이죠!

 서버에서는 클라이언트를 식별하기위해 세션ID를 부여합니다.

 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증된 상태를 유지하고 있죠

 세션타임아웃기능을 이용해서 일정시간동안 잠수탔던 클라이언트의 세션ID는 서버에서 소멸시킬 수도 있습니다.

▶ 세션은 사용자정보를 클라이언트에 두는 쿠키보다는 안전하지만, 사용자가 많아질수록 서버의 자원이 부족해질 수 있습니다.

 

 

 도데체 쿠키와 세션 무슨차이져(동작방식도 비슷한거 같은데...중얼중얼)?

▶ 세션도 쿠키를 사용해서 비슷하지만 쿠키는 클라이언트의 파일로 저장되고 세션은 서버의 메모리에 올라가 있습니다.

 그 말은 쿠키는 서버의 자원을 사용하지 않고 세션은 서버의 자원을 잡아먹는다는 말이겠죠?

 각각의 클라이언트에 파일로 저장되어 위변조될 가능성이 있는 쿠키보다는 서버에서 관리하는 세션이 보다안전하죠

▶ 보안적으로 본다면 라이프사이클만큼 중요한 것도 없습니다.

 - 쿠키는 만료시간이 있긴 하지만 브라우저가 종료돼도 파일로 남아있고

 - 세션은 브라우저 종료 시 만료시간에 상관없이 소리소문없이 사라진답니다!

 

 

 그럼 좋은게 1도 없어보이는 쿠키 대신 세션만 사용하면 되지 않나요?

 조금 더 얘기하면 서버에서 처리를 거치는 세션보다는 쿠키가 빠르답니다.

▶ 위에서도 말했지만 세션은 서버의 자원을 사용하기 때문에 동시접속자가 많은 서버가 힘들어해요..(부들부들)

 

 

※ 위에서 캐시에 대해서도 언급했는데 쿠키가 캐시인가요?

▶ 쿠키가 사용자정보를 저장한 파일이라면 캐시는 브라우저가 참고해서 사용하는 것?이라고 보면 됩니다.

 음.. 캐시는 이미지나 자바스크립트, 스타일시트(CSS) 파일을 의미합니다.

 처음 접속 시 해당 서버에서 사용하는 파일을 받아온 후 캐시에 있다면 브라우저는 서버에 다시 요청하지 않습니다. 

 이 덕분에 속도는 빨라질 수 있지만 종종 페이지가 변경되야하는 부분이 새로고침해도 변경되지 않을 때가 있죠?

 캐시 삭제 후 다시 접속하면 변경되서 보인답니다.

 

 

그 외 CSRF 글 적을 때 다루었는지 기억은 나지 않지만 요새는 토큰기반의 인증시스템도 많이 사용한다고 합니다. 

 

보안을 위해서 쿠키를 제어하기 위한 몇 가지 옵션이 있는데요.

 - Secure 옵션은 HTTPS프로토콜에서 암호화된 요청에 대해서만 전송하는 옵션입니다.

 - HttpOnly 옵션은 XSS를 방지하는 document.cookie API를 호출할 수 없도록 합니다.

 

저는 어떤식으로 코드가 짜여진지는 모르지만 이런 옵션이 있다면 잘 가져다 쓰는 것도 좋지 않을까요?

 

 

'Try Attack > Web Hacking[basic]' 카테고리의 다른 글

Cross Site Script(XSS)  (0) 2019.09.20
불충분한 세션관리  (0) 2019.09.20
command injection  (0) 2019.09.20
Web hacking 이론  (0) 2019.04.27
File Upload  (0) 2018.08.12

댓글