hacktricks/network-services-pentesting/pentesting-web/special-http-headers.md
2023-08-03 19:12:22 +00:00

16 KiB
Raw Blame History

特殊的HTTP头部

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

字典和工具

更改位置的头部

重写IP源

  • 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
  • X-ProxyUser-Ip: 127.0.0.1
  • Via: 1.0 fred, 1.1 127.0.0.1
  • Connection: close, X-Forwarded-For (检查逐跳头部)

重写位置

  • X-Original-URL: /admin/console
  • X-Rewrite-URL: /admin/console

逐跳头部

逐跳头部是设计为由当前处理请求的代理服务器处理和消耗的头部,而不是端到端头部。

  • Connection: close, X-Forwarded-For

{% content-ref url="../../pentesting-web/abusing-hop-by-hop-headers.md" %} abusing-hop-by-hop-headers.md {% endcontent-ref %}

HTTP请求走私

  • Content-Length: 30
  • Transfer-Encoding: chunked

{% content-ref url="../../pentesting-web/http-request-smuggling/" %} http-request-smuggling {% endcontent-ref %}

缓存头部

服务器缓存头部

  • 响应中的**X-Cache可能具有值miss,表示请求未被缓存,值hit**表示已被缓存
  • **Cache-Control**指示资源是否被缓存以及下次资源将被再次缓存的时间:Cache-Control: public, max-age=1800
  • Vary通常在响应中使用,指示其他头部被视为缓存键的一部分,即使它们通常不是键控的。
  • **Age**定义了对象在代理缓存中的时间(以秒为单位)。
  • **Server-Timing: cdn-cache; desc=HIT**还表示资源已被缓存

{% content-ref url="../../pentesting-web/cache-deception.md" %} cache-deception.md {% endcontent-ref %}

本地缓存头部

  • 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"

条件语句

  • 使用这些头部的请求:If-Modified-SinceIf-Unmodified-Since,只有当响应头部的 Last-Modified 包含不同的时间时,才会返回数据。
  • 使用 If-MatchIf-None-Match 的条件请求使用 Etag 值因此只有当数据Etag发生变化时Web 服务器才会发送响应的内容。Etag 是从 HTTP 响应中获取的。
  • Etag 值通常是基于响应内容进行计算的。例如,ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI" 表示 Etag 是响应内容的 37 字节Sha1 值。

范围请求

  • Accept-Ranges:指示服务器是否支持范围请求,以及范围可以用哪种单位表示。Accept-Ranges: <range-unit>
  • Range:指示服务器应该返回文档的哪个部分。
  • If-Range:创建一个条件范围请求,只有当给定的 Etag 或日期与远程资源匹配时才会满足。用于防止从不兼容版本的资源下载两个范围。
  • Content-Range:指示部分消息在完整消息体中的位置。

消息体信息

  • Content-Length:资源的大小,以十进制字节数表示。
  • Content-Type:指示资源的媒体类型。
  • Content-Encoding:用于指定压缩算法。
  • Content-Language:描述面向受众的人类语言,以便允许用户根据自己的首选语言进行区分。
  • Content-Location:指示返回数据的备用位置。

从渗透测试的角度来看,这些信息通常是“无用的”,但如果资源受到 401 或 403 的保护,并且您可以找到某种方法来获取这些信息,那么这可能是有趣的。
例如,使用 HEAD 请求中的 RangeEtag 的组合可以通过 HEAD 请求泄漏页面的内容:

  • 使用头部 Range: bytes=20-20 的请求,并且响应包含 ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y",则泄漏了字节 20 的 SHA1 值为 ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y

服务器信息

  • Server: Apache/2.4.1 (Unix)
  • X-Powered-By: PHP/5.3.3

控制

  • Allow:列出资源支持的方法集。Allow: GET, POST, HEAD
  • ExpectExpect HTTP 请求头部指示服务器需要满足的期望,以正确处理请求。
  • 目前除了 Expect: 100-continue 之外,没有指定其他期望。通知接收者客户端即将发送一个(可能很大的)消息体,并希望接收到 100Continue的中间响应。

下载

  • Content-Disposition:在常规的 HTTP 响应中,Content-Disposition 响应头部是一个指示内容是否预期在浏览器中以 inline 的方式显示,即作为网页的一部分或整个网页,或者作为 attachment 下载并本地保存的头部。
  • Content-Disposition: attachment; filename="filename.jpg"

安全头部

内容安全策略CSP

{% content-ref url="../../pentesting-web/content-security-policy-csp-bypass/" %} content-security-policy-csp-bypass {% endcontent-ref %}

受信任类型Trusted Types

受信任类型提供了编写、安全审查和维护无 DOM XSS 的应用程序的工具。它们可以通过 CSP 启用,并通过限制危险的 Web API 仅接受特殊对象(受信任类型)来使 JavaScript 代码默认安全。

要创建这些对象,您可以定义安全策略,在其中可以确保在将数据写入 DOM 之前始终应用安全规则(如转义或清理)。这些策略是代码中唯一可能引入 DOM XSS 的地方。

Content-Security-Policy: require-trusted-types-for 'script'
// Feature detection
if (window.trustedTypes && trustedTypes.createPolicy) {
// Name and create a policy
const policy = trustedTypes.createPolicy('escapePolicy', {
createHTML: str => {
return str.replace(/\</g, '&lt;').replace(/>/g, '&gt;');
}
});
}
// Assignment of raw strings is blocked by Trusted Types.
el.innerHTML = 'some string'; // This throws an exception.

// Assignment of Trusted Types is accepted safely.
const escaped = policy.createHTML('<img src=x onerror=alert(1)>');
el.innerHTML = escaped;  // '&lt;img src=x onerror=alert(1)&gt;'

X-Content-Type-Options

当恶意的HTML文档从您的域名中提供服务时例如如果上传到照片服务的图像包含有效的HTML标记某些浏览器将将其视为活动文档并允许其在应用程序的上下文中执行脚本从而导致跨站脚本漏洞

X-Content-Type-Options: nosniff 通过指示浏览器对给定响应的Content-Type头中设置的MIME类型是正确的,从而防止此问题。建议在所有资源中使用此头。

X-Content-Type-Options: nosniff

X-Frame-Options

如果恶意网站可以将您的网站嵌入到iframe中这可能允许攻击者通过点击劫持来引发用户的意外操作。此外,在某些情况下,Spectre类型的攻击给恶意网站提供了了解嵌入文档内容的机会。

X-Frame-Options指示浏览器是否允许在<frame><iframe><embed><object>中呈现页面。建议所有文档发送此头部,以指示它们是否允许被其他文档嵌入。

如果您需要更精细的控制,例如只允许特定来源嵌入文档,请使用CSP frame-ancestors指令。

X-Frame-Options: DENY

跨源资源策略 (CORP)

攻击者可以通过利用基于Web的跨站泄漏来嵌入来自另一个源的资源,例如来自您的网站的资源,以了解有关它们的信息。

Cross-Origin-Resource-Policy 通过指示可以加载它的网站集合来减轻此风险。该标头可以采用以下三个值之一:same-originsame-sitecross-origin。建议所有资源发送此标头,以指示它们是否允许其他网站加载。

Cross-Origin-Resource-Policy: same-origin

跨源资源策略CORB

它有助于减轻侧信道攻击包括Spectre的威胁。它旨在防止浏览器将可能包含敏感信息且对现有网络功能不必要的跨源网络响应传递给网页。
同样它还有助于减轻跨站脚本包含XSSI漏洞。
例如,它将阻止从<script>或<img>标签请求的跨源text/html响应并将其替换为空响应。这是站点隔离中包含的保护措施的重要部分。

跨源打开策略COOP

攻击者的网站可以通过利用基于Web的跨站泄漏来在弹出窗口中打开另一个站点以获取有关其的信息。在某些情况下,这也可能导致基于Spectre的侧信道攻击。

Cross-Origin-Opener-Policy头部提供了一种方式,使文档能够与通过window.open()或没有rel="noopener"的带有target="_blank"的链接打开的跨源窗口隔离。因此,文档的任何跨源打开者都无法引用它并且无法与其交互。

Cross-Origin-Opener-Policy: same-origin-allow-popups

跨源资源共享CORS

与本文中的其他内容不同跨源资源共享CORS不是一个头部而是一种浏览器机制用于请求和允许访问跨源资源。

默认情况下,浏览器通过同源策略来防止网页访问跨源资源。例如当加载跨源图像时即使在网页上可视化显示页面上的JavaScript也无法访问图像的数据。资源提供者可以通过CORS选择性地放宽限制允许其他网站读取资源。

Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true

跨域嵌入策略COEP

为了减少Spectre攻击窃取跨域资源的能力,默认情况下禁用了SharedArrayBufferperformance.measureUserAgentSpecificMemory()等功能。

Cross-Origin-Embedder-Policy: require-corp阻止文档和工作线程加载跨域资源如图像、脚本、样式表、iframe等除非这些资源通过CORSCORP头部明确选择加载。COEP可以与Cross-Origin-Opener-Policy结合使用,将文档选择为跨域隔离

当您希望为文档启用跨域隔离时,请使用Cross-Origin-Embedder-Policy: require-corp

Cross-Origin-Embedder-Policy: require-corp

HTTP严格传输安全HSTS

通过普通的HTTP连接进行通信是未加密的使得传输的数据可以被网络级别的窃听者访问。

Strict-Transport-Security头部告知浏览器不应该使用HTTP加载网站而应该使用HTTPS。一旦设置了该头部浏览器将在头部定义的时间段内无需重定向直接使用HTTPS访问该域名。

Strict-Transport-Security: max-age=3153600

资源

☁️ HackTricks 云 ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥