hacktricks/network-services-pentesting/pentesting-web/special-http-headers.md

210 lines
12 KiB
Markdown
Raw Normal View History

2024-02-10 21:30:13 +00:00
# 특별한 HTTP 헤더
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로**부터 **히어로**까지 **AWS 해킹** 배우기!</summary>
2022-04-28 16:01:33 +00:00
2024-02-10 21:30:13 +00:00
HackTricks를 지원하는 다른 방법:
2024-02-03 12:22:53 +00:00
* **회사가 HackTricks에 광고**되길 원하거나 **HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com) 받기
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하고, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션을 살펴보세요
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
2022-04-28 16:01:33 +00:00
</details>
2024-02-10 21:30:13 +00:00
## 단어 목록 및 도구
2021-09-19 15:52:48 +00:00
* [https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/web/http-request-headers](https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/web/http-request-headers)
* [https://github.com/rfc-st/humble](https://github.com/rfc-st/humble)
2021-09-19 15:52:48 +00:00
2024-02-10 21:30:13 +00:00
## 위치 변경을 위한 헤더
2021-09-19 15:19:00 +00:00
**IP 출처** 재작성:
2021-09-19 15:19:00 +00:00
2022-04-05 22:24:52 +00:00
* `X-Originating-IP: 127.0.0.1`
2021-09-19 15:52:48 +00:00
* `X-Forwarded-For: 127.0.0.1`
2022-04-19 22:38:50 +00:00
* `X-Forwarded: 127.0.0.1`
2021-09-19 15:52:48 +00:00
* `Forwarded-For: 127.0.0.1`
2021-09-27 10:58:30 +00:00
* `X-Forwarded-Host: 127.0.0.1`
2022-04-05 22:24:52 +00:00
* `X-Remote-IP: 127.0.0.1`
2021-09-19 15:19:00 +00:00
* `X-Remote-Addr: 127.0.0.1`
* `X-ProxyUser-Ip: 127.0.0.1`
* `X-Original-URL: 127.0.0.1`
2021-09-19 15:52:48 +00:00
* `Client-IP: 127.0.0.1`
2021-09-27 10:58:30 +00:00
* `X-Client-IP: 127.0.0.1`
* `X-Host: 127.0.0.1`
2021-09-19 15:52:48 +00:00
* `True-Client-IP: 127.0.0.1`
* `Cluster-Client-IP: 127.0.0.1`
2021-09-20 13:06:32 +00:00
* `Via: 1.0 fred, 1.1 127.0.0.1`
2024-02-10 21:30:13 +00:00
* `Connection: close, X-Forwarded-For` (hop-by-hop 헤더 확인)
2021-09-19 15:19:00 +00:00
**위치** 재작성:
2021-09-19 15:19:00 +00:00
* `X-Original-URL: /admin/console`
* `X-Rewrite-URL: /admin/console`
2024-02-10 21:30:13 +00:00
## Hop-by-Hop 헤더
2021-09-19 15:19:00 +00:00
Hop-by-Hop 헤더는 현재 요청을 처리하는 프록시에서 소비되도록 설계된 헤더입니다.
2021-09-19 15:19:00 +00:00
* `Connection: close, X-Forwarded-For`
{% content-ref url="../../pentesting-web/abusing-hop-by-hop-headers.md" %}
[abusing-hop-by-hop-headers.md](../../pentesting-web/abusing-hop-by-hop-headers.md)
{% endcontent-ref %}
2021-09-19 15:19:00 +00:00
2024-02-10 21:30:13 +00:00
## HTTP 요청 스머글링
2021-09-19 15:19:00 +00:00
* `Content-Length: 30`
* `Transfer-Encoding: chunked`
2021-11-05 20:59:42 +00:00
{% content-ref url="../../pentesting-web/http-request-smuggling/" %}
[http-request-smuggling](../../pentesting-web/http-request-smuggling/)
{% endcontent-ref %}
2021-09-19 15:19:00 +00:00
2024-02-10 21:30:13 +00:00
## 캐시 헤더
2021-09-19 15:52:48 +00:00
2024-02-10 21:30:13 +00:00
**서버 캐시 헤더**:
2021-09-20 13:06:32 +00:00
* 응답의 **`X-Cache`**에는 요청이 캐시되지 않았을 때 **`miss`** 값이 있고, 캐시된 경우 **`hit`** 값이 있을 수 있습니다.
* **`Cf-Cache-Status`** 헤더에서도 유사한 동작
* **`Cache-Control`**은 리소스가 캐시되는지 여부를 나타내며 리소스가 다시 캐시될 시간을 나타냅니다: `Cache-Control: public, max-age=1800`
* **`Vary`**는 일반적으로 응답에서 **추가 헤더**를 나타내어 일반적으로 키가 없는 헤더로 처리되지만 캐시 키의 일부로 취급됩니다.
2024-02-10 21:30:13 +00:00
* **`Age`**는 프록시 캐시에 있는 객체의 시간을 초 단위로 정의합니다.
* **`Server-Timing: cdn-cache; desc=HIT`**은 리소스가 캐시되었음을 나타냅니다.
2021-09-19 15:52:48 +00:00
{% content-ref url="../../pentesting-web/cache-deception/" %}
[cache-deception](../../pentesting-web/cache-deception/)
{% endcontent-ref %}
2021-09-19 15:52:48 +00:00
2024-02-10 21:30:13 +00:00
**로컬 캐시 헤더**:
2021-09-20 13:06:32 +00:00
* `Clear-Site-Data`: 제거해야 하는 캐시를 나타내는 헤더: `Clear-Site-Data: "cache", "cookies"`
* `Expires`: 응답이 만료되어야 하는 날짜/시간을 포함합니다: `Expires: Wed, 21 Oct 2015 07:28:00 GMT`
* `Pragma: no-cache``Cache-Control: no-cache`와 동일합니다.
* `Warning`: **`Warning`** 일반 HTTP 헤더에는 메시지 상태에 문제가 있을 수 있다는 정보가 포함됩니다. 응답에는 하나 이상의 `Warning` 헤더가 나타날 수 있습니다. `Warning: 110 anderson/1.3.37 "Response is stale"`
2021-09-20 13:06:32 +00:00
## 조건부
2021-09-19 15:19:00 +00:00
* 이러한 헤더를 사용하는 요청인 **`If-Modified-Since`** 및 **`If-Unmodified-Since`**는 응답 헤더인 **`Last-Modified`**에 다른 시간이 포함되어 있을 때에만 데이터로 응답됩니다.
* **`If-Match`** 및 **`If-None-Match`**를 사용하는 조건부 요청은 Etag 값을 사용하여 데이터(Etag)가 변경된 경우에만 웹 서버가 응답 내용을 보냅니다. `Etag`는 HTTP 응답에서 가져옵니다.
* **Etag** 값은 일반적으로 응답 내용을 기반으로 계산됩니다. 예를 들어, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"``Etag`가 **37바이트**의 **Sha1**임을 나타냅니다.
2021-09-19 19:55:40 +00:00
2024-02-10 21:30:13 +00:00
## 범위 요청
2021-09-19 19:55:40 +00:00
* **`Accept-Ranges`**: 서버가 범위 요청을 지원하는지 여부 및 범위를 표현할 수 있는 단위를 나타냅니다. `Accept-Ranges: <range-unit>`
2024-02-10 21:30:13 +00:00
* **`Range`**: 서버가 반환해야 하는 문서의 일부를 나타냅니다.
* **`If-Range`**: 주어진 etag 또는 날짜가 원격 리소스와 일치하는 경우에만 충족되는 조건부 범위 요청을 생성합니다. 호환되지 않는 버전의 리소스에서 두 범위를 다운로드하는 것을 방지하는 데 사용됩니다.
2024-02-10 21:30:13 +00:00
* **`Content-Range`**: 전체 본문 메시지에서 부분 메시지가 속하는 위치를 나타냅니다.
2021-09-19 19:55:40 +00:00
2024-02-10 21:30:13 +00:00
## 메시지 본문 정보
2021-09-19 19:55:40 +00:00
* **`Content-Length`:** 리소스의 크기(바이트 단위의 10진수)를 나타냅니다.
2024-02-10 21:30:13 +00:00
* **`Content-Type`**: 리소스의 미디어 유형을 나타냅니다.
* **`Content-Encoding`**: 압축 알고리즘을 지정하는 데 사용됩니다.
* **`Content-Language`**: 대상 사용자를 위해 의도된 인간 언어를 설명하여 사용자가 자신의 선호하는 언어에 따라 구분할 수 있도록 합니다.
* **`Content-Location`**: 반환된 데이터의 대체 위치를 나타냅니다.
펜테스트 관점에서 이 정보는 일반적으로 "쓸모 없지만, 리소스가 401 또는 403으로 보호되어 있고 이 정보를 얻을 방법을 찾을 수 있다면 흥미로울 수 있습니다."\
예를 들어 HEAD 요청에서 **`Range`** 및 **`Etag`**의 조합은 페이지 내용을 HEAD 요청을 통해 누출시킬 수 있습니다:
* 헤더 `Range: bytes=20-20`을 포함하는 요청 및 `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"`을 포함하는 응답은 바이트 20의 SHA1이 `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`임을 누출합니다.
2024-02-10 21:30:13 +00:00
## 서버 정보
2021-09-20 13:06:32 +00:00
* `Server: Apache/2.4.1 (Unix)`
* `X-Powered-By: PHP/5.3.3`
## 컨트롤
2021-09-20 13:06:32 +00:00
2024-02-10 21:30:13 +00:00
* **`Allow`**: 이 헤더는 리소스가 처리할 수 있는 HTTP 메소드를 전달하는 데 사용됩니다. 예를 들어, `Allow: GET, POST, HEAD`로 지정될 수 있으며, 이는 리소스가 이러한 메소드를 지원한다는 것을 나타냅니다.
* **`Expect`**: 클라이언트가 요청이 성공적으로 처리되기 위해 서버가 충족해야 하는 기대 사항을 전달하는 데 사용됩니다. 일반적인 사용 사례로는 `Expect: 100-continue` 헤더가 포함되는데, 이는 클라이언트가 대량의 데이터 페이로드를 보낼 것을 나타냅니다. 클라이언트는 전송을 계속하기 전에 `100 (Continue)` 응답을 기다립니다. 이 메커니즘은 서버 확인을 기다림으로써 네트워크 사용을 최적화하는 데 도움이 됩니다.
2021-09-20 13:06:32 +00:00
2024-02-10 21:30:13 +00:00
## 다운로드
2021-09-20 13:06:32 +00:00
* HTTP 응답의 **`Content-Disposition`** 헤더는 파일이 웹페이지 내에서 **inline**으로 표시되어야 하는지 또는 **attachment**로 처리되어야 하는지(다운로드)를 지시합니다. 예를 들어:
2024-02-08 21:36:15 +00:00
```
Content-Disposition: attachment; filename="filename.jpg"
```
2024-02-10 21:30:13 +00:00
## 보안 헤더
2024-02-10 21:30:13 +00:00
### 콘텐츠 보안 정책 (CSP) <a href="#csp" id="csp"></a>
2022-04-19 22:38:50 +00:00
{% content-ref url="../../pentesting-web/content-security-policy-csp-bypass/" %}
[content-security-policy-csp-bypass](../../pentesting-web/content-security-policy-csp-bypass/)
{% endcontent-ref %}
2024-02-10 21:30:13 +00:00
### **신뢰할 수 있는 유형**
CSP를 통해 Trusted Types를 강제함으로써 애플리케이션은 DOM XSS 공격으로부터 보호될 수 있습니다. Trusted Types는 특정하게 설계된 객체만이 위험한 웹 API 호출에 사용될 수 있도록 보장하여, 기본적으로 JavaScript 코드를 보호합니다.
```javascript
2021-10-19 22:49:43 +00:00
// Feature detection
if (window.trustedTypes && trustedTypes.createPolicy) {
2024-02-10 21:30:13 +00:00
// Name and create a policy
const policy = trustedTypes.createPolicy('escapePolicy', {
createHTML: str => str.replace(/\</g, '&lt;').replace(/>/g, '&gt;');
});
2021-10-19 22:49:43 +00:00
}
```
```javascript
2024-02-08 21:36:15 +00:00
// Assignment of raw strings is blocked, ensuring safety.
el.innerHTML = 'some string'; // Throws an exception.
2021-10-19 22:49:43 +00:00
const escaped = policy.createHTML('<img src=x onerror=alert(1)>');
2024-02-08 21:36:15 +00:00
el.innerHTML = escaped; // Results in safe assignment.
2021-10-19 22:49:43 +00:00
```
2024-02-08 21:36:15 +00:00
### **X-Content-Type-Options**
2021-10-19 22:49:43 +00:00
이 헤더는 MIME 유형 스니핑을 방지하여 XSS 취약점으로 이어질 수 있는 실천을 방지합니다. 이는 브라우저가 서버에서 지정한 MIME 유형을 존중하도록 보장합니다.
2024-02-08 21:36:15 +00:00
```
2021-10-19 22:49:43 +00:00
X-Content-Type-Options: nosniff
```
2024-02-08 21:36:15 +00:00
### **X-Frame-Options**
2021-10-19 22:49:43 +00:00
2024-02-10 21:30:13 +00:00
클릭재킹을 방지하기 위해 이 헤더는 문서가 `<frame>`, `<iframe>`, `<embed>`, 또는 `<object>` 태그에 임베드될 수 있는 방식을 제한하며, 모든 문서가 임베딩 권한을 명시적으로 지정하도록 권장합니다.
2024-02-08 21:36:15 +00:00
```
2021-10-19 22:49:43 +00:00
X-Frame-Options: DENY
```
### **Cross-Origin Resource Policy (CORP) and Cross-Origin Resource Sharing (CORS)**
2021-10-19 22:49:43 +00:00
CORP은 웹 사이트에서 로드할 수 있는 리소스를 지정하는 데 중요하며, 사이트 간 누출을 완화합니다. CORS는 반면에 더 유연한 사이트 간 리소스 공유 메커니즘을 허용하여 특정 조건 하에서 동일 출처 정책을 완화합니다.
2021-10-19 22:49:43 +00:00
```
Cross-Origin-Resource-Policy: same-origin
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
```
### **Cross-Origin Embedder Policy (COEP) and Cross-Origin Opener Policy (COOP)**
COEP와 COOP는 교차 출처 격리를 활성화하는 데 중요하며, Spectre와 유사한 공격 위험을 크게 줄입니다. 이들은 각각 교차 출처 리소스의 로딩과 교차 출처 창과의 상호 작용을 제어합니다.
2024-02-08 21:36:15 +00:00
```
2021-10-19 22:49:43 +00:00
Cross-Origin-Embedder-Policy: require-corp
2024-02-08 21:36:15 +00:00
Cross-Origin-Opener-Policy: same-origin-allow-popups
2021-10-19 22:49:43 +00:00
```
2024-02-08 21:36:15 +00:00
### **HTTP Strict Transport Security (HSTS)**
2021-10-19 22:49:43 +00:00
마지막으로, HSTS는 브라우저가 서버와 통신할 때 오직 안전한 HTTPS 연결을 통해서만 통신하도록 강제하는 보안 기능입니다. 이는 개인 정보 보호와 보안을 강화합니다.
2024-02-08 21:36:15 +00:00
```
2021-10-19 22:49:43 +00:00
Strict-Transport-Security: max-age=3153600
```
2024-02-10 21:30:13 +00:00
## 참고 자료
2021-09-19 19:55:40 +00:00
* [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition)
* [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)
* [https://web.dev/security-headers/](https://web.dev/security-headers/)
* [https://web.dev/articles/security-headers](https://web.dev/articles/security-headers)
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>제로부터 영웅이 되기까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 21:30:13 +00:00
HackTricks를 지원하는 다른 방법:
2024-02-03 12:22:53 +00:00
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
2022-04-28 16:01:33 +00:00
</details>