겉바속촉
[보안] HTTP, URI, 요청 및 응답 구조 본문
HTTP(HyperText Transfer Protocol)
- html과 같은 문서를 교환하기 위한 규약
- 요청(Request)/ 응답(Response) 구조 --> 클라이언트의 요청이 있어야 서버의 응답이 있는 것
- Stateless (무상태) = Sessionless = 세션, 연결을 유지하지 않는다.
- 동일한 클라이언트가 요청해도 알 수 없다 --> 요청과 요청간의 관계를 유지, 즉 확인하지 않음 (Stateless)
요청구조
***모든 라인은 개행문자가 들어감***
↳ : 개행문자(CRLF)를 의미한다고 가정
- 요청시작 : 요청방식 URI 프로토콜/버전 ↳
- 요청방식 : URI HTTP/1.1 ↳
- 요청헤더 : Content-Type: x-www-form-urlencoded↳
:
Content-Length: 2002↳
↳ - 요청본문 : 서버로 전달할 내용 = 요청 파라미터 --> 요청 방식에 따라서 있을 수도 있고, 없을 수도 있음
(요청본문이 존재한다면 요청헤더에 반드시 포함되는 내용이 있는데 그게 바로 content-type과 length)
요청방식 URI HTTP/1.1 ↳ Content-Type: text/html ↳ |
위의 예시에서 맨뒤의 개행문자 두개가 아니라 한개까지만 보내어 서버가 계속 기다리게 하는 공격이 있습니다
그것이 바로 Slowloris 공격 = Slow HTTP Header DoS
- 방식(method) : 서버에서 처리할 명령어
GET | 리소스를 요청. 요청 파라미터를 주소에 포함해서 전달. | http://www.exam.com/abc.do?name=hong |
POST | 리소스를 요청. 요청 파라미터를 요청 본문에 포함해서 전달. | |
PUT | 리소스를 생성 | |
DELETE | 리소스를 삭제 | |
HEAD | 리소스를 요청하는 데, 결과 헤더만 반환 | |
OPTIONS | 서버에서 제공할 수 있는 명령어 목록을 반환 |
1. Slowloris 공격 = Slow HTTP Header DoS
GET http://exam.com/abc.do HTTP/1.1↳Content-Type: x-www-form-urlencoded↳x-a: b↳x-a: b↳...↳...↳...↳
--> 요청 헤더를 끝내지 않고 연결을 유지
2. RUDY Attack = HTTP POST Attack
POST http://exam.com/abc.doHTTP/1.1↳Content-Type: x-www-form-urlencoded↳Content-Length: 20000↳...↳↳aaaa
--> 요청 본문을 천천히 전송해서 연결을 유지, 즉 한꺼번에 주지 않고 하나씩~ 하나씩~ 주는 것
URI(Uniform Resource Identifier)
- URL(Location) EX> http://www.exam.com:80/abc/def/xyz.do?name=hong&age=24
- 특정 디렉토리 아래에 존재하는 파일은 유일 --> 위치에 해당하는 리소스가 유일하고 그것을 식별하는 방식
- URN(Name)
- 인터넷 공간에서 사용하기 힘든 방식
URL | 이름 |
http | 스킴 |
www.exam.com | 호스트명 |
80 | 포트 (스킴이 http라면 80, https라면 443 이 디폴트) |
abc/def/ | 웹루트 |
xyz.do | 디렉터리로부터의 경로 |
name=hong&age=24 | 요청 파라미터 |
응답 구조
- 응답 시작 -> HTTP/1.1 결과코드 결과설명↳
- 응답 헤더 -> : ↳
: ↳
: ↳
↳ - 응답 본문 -> 클라이언트가 요청한 내용
<html><head>...</head><body>...</body></html>
결과코드 1xx ⇒ 정보 2xx ⇒ 성공. 200 OK. 201 Created. 3xx ⇒ 리다이렉트 4xx ⇒ 클라이언트 오류 5xx ⇒ 서버 오류 |
***응답헤더***
요청헤더와 마찬가지로 요청을 처리하는 데 꼭 필요한 값은 아니고
그냥 참고하는 값이라는 것을 알아야합니다.
응답 본문에 있는 것이 바로 사용자에게 직접 영향을 미치고 원하는 데이터들이 들어있는 것.
HTTP 응답 분할(HTTP response splitting)
응답을 생성하는 과정에서
외부에서 전달된 값(=요청 파라미터)이 응답 헤더의 값으로 사용될 수 있다면, …
요청 파라미터에 응답 헤더의 끝을 나타내는 개행문자의 포함 여부를 확인하지 않고
응답 헤더의 값으로 사용하면 여러개의 응답이 생성되어 클라이언트로 전달되는 문제
HTTP/1.1 200 OK↳Content-Type: text/html↳Set-Cookie: a=b↳...↳↳...↳HTTP/1.1 200 OK↳ … ↳ … ↳ … ↳↳<html>...</html> HTTP/1.1 200 OK↳ ⇐ 응답 시작 Content-Type: text/html↳ ⇐ 응답 헤더의 시작 Set-Cookie: a=b↳ ...↳ ↳ ⇐ 응답 헤더의 끝 ...↳ ⇐ 응답 본문 HTTP/1.1 200 OK↳ ⇐ 응답 시작 (두번째) … ↳ ⇐ 응답 헤더의 시작 … ↳ … ↳ ↳ ⇐ 응답 헤더의 끝 <html>...</html> ⇐ 응답 본문 |
그렇기 때문에 본문영역에 있는
<script>...<script> 구문을 응답 헤더에 넣어서도 사용 가능합니다
원래는 헤더에 있기 때문에 실행이 되지 않는데
응답이 분할이 되면서 본문으로 들어가는 것입니다:)
그럼 이제 오류가 발생되는 것이쥬
캐시 서버에 잘못된 정보들이 남아있기도 합니다.
HTTP/1.1 200 OK↳Content-Type: text/html↳Set-Cookie: a=b↳...↳↳...↳HTTP/1.1 200 OK↳ … ↳ … ↳ … ↳↳<html>...</html> HTTP/1.1 200 OK↳ ⇐ 응답 시작 Content-Type: text/html↳ ⇐ 응답 헤더의 시작 Set-Cookie: a=b↳ ...↳ ↳ ⇐ 응답 헤더의 끝 HTTP/1.1 200 OK↳ ⇐ 응답 시작 (두번째) … ↳ ⇐ 응답 헤더의 시작 … ↳ … ↳ ↳ ⇐ 응답 헤더의 끝 <html>...</html> ⇐ 응답 본문 |
'IT 일기 (상반기) > 네트워크 및 시스템 보안' 카테고리의 다른 글
[보안] Burpsuite를 이용한 요청 파라미터 조작 (0) | 2021.01.20 |
---|---|
[보안] Burpsuite를 이용한 요청/응답 구조 확인 (0) | 2021.01.20 |
[보안] 가상머신에 Visaul Studio Code 설치하는 방법 (0) | 2021.01.19 |
[보안] kali 한글 깨짐 해결 (0) | 2021.01.19 |
[보안] kali에서 명령어 연습하기 (0) | 2021.01.19 |