Special HTTP headers

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기

Wordlists & Tools

Headers to Change Location

Rewrite IP source:

  • X-Originating-IP: 127.0.0.1
  • X-Forwarded-For: 127.0.0.1
  • X-Forwarded: 127.0.0.1
  • Forwarded-For: 127.0.0.1
  • X-Forwarded-Host: 127.0.0.1
  • X-Remote-IP: 127.0.0.1
  • X-Remote-Addr: 127.0.0.1
  • X-ProxyUser-Ip: 127.0.0.1
  • X-Original-URL: 127.0.0.1
  • Client-IP: 127.0.0.1
  • X-Client-IP: 127.0.0.1
  • X-Host: 127.0.0.1
  • True-Client-IP: 127.0.0.1
  • Cluster-Client-IP: 127.0.0.1
  • Via: 1.0 fred, 1.1 127.0.0.1
  • Connection: close, X-Forwarded-For (Check hop-by-hop headers)

Rewrite location:

  • X-Original-URL: /admin/console
  • X-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: 30
  • Transfer-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 GMT
  • Pragma: no-cacheCache-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"Etag37 바이트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 코드를 안전하게 만듭니다.

javascript
// Feature detection
if (window.trustedTypes && trustedTypes.createPolicy) {
// Name and create a policy
const policy = trustedTypes.createPolicy('escapePolicy', {
createHTML: str => str.replace(/\</g, '&lt;').replace(/>/g, '&gt;');
});
}
javascript
// 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

Header Name Casing Bypass

HTTP/1.1은 헤더 필드 이름을 대소문자 구분 없음으로 정의합니다 (RFC 9110 §5.1). 그럼에도 불구하고, 대소문자를 정규화하지 않고 수신된 리터럴 헤더 이름을 비교하는 사용자 정의 미들웨어, 보안 필터 또는 비즈니스 로직을 찾는 것은 매우 일반적입니다 (예: header.equals("CamelExecCommandExecutable")). 이러한 검사가 대소문자 구분으로 수행되면, 공격자는 다른 대문자 사용으로 동일한 헤더를 보내어 이를 우회할 수 있습니다.

이 실수가 발생하는 전형적인 상황:

  • 요청이 민감한 구성 요소에 도달하기 전에 “위험한” 내부 헤더를 차단하려고 하는 사용자 정의 허용/거부 목록.
  • 역방향 프록시 의사 헤더의 사내 구현 (예: X-Forwarded-For 정화).
  • 관리 / 디버그 엔드포인트를 노출하고 인증 또는 명령 선택을 위해 헤더 이름에 의존하는 프레임워크.

Abusing the bypass

  1. 서버 측에서 필터링되거나 검증되는 헤더를 식별합니다 (예: 소스 코드, 문서 또는 오류 메시지를 읽어).
  2. 다른 대소문자로 동일한 헤더를 보냅니다 (혼합 대소문자 또는 대문자). HTTP 스택은 일반적으로 사용자 코드가 실행된 후에만 헤더를 정규화하므로, 취약한 검사를 건너뛸 수 있습니다.
  3. 하위 구성 요소가 헤더를 대소문자 구분 없이 처리하면 (대부분 그렇습니다), 공격자가 제어하는 값을 수락합니다.

Example: Apache Camel exec RCE (CVE-2025-27636)

취약한 버전의 Apache Camel에서 Command Center 라우트는 CamelExecCommandExecutableCamelExecCommandArgs 헤더를 제거하여 신뢰할 수 없는 요청을 차단하려고 합니다. 비교는 equals()로 수행되었으므로 정확한 소문자 이름만 제거되었습니다.

bash
# Bypass the filter by using mixed-case header names and execute `ls /` on the host
curl "http://<IP>/command-center" \
-H "CAmelExecCommandExecutable: ls" \
-H "CAmelExecCommandArgs: /"

헤더는 필터링되지 않은 상태로 exec 구성 요소에 도달하여 Camel 프로세스의 권한으로 원격 명령 실행을 초래합니다.

탐지 및 완화

  • 모든 헤더 이름을 단일 대소문자(일반적으로 소문자)로 정규화합니다 before 허용/거부 비교를 수행하기 전에.
  • 의심스러운 중복을 거부합니다: Header:HeAdEr:가 모두 존재하는 경우 이를 이상으로 간주합니다.
  • 정규화 after 후에 시행되는 긍정적인 허용 목록을 사용합니다.
  • 관리 엔드포인트를 인증 및 네트워크 분할로 보호합니다.

참조

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기