# 如何发现并利用信息泄露漏洞

在本节中，我们将就一些技术和工具提供实用的建议，以帮助你在各种场景中识别信息泄露。我们还提供了一些实验，让你可以练习提取不同类型的信息，这些信息可以被用作进一步攻击的一部分。

* 测试信息泄露漏洞
* 常见的信息泄露源

## 如何测试信息泄露漏洞

通常来说，在测试过程中不要陷入“视野狭窄”，这一点很重要。换句话说，应避免过于狭窄地关注某个特定的漏洞。敏感数据可能会泄漏在各种地方，因此重要的是，不要错过任何可能在后期有用的信息。你会经常在测试其他内容时发现敏感数据。一个关键的技能就是无论何时何地，都能够识别出遇到的有趣的信息。

以下是一些高级技术和工具的示例，你可以在测试过程中使用它们来帮助识别信息泄漏漏洞。

* 模糊测试
* 使用Burp Scanner
* 使用Burp的Engagement工具
* 制定富有信息量的响应

### 模糊测试

如果你识别出了有趣的参数，可以尝试提交非预期的数据类型和特制的模糊字符串，观察其效果。请仔细注意，尽管有时响应会明确地泄露出有趣的信息，但它们也可能更微妙地暗示应用程序的行为。例如，这可能表现为处理请求所需时间的细微差异。即使错误消息的内容没有泄露任何信息，但有时遇到一种错误而不是另一种错误这一事实本身就是有用的信息。

可以使用Burp Intruder之类的工具自动化这个过程的大部分。这样做有几个好处。最明显的是，你可以：

* 将有效载荷位置添加到参数，并使用预制的模糊字符串词列来快速连续地测试大量不同的输入。
* 通过比较HTTP状态码、响应时间、长度等，轻松识别响应中的差异。
* 使用grep匹配规则来快速识别关键词的出现，比如`error`、`invalid`、`SELECT`、`SQL`等等。
* 应用grep提取规则，提取和比较响应中有趣条目的内容。

你还可以使用BApp商店提供的[Logger++](https://portswigger.net/bappstore/470b7057b86f41c396a97903377f3d81)扩展。除了记录所有来自Burp工具的请求和响应，它还允许你定义高级过滤，高亮显示有趣的条目。这只是众多可以帮助你找到网站泄露的敏感数据的Burp扩展之一。

### 使用Burp Scanner

Burp Suite Professional用户可以使用Burp Scanner。它提供实时扫描功能，可以在你浏览时审计项目，或者你可以安排自动扫描来爬取和审计目标站点。这两种方法都会自动为你标记出诸多信息泄露漏洞。例如，如果Burp Scanner发现响应中含有敏感信息，如私钥、电子邮件地址和信用卡号，会向你发出警告。它还会识别备份文件、目录浏览等。

### 使用Burp的Engagement工具

Burp提供了几种Engagement工具，你可以使用它们更轻松地在目标网站中找到有趣的信息。可以从上下文菜单中访问Engagement工具，只需右击HTTP消息、Burp代理入口或站点地图中的项目，然后选择“Engagement tools”。

以下工具在这种情况下尤其有用。

#### Search

你可以使用此工具在所选项目中查找任何表达式。你可以使用各种高级搜索选项，如正则表达式搜索或否定搜索，对结果进行微调。这对于快速查找感兴趣的特定关键词的出现（或缺失）非常有用。

#### Find comments

你可以使用该工具快速提取所选项目中发现的开发人员注释。它还提供了选项卡，可立即访问发现的每个注释的HTTP请求/响应循环。

#### Discover content

你可以使用这个工具来识别未链接到网站可见内容的额外内容和功能。这对于查找不一定会自动出现在站点地图中的额外目录和文件非常有用。

### 制定富有信息量的响应

尽管在正常的测试工作流程中，详细的错误消息有时会泄露出一些有趣的信息。但通过研究错误消息如何根据你的输入而变化，你可以更进一步深入了解。在某些情况下，你可以通过错误消息操纵网站，从而提取任意数据。

根据遇到的具体情况，有多种方法可以做到这一点。一个常见的例子是让应用程序逻辑尝试对特定数据项进行无效操作。例如，提交一个无效的参数值可能会导致堆栈跟踪或调试响应，其中包含有趣的细节。有时，你可以通过引发错误消息，使响应中泄露你想要的数据值。

## 常见的信息泄露源

信息泄露可能发生在网站的各种不同情境中。以下是一些常见的示例，你可以查看这些地方是否暴露了敏感信息。

* Web爬虫文件
* 目录浏览
* 开发人员注释
* 错误消息
* 调试数据
* 用户账户页面
* 备份文件
* 不安全的配置
* 版本控制历史

### Web爬虫文件

很多网站提供`/robots.txt`和`/sitemap.xml`文件，以帮助爬虫导航其站点。这些文件通常会列出爬虫应跳过的特定目录，因为这些目录可能包含敏感信息。

鉴于这些文件通常不在网站内链接，它们可能不会立即出现在Burp的站点地图中。然而，值得尝试手动导航到`/robots.txt`或`/sitemap.xml`，看看是否能找到有用的信息。

### 目录浏览

Web服务器可以被配置为自动列出没有索引页面的目录的内容。这可以帮助攻击者快速识别给定路径下的资源，并直接对这些资源进行分析和攻击。尤其是，它会增加目录内不打算让用户访问的敏感文件的暴露程度，比如临时文件和崩溃转储文件。

目录浏览本身不一定是一个安全漏洞。但如果网站也没有实现适当的访问控制，那么以这种方式泄露敏感资源的存在和位置显然是一个问题。

### 开发人员注释

在开发过程中，有时会在标记中添加行内HTML注释。在将更改部署到生产环境之前，这些注释通常会被去除。然而，有时可能会忘记、遗漏注释，甚至是故意留下注释，因为有人可能没有完全意识到其安全影响。尽管这些注释在渲染页面上不可见，但是可以很容易地使用Burp，甚至浏览器内置的开发者工具来访问它们。

有时，这些注释包含对攻击者有用的信息。比如，它们可能暗示隐藏目录的存在，或者提供关于应用程序逻辑的线索。

### 错误消息

详细的错误消息是信息泄露最常见的原因之一。一般来说，你应该密切关注在审计过程中遇到的所有错误消息。

错误消息的内容可以显示有关给定参数预期的输入或数据类型的信息。这样可以帮助你通过识别可利用的参数来缩小攻击范围。它甚至可以防止你浪费时间试图注入根本不起作用的有效载荷。

详细的错误消息还可以提供有关网站使用的不同技术的信息。例如，它们可能会明确地指出网站正在使用的模板引擎、数据库类型或服务器，以及其版本号。这些信息可能很有用，因为你可以轻松地搜索该版本可能存在的任何已记录的攻击手段。同样，你还可以检查是否存在常见的配置错误或危险的默认设置，以便利用这些漏洞。其中一些可能会在官方文档中有所强调。

你也可能发现网站正在使用某种开源框架。在这种情况下，你可以研究公开可用的源代码，这是构造自己的攻击手段的宝贵资源。

错误消息之间的差异也可以揭示后台发生的不同的应用程序行为。观察错误消息的差异是许多技术的一个关键要素，如SQL注入、用户名枚举等等。

> **LAB**
>
> [错误消息中的信息泄露](https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-in-error-messages)

### 调试数据

出于调试目的，许多网站都会生成自定义错误消息和日志，其中包含大量有关应用程序行为的信息。虽然这些信息在开发过程中是很有用的，但如果它在生产环境中泄露，对于攻击者也是极其有用的。

调试信息有时可能包含开发攻击所需的重要信息，包括：

* 可通过用户输入操作的关键会话变量值
* 后端组件的主机名和凭据
* 服务器上的文件和目录名
* 用于加密通过客户端传输的数据的密钥

调试消息有时会记录在一个单独的文件中。如果攻击者能够访问该文件，它可以作为了解应用程序运行时状态的有用参考。它还可以提供一些线索，说明攻击者如何提供精心设计的输入来操纵应用状态，并控制接收到的信息。

> **LAB**
>
> [调试页面上的信息泄露](https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-on-debug-page)

### 用户账户页面

就其本质而言，用户的个人资料或账户页面通常包含敏感信息，如用户的电子邮件地址、电话号码、API密钥等。由于用户通常只能访问自己的账户页面，因此这本身并不代表漏洞。然而，一些网站包含逻辑缺陷，可能允许攻击者利用这些页面查看其他用户的数据。

例如，考虑一个网站，该网站根据`user`参数来确定加载哪个用户的账户页面。

```http
GET /user/personal-info?user=carlos
```

大多数网站会采取措施防止攻击者简单地更改此参数以访问任意用户的账户页面。然而，有时加载个别数据项的逻辑并不那么健壮。

攻击者可能无法完全加载其他用户的账户页面，但是获取和呈现用户注册的电子邮件地址的逻辑可能不会检查`user`参数是否与当前登录的用户匹配。在这种情况下，只需更改`user`参数就会使攻击者能够在自己的账户页面上显示任意用户的电子邮件地址。

我们在介绍访问控制和IDOR漏洞时，会更详细地研究这类漏洞。

> **阅读更多**
>
> [访问控制](/wsa/server-side/access-control.md)

### 通过备份文件泄露源代码

获取源代码访问权使攻击者更容易理解应用程序的行为并构造高危的攻击。敏感数据有时甚至被硬编码在源代码中。典型的例子包括用于访问后端组件的API密钥和凭据。

如果你可以识别出正在使用特定的开源技术，则可以轻松访问有限数量的源代码。

有时，甚至可以使网站暴露其自己的源代码。当对一个网站进行映射时，你可能会发现一些源代码文件被明确引用。不幸的是，请求它们通常不会显示代码本身。当服务器处理具有特定后缀名的文件（如`.php`），它通常会执行代码，而不是简单地将其作为文本发送到客户端。但是，在某些情况下，你可以欺骗网站，使其返回文件的内容。例如，文本编辑器在编辑原始文件时经常会生成临时备份文件。这些临时文件通常以某种方式表示，比如在文件名后添加波浪号（`~`）或添加不同的文件后缀名。通过使用备份文件后缀名请求代码文件，有时可以允许你在响应中读取文件的内容。

> **LAB**
>
> [通过备份文件泄露源代码](https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-via-backup-files)

一旦攻击者获取了源代码的访问权，这将是朝着识别和利用其他几乎不可能的漏洞迈出的巨大一步。这样的一个例子就是不安全的反序列化。我们稍后会在专门的主题中讨论此漏洞。

> **阅读更多**
>
> [不安全的反序列化](/wsa/advanced/deserialization.md)

### 由于不安全配置导致的信息泄露

网站有时会因配置不当而变得易受攻击。这是由于第三方技术的广泛使用，其大量的配置选项并不一定被实施者很好地理解。

在其他情况下，开发人员可能会忘记在生产环境中禁用各种调试选项。例如，HTTP `TRACE`方法是为诊断目的而设计的。如果启用，Web服务器将会响应使用`TRACE`方法的请求，并在响应中回显接收到的确切请求。这种行为通常是无害的，但偶尔会导致信息泄露，如通过反向代理附加到请求中的内部认证头的名称。

> **LAB**
>
> [通过信息泄露进行认证绕过](https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-authentication-bypass)

### 版本控制历史

几乎所有的网站都使用某种版本控制系统进行开发，比如Git。默认情况下，Git项目将所有的版本控制数据存储在一个叫做`.git`的文件夹中。有时，一些网站会在生产环境中暴露此目录。在这种情况下，你可能只需浏览到`/.git`就能访问到它。

虽然手动浏览原始文件结构和内容通常是不切实际的，但是有各种方法可以下载整个`.git`目录。然后，可以使用本地安装的Git打开它，以获取网站的版本控制历史。其中可能包括已提交的更改和其他有趣信息的日志。

这样可能无法让你访问到完整的源代码，但比较diff将允许你阅读简单片段的代码。和任何源代码一样，你也可能在一些已更改的行中找到硬编码的敏感数据。

> **LAB**
>
> [版本控制历史中的信息泄露](https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-in-version-control-history)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://web-sec.gitbook.io/wsa/server-side/information-disclosure/exploiting.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
