1.5审查网页内容是否存在信息泄露
概括
程序员在他们的源代码中包含详细的注释和元数据是很常见的,甚至是被推荐的。但是,HTML 代码中包含的注释和元数据可能会泄露潜在攻击者不应获得的内部信息。应该进行评论和元数据审查以确定是否有任何信息被泄露。此外,某些应用程序可能会在重定向响应正文中泄露信息。
对于现代网络应用程序,前端使用客户端 JavaScript 变得越来越流行。流行的前端构建技术使用客户端 JavaScript,如 ReactJS、AngularJS 或 Vue。与 HTML 代码中的注释和元数据类似,许多程序员也将敏感信息硬编码在前端的 JavaScript 变量中。敏感信息可以包括(但不限于):私有 API 密钥(_例如_不受限制的 Google Map API 密钥)、内部 IP 地址、敏感路由(_例如_到隐藏管理页面或功能的路由),甚至凭据。这些敏感信息可能会从此类前端 JavaScript 代码中泄露。应进行审查,以确定是否有任何敏感信息泄露,可能被攻击者滥用。
对于大型网络应用程序,性能问题是程序员非常关心的问题。程序员使用了不同的方法来优化前端性能,包括 Syntactically Awesome Style Sheets (SASS)、Sassy CSS (SCSS)、webpack 等。使用这些技术,前端代码有时会变得更难理解和难以调试,正因为如此,程序员经常部署源映射文件以进行调试。“源地图”是一种特殊文件,它将资产(CSS 或 JavaScript)的缩小/丑化版本连接到原始创作版本。程序员仍在争论是否将源映射文件带到生产环境中。但是,不可否认的是,如果将源映射文件或用于调试的文件发布到生产环境中,将使它们的源代码更具可读性。它可以使攻击者更容易从前端发现漏洞或从中收集敏感信息。应该进行 JavaScript 代码审查以确定是否有任何调试文件从前端公开。根据项目的上下文和敏感性,安全专家应决定文件是否应存在于生产环境中。
测试目标
- 查看网页评论、元数据和重定向正文以发现任何信息泄漏。
- 收集 JavaScript 文件并查看 JS 代码,以更好地了解应用程序并查找任何信息泄漏。
- 确定源映射文件或其他前端调试文件是否存在。
如何测试
查看网页评论和元数据
开发人员经常使用 HTML 注释来包含有关应用程序的调试信息。有时,他们会忘记评论并将其留在生产环境中。测试人员应该寻找以 开头的 HTML 注释<!--
。
检查 HTML 源代码中包含敏感信息的注释,这些信息可以帮助攻击者更深入地了解应用程序。它可能是 SQL 代码、用户名和密码、内部 IP 地址或调试信息。
...
<div class="table2">
<div class="col1">1</div><div class="col2">Mary</div>
<div class="col1">2</div><div class="col2">Peter</div>
<div class="col1">3</div><div class="col2">Joe</div>
<!-- Query: SELECT id, name FROM app.users WHERE active='1' -->
</div>
...
测试人员甚至可能会发现这样的东西:
<!-- Use the DB administrator password for testing: f@keP@a$$w0rD -->
检查 HTML 版本信息以获取有效的版本号和数据类型定义 (DTD) URL
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
strict.dtd
– 默认严格 DTDloose.dtd
– 宽松的 DTDframeset.dtd
– 框架集文档的 DTD
有些META
标签不提供主动攻击向量,而是允许攻击者分析应用程序:
<META name="Author" content="Andrew Muller">
一个常见的(但不符合WCAG)META
标签是Refresh。
<META http-equiv="Refresh" content="15;URL=https://www.owasp.org/index.html">
标签的一个常见用途META
是指定搜索引擎可以用来提高搜索结果质量的关键字。
<META name="keywords" lang="en-us" content="OWASP, security, sunshine, lollipops">
虽然大多数网络服务器通过文件来管理搜索引擎索引robots.txt
,但也可以通过META
标签来管理。下面的标签将建议机器人不要编制索引,也不要跟踪包含该标签的 HTML 页面上的链接。
<META name="robots" content="none">
互联网内容选择平台 (PICS)和网络描述资源协议 (POWDER)提供了将元数据与互联网内容相关联的基础设施。
识别 JavaScript 代码并收集 JavaScript 文件
程序员经常在前端使用 JavaScript 变量对敏感信息进行硬编码。<script>
测试人员应该检查 HTML 源代码并在和标记之间寻找 JavaScript 代码</script>
。测试人员还应该识别外部 JavaScript 文件以审查代码(JavaScript 文件的文件扩展名.js
和 JavaScript 文件的名称通常放在标签的src
(source) 属性中)。<script>
检查 JavaScript 代码是否存在任何敏感信息泄漏,攻击者可以利用这些信息进一步滥用或操纵系统。查找以下值:API 密钥、内部 IP 地址、敏感路由或凭据。例如:
const myS3Credentials = {
accessKeyId: config('AWSS3AccessKeyID'),
secretAcccessKey: config('AWSS3SecretAccessKey'),
};
测试人员甚至可能会发现这样的东西:
var conString = "tcp://postgres:1234@localhost/postgres";
找到 API 密钥后,测试人员可以检查 API 密钥限制是按服务设置的,还是按 IP、HTTP 引荐来源网址、应用程序、SDK 等设置的。
例如,如果测试人员找到 Google Map API 密钥,他们可以检查此 API 密钥是受 IP 限制还是仅受 Google Map API 限制。如果 Google API Key 仅根据 Google Map API 受到限制,攻击者仍然可以使用该 API Key 查询不受限制的 Google Map API,应用程序所有者必须为此付费。
<script type="application/json">
...
{"GOOGLE_MAP_API_KEY":"AIzaSyDUEBnKgwiqMNpDplT6ozE4Z0XxuAbqDi4", "RECAPTCHA_KEY":"6LcPscEUiAAAAHOwwM3fGvIx9rsPYUq62uRhGjJ0"}
...
</script>
在某些情况下,测试人员可能会从 JavaScript 代码中找到敏感路径,例如指向内部或隐藏管理页面的链接。
<script type="application/json">
...
"runtimeConfig":{"BASE_URL_VOUCHER_API":"https://staging-voucher.victim.net/api", "BASE_BACKOFFICE_API":"https://10.10.10.2/api", "ADMIN_PAGE":"/hidden_administrator"}
...
</script>
识别源映射文件
源映射文件通常会在 DevTools 打开时加载。测试人员还可以通过在每个外部 JavaScript 文件的扩展名后添加“.map”扩展名来查找源映射文件。例如,如果测试人员看到一个/static/js/main.chunk.js
文件,他们可以通过访问/static/js/main.chunk.js.map
.
检查源映射文件中是否有任何敏感信息可以帮助攻击者更深入地了解应用程序。例如:
{
"version": 3,
"file": "static/js/main.chunk.js",
"sources": [
"/home/sysadmin/cashsystem/src/actions/index.js",
"/home/sysadmin/cashsystem/src/actions/reportAction.js",
"/home/sysadmin/cashsystem/src/actions/cashoutAction.js",
"/home/sysadmin/cashsystem/src/actions/userAction.js",
"..."
],
"..."
}
当网站加载源映射文件时,前端源代码将变得可读且更易于调试。
识别泄漏信息的重定向响应
尽管重定向响应通常不会包含任何重要的 Web 内容,但不能保证它们不会包含任何内容。因此,虽然 300 系列(重定向)响应通常包含“重定向到https://example.com/
”类型的内容,但它们也可能会泄露内容。
考虑重定向响应是身份验证或授权检查的结果的情况,如果该检查失败,服务器可能会响应将用户重定向回“安全”或“默认”页面,但重定向响应本身可能仍包含内容它没有在浏览器中显示,但确实传输给了客户端。这可以通过利用浏览器开发人员工具或通过个人代理(例如 ZAP、Burp、Fiddler 或 Charles)来实现。
工具
参考
- 钥匙黑客
- RingZer0 在线 CTF - 挑战 104 “管理面板”。