본문 바로가기
SK shieldus Rookies 16기

[SK shieldus Rookies 16기] 클라우드 기반 스마트 융합 보안 과정 교육 정리(43일차)

by Challenge programmers 2023. 12. 22.

오늘 학습 주제

1. HTTP 특징

 

 

 

 

HTTP 특징


- HTTP 특징 -

C:\Users\crpark> curl -v http://victim:8080/WebGoat
*   Trying 192.168.0.xxx:8080...			⇐ 연결
* Connected to victim (192.168.0.xxx) port 8080
> GET /WebGoat HTTP/1.1				⇐ 요청 시작 ⇒ 방식 URI 프로토콜/버전
> Host: victim:8080					⇐ 요청 헤더 시작
> User-Agent: curl/8.4.0
> Accept: */*
>							⇐ 요청 헤더의 끝 (GET 방식의 요청이므로 요청 본문이 생략)
< HTTP/1.1 302 Found					⇐ 응답 시작 ⇒ 프로토콜/버전 응답(상태)코드 메시지
< Server: Apache-Coyote/1.1				⇐ 응답 헤더 시작
< Location: /WebGoat/					⇐ 리다이렉션 주소
< Transfer-Encoding: chunked
< Date: Fri, 22 Dec 2023 00:35:21 GMT
<							⇐ 응답 헤더 끝 (리다이렉션이 일어나므로 응답 본문이 생략)
* Connection #0 to host victim left intact		⇐ 연결을 종료

요청 헤더: 알면 좋은 참조할 값

한 줄 단위로 해석

 

C:\Users\crpark> curl -v http://victim:8080/WebGoat/
*   Trying 192.168.0.xxx:8080...
* Connected to victim (192.168.0.xxx) port 8080
> GET /WebGoat/ HTTP/1.1
> Host: victim:8080
> User-Agent: curl/8.4.0
> Accept: */*
>
< HTTP/1.1 401 Unauthorized					⇐ 인증 정보가 누락되었음
< Server: Apache-Coyote/1.1
< Cache-Control: private
< Expires: Thu, 01 Jan 1970 00:00:00 GMT
< WWW-Authenticate: Basic realm="WebGoat Application"	⇐ 기본 인증 방식으로 인증 정보를 전달
< Content-Type: text/html;charset=utf-8
< Content-Language: ko
< Content-Length: 691
< Date: Fri, 22 Dec 2023 00:43:20 GMT
<
<!doctype html><html lang="ko"><head><title>HTTP 상태 401 – 인가 안됨</title>

 

 

- Stateless -

상태를 유지하지 않는 프로토콜

HTTP는 클라이언트와 서버 간의 각 요청이 독립적이며

이전 요청과의 상태 정보를 서버가 유지하지 않음

확장성을 높이고, 서버의 부하를 줄이기 위해 사용

동일한 클라이언트가 여러 요청을 보낼 때를 위해 쿠키, 세션 등을 사용

 

 

- 쿠키(Cookie) -

Stateless한 HTTP 프로토콜에서 상태를 유지하기 위해서 도입된 개념

서버가 클라이언트의 웹 브라우저에 저장하는 작은 데이터 조각

클라이언트와 서버 간의 상태를 유지하고 세션을 관리하며

사용자가 웹 사이트를 방문할 때마다 브라우저에서 서버로 전송

 

요청 헤더와 응답 헤더를 통해서 전달되고, 브라우저에 저장되며,

JavaScript를 이용해서 접근할 수 있으므로 쉽게 탈취 및 도용, 위변조가 가능하다는 단점

쿠키에 중요 정보를 저장, 사용하면 안 됨

 

 

- 안전한 Cookie 운영법 -

가급적 중요한 정보는 쿠키에 포함하지 말아야 하며

중요한 쿠키는 암호화해서 포함

쿠키의 유효기간(Expires) 또는 지속시간(MaxAge)을 최소한으로 설정

쿠키 생성 시 Secure 속성을 설정하여 보안 통신을 할 때만 쿠키를 전달하도록 제한

쿠키 생성 시 HttpOnly 속성을 설정하여 클라이언트에서 쿠키에 직접 접근을 제한

(개발자 도구 or JavaScript 등을 이용한 쿠키 접근)

HttpOnly 속성이 활성화되어 있기 때문에 브라우저(클라이언트)에서 쿠키를 직접 핸들링 불가

 

 

 

- 세션(Session) -

쿠키의 단점을 보완하기 위해서 나온 개념

사용자의 상태를 서버 측에서 유지하고, 사용자를 식별하는 데 사용

 

중요 정보를 서버의 세션에 저장하고, 사용자에게는 해당 세션에 접근할 수 있는 세션 ID를 발급

 

중요 정보에 대한 직접적인 유출을 막을 수 있으나, 중요 정보 접근에 사용되는 세션 ID 관리가 중요

 

세션 ID 탈취: 

세션 ID가 요청, 응답을 통해서 전달되는 과정(스니핑) 또는 사용자 PC, 브라우저에 저장된 것을

탈취, 조작(XSS)할 수 있을 때 발생

 

세션 ID 추측:

세션 ID의 생성 규칙을 유추할 수 있을 때 발생

공격자가 다음에 생성될 세션 ID를 미리 설정하고 

불특정 다수의 희생자에게 동일한 세션 ID가 발급되기를 대기

동일한 세션 ID를 발급받은 희생자가 생기면 공격자는 희생자의 권한으로 사이트를 이용

 

세션 ID 고정: 보안 상의 취약점 중 하나로,

공격자가 특정 사용자에게 고정된 세션 ID를 부여하여 해당 사용자의 세션을 제어하려는 시도

공격자는 희생자의 세션 ID를 미리 설정 후 희생자가 로그인 하기를 대기

희생자가 로그인을 하면 인증 전후에 세션 ID가 동일하므로 공격자도 로그인 한 것으로 처리

공격자는 희생자의 권한으로 사이트 이용 가능

 

 

- 안전한 세션 운영법 -

세션 ID의 생성 규칙을 외부에서 알 수 없도록 설정

인증 전 후의 세션 ID를 다르게 설정

주기적으로 세션 ID를 갱신

쿠키를 안전한 방법으로 생성, 관리

 

 

- 리다이렉트 -

클라이언트의 요청을 받아서 해당 요청을 다른 URL로 전송하는 과정

웹 어플리케이션이나 웹 서버에서 특정 조건을 충족할 때

클라이언트를 새로운 위치로 이동시키기 위해 사용되며

리다이렉트는 사용자를 새로운 페이지로 안내하거나,

오래된 URL을 새로운 URL로 대체하는 등의 목적으로 사용

 

curl -v http://victim:8080/WebGoat

URL 마지막 부분에 /를 입력하지 않아도 자동으로 입력

응답 코드에 302 Found가 있기 때문

302 Found: 요청한 리소스가 일시적으로 다른 위치에 있음을 알림

 

 

- 기본 인증 -

< WWW-Authenticate: Basic realm="WebGoat Application"

 

클라이언트가 서버에 대한 요청을 할 때마다 사용자 이름과 비밀번호를 인코딩하여 함께 전송하고

서버는 이를 확인하여 접근 권한을 부여하거나 거부

 

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

Authorization 헤더를 사용하여 사용자 이름과 비밀번호를 전송

Basic으로 값이 시작되며 이름과 비밀번호를 Base64로 인코딩한 문자열이 전달됨

사용자 이름과 비밀번호를 평문으로 전송하기 때문에, 중간자 공격과 같은 보안 위협에 노출

 

 

- 인증 방법 -

Type1 - 지식기반(사용자만 알고 있는 정보를 이용해서 인증)

패스워드 등

 

Type2 - 소유기반(사용자만 가지고 있는 정보를 이용해서 인증)

OTP, 인증서, 주민등록증, 스마트폰 등

 

Type3 - 특징기반(사용자만 가지고 있는 특징을 이용해서 인증)

바이오 인증, 필기체 등

 

 

- 접근 통제 -

화면 - 권한 있는 사용자에게만 기능 버튼, 메뉴, 링크를 제공기능 - 권한 있는 사용자의 요청만 처리데이터 - 사용자 권한 범위의 데이터만 접근을 허용

 

 

 

 

 

취약점 정리


- 취약점 확인 방법 -

Injection ⇒ 기능에서 사용하는 특수문자를 입력해서 서버의 반응

 

SQL Injection ⇒ 홑따움, #, --, ; .... ⇒ 오류

 

Command Injection ⇒ &, |, ;, .... 추가 명령어 ⇒ 실행 확인

 

XSS ⇒ <script> alert('XSS'); </script> <img onerror="alert('xss')" />

 

CSRF ⇒ 중요기능에 절차와 주체를 확인하기 위한 입력이 있는지 확인

 

File Upload ⇒ 업로드 파일을 URL 주소를 이용해서 접근 가능한지 서버에서 실행 가능한 파일이 업로드 가능하니 확인

 

Path Traversal ⇒ 입력값이 내부 파일을 참조하는데 사용되는지 확인