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

247 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 特殊的HTTP头部
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks的衣物**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我在**推特**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>
## 字典和工具
* [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)
## 更改位置的头部
重写**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](../../pentesting-web/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](../../pentesting-web/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](../../pentesting-web/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-cache`与`Cache-Control: no-cache`相同
* `Warning`**`Warning`**通用HTTP头部包含有关消息状态可能存在的问题的信息。一个响应中可能会出现多个`Warning`头部。`Warning: 110 anderson/1.3.37 "Response is stale"`
## 条件语句
* 使用这些头部的请求:**`If-Modified-Since`** 和 **`If-Unmodified-Since`**,只有当响应头部的 **`Last-Modified`** 包含不同的时间时,才会返回数据。
* 使用 **`If-Match`** 和 **`If-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 请求中的 **`Range`** 和 **`Etag`** 的组合可以通过 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`
* **`Expect`****`Expect`** HTTP 请求头部指示服务器需要满足的期望,以正确处理请求。
* 目前除了 `Expect: 100-continue` 之外,没有指定其他期望。通知接收者客户端即将发送一个(可能很大的)消息体,并希望接收到 [`100`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/100)Continue的中间响应。
## 下载
* **`Content-Disposition`**:在常规的 HTTP 响应中,**`Content-Disposition`** 响应头部是一个指示内容是否预期在浏览器中以 _inline_ 的方式显示,即作为网页的一部分或整个网页,或者作为 _attachment_ 下载并本地保存的头部。
* `Content-Disposition: attachment; filename="filename.jpg"`
## 安全头部
### 内容安全策略CSP<a href="#csp" id="csp"></a>
{% content-ref url="../../pentesting-web/content-security-policy-csp-bypass/" %}
[content-security-policy-csp-bypass](../../pentesting-web/content-security-policy-csp-bypass/)
{% endcontent-ref %}
### 受信任类型Trusted Types<a href="#tt" id="tt"></a>
受信任类型提供了编写、安全审查和维护无 DOM XSS 的应用程序的工具。它们可以通过 [CSP](https://web.dev/security-headers/#csp) 启用,并通过限制危险的 Web API 仅接受特殊对象(受信任类型)来使 JavaScript 代码默认安全。
要创建这些对象,您可以定义安全策略,在其中可以确保在将数据写入 DOM 之前始终应用安全规则(如转义或清理)。这些策略是代码中唯一可能引入 DOM XSS 的地方。
```http
Content-Security-Policy: require-trusted-types-for 'script'
```
```javascript
// 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;');
}
});
}
```
```javascript
// 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 <a href="#xcto" id="xcto"></a>
当恶意的HTML文档从您的域名中提供服务时例如如果上传到照片服务的图像包含有效的HTML标记某些浏览器将将其视为活动文档并允许其在应用程序的上下文中执行脚本从而导致[跨站脚本漏洞](https://www.google.com/about/appsecurity/learning/xss/)。
`X-Content-Type-Options: nosniff` 通过指示浏览器对给定响应的`Content-Type`头中设置的[MIME类型](https://mimesniff.spec.whatwg.org/#introduction)是正确的,从而防止此问题。建议在**所有资源**中使用此头。
```http
X-Content-Type-Options: nosniff
```
### X-Frame-Options <a href="#xfo" id="xfo"></a>
如果恶意网站可以将您的网站嵌入到iframe中这可能允许攻击者通过[点击劫持](https://portswigger.net/web-security/clickjacking)来引发用户的意外操作。此外,在某些情况下,[Spectre类型的攻击](https://en.wikipedia.org/wiki/Spectre\_\(security\_vulnerability\))给恶意网站提供了了解嵌入文档内容的机会。
`X-Frame-Options`指示浏览器是否允许在`<frame>`、`<iframe>`、`<embed>`或`<object>`中呈现页面。**建议所有文档**发送此头部,以指示它们是否允许被其他文档嵌入。
如果您需要更精细的控制,例如只允许特定来源嵌入文档,请使用[CSP](https://web.dev/security-headers/#csp) [`frame-ancestors`](https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors)指令。
```http
X-Frame-Options: DENY
```
### 跨源资源策略 (CORP) <a href="#corp" id="corp"></a>
攻击者可以通过利用基于Web的[跨站泄漏](https://xsleaks.dev)来嵌入来自另一个源的资源,例如来自您的网站的资源,以了解有关它们的信息。
`Cross-Origin-Resource-Policy` 通过指示可以加载它的网站集合来减轻此风险。该标头可以采用以下三个值之一:`same-origin`、`same-site` 和 `cross-origin`。建议**所有资源**发送此标头,以指示它们是否允许其他网站加载。
```
Cross-Origin-Resource-Policy: same-origin
```
### 跨源资源策略CORB<a href="#corp" id="corp"></a>
它有助于减轻侧信道攻击包括Spectre的威胁。它旨在防止浏览器将**可能包含敏感信息且对现有网络功能不必要的跨源网络响应**传递给网页。\
同样它还有助于减轻跨站脚本包含XSSI漏洞。\
例如,它将阻止从\<script>或\<img>标签请求的跨源text/html响应并将其替换为空响应。这是[站点隔离](https://www.chromium.org/Home/chromium-security/site-isolation)中包含的保护措施的重要部分。
### 跨源打开策略COOP<a href="#coop" id="coop"></a>
攻击者的网站可以通过利用基于Web的[跨站泄漏](https://xsleaks.dev)来在弹出窗口中打开另一个站点以获取有关其的信息。在某些情况下,这也可能导致基于[Spectre](https://en.wikipedia.org/wiki/Spectre\_\(security\_vulnerability\))的侧信道攻击。
`Cross-Origin-Opener-Policy`头部提供了一种方式,使文档能够与通过`window.open()`或没有`rel="noopener"`的带有`target="_blank"`的链接打开的跨源窗口隔离。因此,文档的任何跨源打开者都无法引用它并且无法与其交互。
```http
Cross-Origin-Opener-Policy: same-origin-allow-popups
```
### 跨源资源共享CORS<a href="#cors" id="cors"></a>
与本文中的其他内容不同跨源资源共享CORS不是一个头部而是一种浏览器机制用于请求和允许访问跨源资源。
默认情况下,浏览器通过[同源策略](https://web.dev/same-origin-policy/)来防止网页访问跨源资源。例如当加载跨源图像时即使在网页上可视化显示页面上的JavaScript也无法访问图像的数据。资源提供者可以通过CORS选择性地放宽限制允许其他网站读取资源。
```http
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
```
### 跨域嵌入策略COEP<a href="#coep" id="coep"></a>
为了减少[Spectre攻击](https://en.wikipedia.org/wiki/Spectre\_\(security\_vulnerability\))窃取跨域资源的能力,默认情况下禁用了`SharedArrayBuffer`或`performance.measureUserAgentSpecificMemory()`等功能。
`Cross-Origin-Embedder-Policy: require-corp`阻止文档和工作线程加载跨域资源如图像、脚本、样式表、iframe等除非这些资源通过[CORS](https://web.dev/security-headers/#cors)或[CORP](https://web.dev/security-headers/#corp)头部明确选择加载。COEP可以与`Cross-Origin-Opener-Policy`结合使用,将文档选择为[跨域隔离](https://web.dev/cross-origin-isolation-guide/)。
当您希望为文档启用[跨域隔离](https://web.dev/coop-coep/)时,请使用`Cross-Origin-Embedder-Policy: require-corp`。
```http
Cross-Origin-Embedder-Policy: require-corp
```
### HTTP严格传输安全HSTS<a href="#hsts" id="hsts"></a>
通过普通的HTTP连接进行通信是未加密的使得传输的数据可以被网络级别的窃听者访问。
`Strict-Transport-Security`头部告知浏览器不应该使用HTTP加载网站而应该使用HTTPS。一旦设置了该头部浏览器将在头部定义的时间段内无需重定向直接使用HTTPS访问该域名。
```http
Strict-Transport-Security: max-age=3153600
```
## 资源
* [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/)
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks 云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗?想要在 HackTricks 中**宣传你的公司**吗?或者想要**获取最新版本的 PEASS 或下载 HackTricks 的 PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **通过向**[**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
</details>