ID |
---|
WSTG-INFO-05 |
程序员在他们的源代码中包含详细的注释和元数据是很常见的,甚至建议这样做。但是,HTML 代码中包含的注释和元数据可能会泄露潜在攻击者不应获得的内部信息。应进行注释和元数据审查,以确定是否有任何信息被泄露。此外,某些应用程序可能会泄漏重定向响应正文中的信息。
对于现代 Web 应用程序,在前端使用客户端 JavaScript 正变得越来越流行。流行的前端构造技术使用客户端JavaScript,如ReactJS,AngularJS或Vue。与HTML代码中的注释和元数据类似,许多程序员也在前端的JavaScript变量中对敏感信息进行硬编码。敏感信息可以包括(但不限于):私有 API 密钥(例如不受限制的 Google 地图 API 密钥)、内部 IP 地址、敏感路由(例如指向隐藏管理页面或功能的路由),甚至凭据。这些敏感信息可以从此类前端 JavaScript 代码中泄露。应进行审查,以确定是否有任何敏感信息泄露,可能被攻击者用于滥用。
对于大型 Web 应用程序,性能问题是程序员非常关心的问题。程序员使用不同的方法来优化前端性能,包括语法上很棒的样式表(Sass),Sassy CSS(SCSS),webpack等。使用这些技术,前端代码有时会变得难以理解和调试,因此,程序员经常部署源映射文件以进行调试。“源映射”是一个特殊文件,它将资产的缩小/丑化版本(CSS或JavaScript)连接到原始创作版本。程序员仍在争论是否将源映射文件引入生产环境。但是,不可否认的是,源映射文件或用于调试的文件如果发布到生产环境,将使其源文件更易于人类阅读。它可以使攻击者更容易从前端查找漏洞或从前端收集敏感信息。应该进行JavaScript代码审查,以确定是否有任何调试文件从前端公开。根据项目的上下文和敏感性,安全专家应决定文件是否应存在于生产环境中。
开发人员经常使用 HTML 注释来包含有关应用程序的调试信息。有时,他们会忘记注释并将其留在生产环境中。测试人员应查找以
div>
...
测试人员甚至可能会发现这样的东西:
检查 HTML 版本信息以获取有效的版本号和数据类型定义 (DTD) URL
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
strict.dtd
– default strict DTD(默认)loose.dtd
– loose DTD(松散)frameset.dtd
– DTD for frameset documents(文档的框架集)某些META
标签不提供主动攻击媒介,而是允许攻击者分析应用程序:
<META name="Author" content="Andrew Muller">
一个常见的(但不符合 WCAG)标记是刷新。 (但不符合 WCAG compliant) 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">
尽管大多数 Web 服务器通过robots.txt
文件管理搜索引擎索引,但它也可以通过 META
标签进行管理。下面的标签将建议机器人不要索引,也不要跟踪包含标签的HTML页面上的链接。
<META name="robots" content="none">
互联网内容选择平台Platform for Internet Content Selection (PICS) 和 Web 描述资源协议 Protocol for Web Description Resources (POWDER) 为将元数据与互联网内容相关联提供了基础设施。
程序员经常在前端使用 JavaScript 变量对敏感信息进行硬编码。测试人员应该检查HTML源代码,并在 和
标签之间寻找JavaScript代码。测试人员还应该识别外部JavaScript文件来审查代码(JavaScript文件具有JavaScript文件的文件扩展名
.js
和名称,通常放在 标签的
src
(source)属性中)。
检查 JavaScript 代码是否存在任何敏感信息泄漏,攻击者可能会利用这些信息进一步滥用或操纵系统。查找以下值:API 密钥、内部 IP 地址、敏感路由或凭据。例如:
const myS3Credentials = {
accessKeyId: config('AWSS3AccessKeyID'),
secretAccessKey: config('AWSS3SecretAccessKey'),
};
测试人员甚至可能会发现这样的东西:
var conString = "tcp://postgres:1234@localhost/postgres";
找到 API 密钥后,测试人员可以检查 API 密钥限制是按服务设置的,还是按 IP、HTTP 引荐来源网址、应用程序、SDK 等设置的。
例如,如果测试人员找到 Google 地图 API 密钥,他们可以检查此 API 密钥是否受 IP 限制或仅根据 Google 地图 API 进行限制。如果Google API Key仅根据Google Map API受到限制,攻击者仍然可以使用该API密钥查询不受限制的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)看到。