10 KiB
Special HTTP headers
{{#include ../../banners/hacktricks-training.md}}
Wordlists & Tools
- https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers
- https://github.com/rfc-st/humble
Headers to Change Location
Rewrite IP source:
X-Originating-IP: 127.0.0.1X-Forwarded-For: 127.0.0.1X-Forwarded: 127.0.0.1Forwarded-For: 127.0.0.1X-Forwarded-Host: 127.0.0.1X-Remote-IP: 127.0.0.1X-Remote-Addr: 127.0.0.1X-ProxyUser-Ip: 127.0.0.1X-Original-URL: 127.0.0.1Client-IP: 127.0.0.1X-Client-IP: 127.0.0.1X-Host: 127.0.0.1True-Client-IP: 127.0.0.1Cluster-Client-IP: 127.0.0.1Via: 1.0 fred, 1.1 127.0.0.1Connection: close, X-Forwarded-For(Check hop-by-hop headers)
Rewrite location:
X-Original-URL: /admin/consoleX-Rewrite-URL: /admin/console
Hop-by-Hop headers
A hop-by-hop header는 요청을 처리하는 프록시에서 처리되고 소비되도록 설계된 헤더로, 종단 간 헤더와는 다릅니다.
Connection: close, X-Forwarded-For
{{#ref}} ../../pentesting-web/abusing-hop-by-hop-headers.md {{#endref}}
HTTP Request Smuggling
Content-Length: 30Transfer-Encoding: chunked
{{#ref}} ../../pentesting-web/http-request-smuggling/ {{#endref}}
Cache Headers
서버 캐시 헤더:
X-Cache응답에서 요청이 캐시되지 않았을 때는miss값을 가질 수 있으며, 캐시되었을 때는hit값을 가집니다.- 헤더 **
Cf-Cache-Status**에서도 유사한 동작을 합니다. - **
Cache-Control**은 리소스가 캐시되고 있는지와 다음에 리소스가 다시 캐시될 시간에 대해 나타냅니다:Cache-Control: public, max-age=1800 - **
Vary**는 응답에서 추가 헤더를 나타내는 데 자주 사용되며, 일반적으로 키가 없는 헤더라도 캐시 키의 일부로 처리됩니다. - **
Age**는 객체가 프록시 캐시에 있었던 시간을 초 단위로 정의합니다. - **
Server-Timing: cdn-cache; desc=HIT**는 리소스가 캐시되었음을 나타냅니다.
{{#ref}} ../../pentesting-web/cache-deception/ {{#endref}}
로컬 캐시 헤더:
Clear-Site-Data: 제거해야 할 캐시를 나타내는 헤더:Clear-Site-Data: "cache", "cookies"Expires: 응답이 만료되어야 하는 날짜/시간을 포함합니다:Expires: Wed, 21 Oct 2015 07:28:00 GMTPragma: no-cache는Cache-Control: no-cache와 동일합니다.Warning:Warning일반 HTTP 헤더는 메시지 상태와 관련된 가능한 문제에 대한 정보를 포함합니다. 응답에 여러 개의Warning헤더가 나타날 수 있습니다.Warning: 110 anderson/1.3.37 "Response is stale"
Conditionals
- 이러한 헤더를 사용하는 요청:
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임을 나타냅니다.
Range requests
Accept-Ranges: 서버가 범위 요청을 지원하는지 여부와 범위를 표현할 수 있는 단위를 나타냅니다.Accept-Ranges: <range-unit>Range: 서버가 반환해야 하는 문서의 부분을 나타냅니다. 예를 들어,Range:80-100은 원래 응답의 80에서 100 바이트를 반환하며, 상태 코드는 206 Partial Content입니다. 요청에서Accept-Encoding헤더를 제거하는 것도 잊지 마세요.- 이는 그렇지 않으면 이스케이프될 수 있는 임의의 반사된 자바스크립트 코드로 응답을 얻는 데 유용할 수 있습니다. 그러나 이를 악용하려면 요청에 이 헤더를 주입해야 합니다.
If-Range: 주어진 etag 또는 날짜가 원격 리소스와 일치하는 경우에만 충족되는 조건부 범위 요청을 생성합니다. 이는 리소스의 호환되지 않는 버전에서 두 범위를 다운로드하는 것을 방지하는 데 사용됩니다.Content-Range: 전체 본문 메시지에서 부분 메시지가 속하는 위치를 나타냅니다.
Message body information
Content-Length: 리소스의 크기, 바이트의 10진수 숫자입니다.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임을 유출합니다.
Server Info
Server: Apache/2.4.1 (Unix)X-Powered-By: PHP/5.3.3
Controls
Allow: 이 헤더는 리소스가 처리할 수 있는 HTTP 메서드를 전달하는 데 사용됩니다. 예를 들어,Allow: GET, POST, HEAD로 지정될 수 있으며, 이는 리소스가 이러한 메서드를 지원함을 나타냅니다.Expect: 클라이언트가 요청이 성공적으로 처리되기 위해 서버가 충족해야 하는 기대를 전달하는 데 사용됩니다. 일반적인 사용 사례는 클라이언트가 대량의 데이터 페이로드를 전송할 의도가 있음을 나타내는Expect: 100-continue헤더입니다. 클라이언트는 전송을 진행하기 전에100 (Continue)응답을 찾습니다. 이 메커니즘은 서버 확인을 기다림으로써 네트워크 사용을 최적화하는 데 도움이 됩니다.
Downloads
- HTTP 응답의
Content-Disposition헤더는 파일이 인라인(웹페이지 내)으로 표시되어야 하는지 또는 첨부파일(다운로드)로 처리되어야 하는지를 지시합니다. 예를 들어:
Content-Disposition: attachment; filename="filename.jpg"
이것은 "filename.jpg"라는 파일이 다운로드되고 저장될 의도임을 의미합니다.
보안 헤더
콘텐츠 보안 정책 (CSP)
{{#ref}} ../../pentesting-web/content-security-policy-csp-bypass/ {{#endref}}
신뢰할 수 있는 유형
CSP를 통해 신뢰할 수 있는 유형을 강제함으로써, 애플리케이션은 DOM XSS 공격으로부터 보호될 수 있습니다. 신뢰할 수 있는 유형은 특정 보안 정책을 준수하는 특별히 제작된 객체만 위험한 웹 API 호출에 사용될 수 있도록 보장하여, 기본적으로 JavaScript 코드를 안전하게 만듭니다.
// Feature detection
if (window.trustedTypes && trustedTypes.createPolicy) {
// Name and create a policy
const policy = trustedTypes.createPolicy('escapePolicy', {
createHTML: str => str.replace(/\</g, '<').replace(/>/g, '>');
});
}
// Assignment of raw strings is blocked, ensuring safety.
el.innerHTML = "some string" // Throws an exception.
const escaped = policy.createHTML("<img src=x onerror=alert(1)>")
el.innerHTML = escaped // Results in safe assignment.
X-Content-Type-Options
이 헤더는 MIME 타입 스니핑을 방지하며, 이는 XSS 취약점으로 이어질 수 있는 행위입니다. 이 헤더는 브라우저가 서버에서 지정한 MIME 타입을 준수하도록 보장합니다.
X-Content-Type-Options: nosniff
X-Frame-Options
클릭재킹을 방지하기 위해, 이 헤더는 문서가 <frame>, <iframe>, <embed>, 또는 <object> 태그에 어떻게 포함될 수 있는지를 제한하며, 모든 문서가 자신의 포함 권한을 명시적으로 지정할 것을 권장합니다.
X-Frame-Options: DENY
Cross-Origin Resource Policy (CORP) and Cross-Origin Resource Sharing (CORS)
CORP는 웹사이트가 로드할 수 있는 리소스를 지정하는 데 중요하며, 교차 사이트 누수를 완화합니다. CORS는 반면에 더 유연한 교차 출처 리소스 공유 메커니즘을 허용하며, 특정 조건 하에 동일 출처 정책을 완화합니다.
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와 유사한 공격의 위험을 크게 줄입니다. 이들은 각각 교차 출처 리소스의 로딩과 교차 출처 창과의 상호작용을 제어합니다.
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin-allow-popups
HTTP Strict Transport Security (HSTS)
마지막으로, HSTS는 브라우저가 서버와 오직 안전한 HTTPS 연결을 통해서만 통신하도록 강제하는 보안 기능으로, 개인 정보 보호와 보안을 강화합니다.
Strict-Transport-Security: max-age=3153600
References
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
- https://web.dev/security-headers/
- https://web.dev/articles/security-headers
{{#include ../../banners/hacktricks-training.md}}