针对 Web Security Scanner 的发现结果进行补救

本页介绍如何解读、重现和修复 Web Security Scanner 的发现结果。

Security Command Center 的 IAM 角色可以在组织、文件夹或项目级层授予。您能否查看、修改、创建或更新发现结果、资产和安全来源,取决于您获授予的访问权限级别。如需详细了解 Security Command Center 角色,请参阅访问权限控制

漏洞类型

Web Security Scanner 可检测以下类型的漏洞:

  • 跨站脚本攻击 (XSS)
  • 服务器端请求伪造
  • Flash 注入
  • 混合内容
  • 过时或易受攻击的库
  • 明文密码
  • 不安全的来源验证
  • 无效的标头
  • 拼写有误的标头
  • 可访问的代码库
  • SQL 注入
  • XML 注入
  • 污染原型

如果发现其中的任何漏洞,会突出显示该结果,以便您探索详细信息。

对日志的影响

Web Security Scanner 扫描痕迹会显示在您的日志文件中。例如,Web Security Scanner 针对异常字符串(如 ~sfi9876/sfi9876)生成请求。此过程可让扫描检查应用的错误页面。这些有意生成的无效网页请求会显示在您的日志中。

修复后停用发现结果

修复漏洞后,Web Security Scanner 不会自动将相应 Security Command Center 发现结果的状态设置为 INACTIVE。除非您手动更改状态,否则 Security Command Center 中 Web Security Scanner 生成的发现结果状态将保持 ACTIVE

如果您使用的是独立版本的 Web Security Scanner,则在您修复漏洞且 Web Security Scanner 检测不到此漏洞后,后续漏洞报告不会包含此漏洞。漏洞的记录仍保留在过去的漏洞报告中。

Web Security Scanner 每周运行一次代管式扫描。

如需详细了解 Web Security Scanner 扫描,请参阅扫描类型

针对 Web Security Scanner 的发现结果进行补救

本部分介绍如何修复不同类型的 Web Security Scanner 发现结果。如需了解防御 OWASP 十大应用中常见的应用级攻击的策略,请参阅 OWASP 十大缓解选项

XSS

API 中的类别名称:XSS

Web Security Scanner 跨站脚本攻击(XSS)注入测试通过将良性测试字符串插入用户可修改的字段,然后执行各种用户操作,来模拟注入攻击。在此测试期间,自定义检测器会观察浏览器和 DOM,以确定注入是否成功并评估其被利用的可能性。

如果测试字符串中包含的 JavaScript 顺畅执行,则会启动 Chrome 调试器。 当测试字符串能够执行时,可以在网页上注入并运行 JavaScript。如果攻击者发现了这个问题,那么就可以在用户(受害者)点击恶意链接时冒充该用户来执行由攻击者所选择的 JavaScript。

在某些情况下,所测试的应用可能会在浏览器解析测试字符串之前修改测试字符串。例如,应用可能会验证输入或限制字段的大小。当浏览器尝试运行此修改后的测试字符串时,它可能会中断并抛出 JavaScript 执行错误。该错误表明存在注入问题,但可能无法利用它。

要解决此问题,您需要手动验证测试字符串修改是否可以绕过,以确认问题是否为 XSS 漏洞。如要详细了解如何验证此漏洞,请参阅跨站脚本攻击

有多种方法可以解决此问题。推荐方法是转义所有输出并使用支持上下文自动转义的模板系统。

XSS angular callback

API 中的类别名称:XSS_ANGULAR_CALLBACK

当 Angular 插入用户提供的字符串时,AngularJS 模块中会出现跨站脚本攻击 (XSS) 漏洞。将用户提供的值注入 AngularJS 插值可能会允许以下攻击:

  • 攻击者可以将任意代码注入浏览器呈现的页面中。
  • 攻击者可以从页面的起始点,代表受害者浏览器执行操作。

要重现此潜在漏洞,请在运行扫描后点击 Google Cloud 控制台中的“再现网址”链接。此链接会直接打开提醒对话框,或注入字符串 XSSDETECTED 来证明该攻击可以执行代码。如果注入了字符串,您可以打开浏览器的开发者工具,并搜索 XSSDETECTED 以查找注入的确切位置。

XSS error

API 中的类别名称:XSS_ERROR

XSS_ERROR 发现结果是 JavaScript 中断导致的 XSS 错误。在某些情况下,所测试的应用可能会在浏览器解析测试字符串之前修改测试字符串。当浏览器尝试运行此修改后的测试字符串时,它可能会中断并抛出 JavaScript 执行错误。此错误表明存在注入问题,但可能无法利用它

要解决此问题,您需要手动验证测试字符串修改是否可以绕过,以确认问题是否为 XSS 漏洞。如要详细了解如何验证此漏洞,请参阅跨站脚本攻击

Server side request forgery

API 中的类别名称:SERVER_SIDE_REQUEST_FORGERY

SERVER_SIDE_REQUEST_FORGERY 漏洞可让 Web 应用用户强制服务器向受限的服务端点发出请求(例如 HTTP 请求),从而获得访问内部数据的权限。例如,攻击者可以利用此漏洞从 Google Cloud 元数据服务中检索数据。

如需解决此问题,请使用许可名单限制 Web 应用可以向其发出请求的网域和 IP 地址。

Rosetta flash

API 中的类别名称:ROSETTA_FLASH

Web Security Scanner 可能会发现请求参数的值反映在响应开头,例如在使用 JSONP 的请求中。此漏洞也称为 Flash 注入。在某些情况下,攻击者可能会使浏览器误以为该响应是易受攻击的网页应用所提供的 Flash 文件而加以执行。

如要解决此问题,请不要在 HTTP 响应开头添加可由用户控制的数据。

Mixed content

API 中的类别名称:MIXED_CONTENT

Web Security Scanner 可以被动地观察 HTTP 流量,在 HTTPS 页面的环境中,还可以检测通过 HTTP 执行对 JavaScript 或 CSS 文件的请求的情况。在此场景中,中间人攻击者可以篡改 HTTP 资源,从而获取对加载资源或监控用户所执行操作的网站的完全访问权限。

如要解决此问题,请使用相对 HTTP 链接,例如,将 http:// 替换为 //

Outdated library

API 中的类别名称:OUTDATED_LIBRARY

Web Security Scanner 可能会发现所包含的库版本存在安全问题。Web Security Scanner 是一种基于签名的扫描程序,其会尝试识别正在使用的库的版本,并根据已知的易受攻击库列表进行检查。如果版本检测失败或用户已经手动修补了库,则可能出现误报。

如需解决此问题,请更新到所添加的库的已知安全版本。

Struts insecure deserialization

API 中的类别名称:STRUTS_INSECURE_DESERIALIZATION

Web Security Scanner 可能会发现您的 Web 应用使用的 Apache Struts 版本容易受到远程命令注入攻击。受影响的 Struts 版本错误地解析攻击者的无效的 Content-Type HTTP 标头。此漏洞可让恶意命令以网络服务器的权限执行。

以下是易受攻击的 Apache Struts 版本:

  • 低于 2.3.32 的 2.3.x 版本
  • 低于 2.5.10.1 的 2.5.x 版本

如需解决此问题,请将 Apache Strut 升级到最新版本。

如需详细了解 Apache Struts 漏洞,请参阅 CVE-2017-5638

Cacheable password input

API 中的类别名称:CACHEABLE_PASSWORD_INPUT

Web Security Scanner 可能会发现对于密码输入,Web 应用使用未将 type 属性设置为 password<input> 元素。这会导致浏览器在常规浏览器缓存(而不是安全的密码存储)中缓存用户输入的密码。

如需解决此问题,请在 <input> 元素中添加 type 属性并将其设置为 password,例如 <input type="password">。此属性会隐藏用户在密码字段中输入的字符。

Clear text password

API 中的类别名称:CLEAR_TEXT_PASSWORD

Web Security Scanner 可能会发现应用似乎在以明文形式传输密码字段。攻击者可以监听网络流量并嗅探密码字段。

要保护客户端与服务器之间传递的敏感信息,请始终采取以下预防措施:

  • 使用 TLS/SSL 证书。
  • 始终在包含密码字段的页面上使用 HTTPS。
  • 确保表单操作属性始终指向 HTTPS 网址。

Insecure allow origin ends with validation

API 中的类别名称:INSECURE_ALLOW_ORIGIN_ENDS_WITH_VALIDATION

Web Security Scanner 可能会发现跨网站 HTTP 或 HTTPS 端点仅验证 Origin 请求标头的后缀,然后将其呈现在 Access-Control-Allow-Origin 响应标头内。如果验证配置错误,则端点可能会授予对与列入许可名单的网域具有相同后缀的恶意网域的访问权限。例如,如果端点的验证器与 *google.com 等网域匹配,则可能会错误地授予对 maliciousdomaingoogle.com 的访问权限。

如需解决此问题,请先验证预期根域名是否是 Origin 标头值的一部分,然后再将其呈现在 Access-Control-Allow-Origin 响应标头内。对于子网域通配符,请在根域名前面附加英文句点,例如 .endsWith(".google.com")

Insecure allow origin starts with validation

API 中的类别名称:INSECURE_ALLOW_ORIGIN_STARTS_WITH_VALIDATION

Web Security Scanner 可能会发现跨网站 HTTP 或 HTTPS 端点仅验证 Origin 请求标头的前缀,然后将其呈现在 Access-Control-Allow-Origin 响应标头内。如果验证配置错误,则端点可能会授予对与列入许可名单的网域具有相同前缀的恶意网域的访问权限。例如,如果端点的验证器仅检查请求的网域是否包含 google.com,它可能会错误地授予对 google.com.maliciousdomain.com 的访问权限。

如需解决此发现结果,请先验证预期域名是否与 Origin 标头值完全匹配,然后再将其呈现在 Access-Control-Allow-Origin 响应标头内,例如 .equals(".google.com")

Session ID leak

API 中的类别名称:SESSION_ID_LEAK

Web Security Scanner 可能会在 Web 应用的跨网域请求的 Referer 请求标头中发现会话标识符。接收 Referer 的网域可以使用该会话标识符来假冒用户(使用其令牌)或唯一标识用户。

如需解决此发现结果,请将会话标识符存储在 Cookie 中,而不是存储在网址中。此外,请使用以下属性保护您的 Cookie:

  • HTTPOnly:使客户端脚本无法访问 Cookie 的属性
  • Secure:让 Cookie 只能通过 HTTPS 传输的属性

Invalid content type

API 中的类别名称:INVALID_CONTENT_TYPE

Web Security Scanner 发现加载的资源与响应的 Content-Type HTTP 标头不匹配。在这种情况下,应用将返回内容类型无效或不含 X-Content-Type-Options: nosniff 标头的敏感内容。

如需解决此问题,请确保满足以下各项:

  • JSON 响应以 Content-Type 标头 application/json 形式传送
  • 其他敏感的响应以适当的 MIME 类型提供
  • 使用 HTTP 标头 X-Content-Type-Options: nosniff 传送内容

Invalid header

API 中的类别名称:INVALID_HEADER

Web Security Scanner 可能会发现安全标头具有语法错误,从而导致格式错误或值无效。因此,浏览器会忽略这些标头。

以下部分将介绍有效的标头。

Referrer-Policy 标头

有效的引荐来源网址政策 包含以下值之一:

  • 一个空白字符串
  • no-referrer
  • no-referrer-when-downgrade
  • same-origin
  • origin
  • strict-origin
  • origin-when-cross-origin
  • strict-origin-when-cross-origin
  • unsafe-url

X-Frame-Options 标头

有效的 X-Frame-Options 标头只能包含以下值:

  • DENY:禁止所有框架
  • SAMEORIGIN:如果顶级网址的来源相同,则允许加框架
  • ALLOW-FROM URL

Chrome 不支持 ALLOW-FROM URL。不允许使用多个 X-Frame-Options。

X-Content-Type-Options 标头

有效的 X-Content-Type-Options 标头只能具有一个值:nosniff

X-XSS-Protection 标头

有效的 X-XSS-Protection 标头必须以 0(“禁用”)或 1(“启用”)开头。然后,仅当您启用保护时,最多可以添加两个选项:

  • mode=block 会显示空白页面,而不是过滤 XSS
  • report=URL 将报告发送到 URL

使用分号分隔,例如 1; mode=block; report=URI。请确保没有分号。

Misspelled security header name

API 中的类别名称:MISSPELLED_SECURITY_HEADER_NAME

Web Security Scanner 可能会发现拼写错误的安全标头名称。拼写错误的安全标头无效且必须加以修复。

要重现此漏洞,请检查浏览器开发者工具的网络标签中的拼写错误。

Mismatching security header values

API 中的类别名称:MISMATCHING_SECURITY_HEADER_VALUES

Web Security Scanner 可能会发现响应中包含重复的安全相关响应标头,且这些标头中包含相互冲突的值。如果在响应中使用不匹配的值对一些与安全相关的 HTTP 标头声明两次,则这些标头具有未定义的行为。

如需解决此问题,请从不匹配的标头中选择一个进行保留。

可访问的代码库

Web Security Scanner 可能会在应用中找到可访问的 GIT 或 SVN 代码库。这种情况可能会导致配置和源代码泄露。

要重现此漏洞,请点击查找结果报告中的重现网址。

XXE reflected file leakage

API 中的类别名称:XXE_REFLECTED_FILE_LEAKAGE

Web Security Scanner 可能会在 Web 应用上找到 XML 外部实体 (XXE) 漏洞,该 Web 应用从用户输入中解析 XML。攻击者可以提供包含外部实体的 XML。此外部实体可以引用应用有权访问的内容,例如,应用宿主机上的文件。如果应用的 XML 解析器处理恶意 XML,则可能会泄露其主机上文件的内容。

如需解决此发现结果,请配置 XML 解析器以禁止外部实体。

如需详细了解此漏洞,请参阅 XML 外部实体 (XXE) 处理

SQL injection

API 中的类别名称:SQL_INJECTION

Web Security Scanner 可能会发现 SQL 注入漏洞。攻击者可以创建输入来操纵在服务器上运行的底层 SQL 查询的查询结构。这些输入可让其从数据库中外泄数据,在某些情况下还可修改数据。如需解决此发现结果,请使用参数化查询以防止用户输入影响 SQL 查询的结构。

如需详细了解此漏洞,请参阅 SQL 注入

Prototype pollution

API 中的类别名称:PROTOTYPE_POLLUTION

Web Security Scanner 可能会在其对象属性被分配有攻击者可控制值的 Web 应用中发现原型污染漏洞。攻击者可以创建输入,使应用容易受到跨站脚本攻击或其他客户端漏洞的攻击。

如需修复此发现结果,请删除已废弃的 proto 属性,并使 Object.prototype 对象不可变。如果此缓解措施与您的代码不兼容,请更改易受攻击的代码部分,以便仅从攻击者可控制的输入中复制预期的值。

验证问题

当 Web Security Scanner 报告问题时,您需要验证问题的位置。本部分介绍了如何使用查找报告来重现和验证漏洞。

  1. 转到 Google Cloud 控制台中的 Web Security Scanner 页面。

    转到 Web Security Scanner

  2. 选择一个项目。此时会显示一个页面,其中包含您的代管式和自定义扫描。

  3. 扫描配置下,选择包含待验证发现的扫描。此时将打开一个页面,其中包含扫描详情。

  4. 转到结果标签页,展开某个类别,然后选择一项结果即可查看其详细信息。

  5. 验证方法因发现类别而异。使用测试浏览器,然后按照以下说明操作。

    • 跨网站脚本:在再现网址后,浏览器会在浏览器中生成一个空白弹出式窗口,表示扫描成功将良性代码注入到脚本中。
    • 过时的库:在 Vulnerable 网址 后,会返回文本为“Exploited”的页面,这表示扫描成功将良性代码注入到脚本中。
    • 混合内容HTTPS 网页网址后,系统会返回有关混合内容漏洞的警告。发现报告在通过 HTTP 提供的资源的网址下识别易受攻击的资源。
    • Flash 注入:Web Security Scanner 可能会返回此类别中的结果,但大多数现代浏览器都可以防范 flash 注入。这些发现结果不太可能被人利用。
    • 原型污染:跟踪重现网址字段中的网址,并搜索由载荷引入的 Object.prototype 对象上的更改,并使用以下 JavaScript 代码段。
      • ({}).__secret_injected_property
      • ({}).__defineGetter__.__secret_injected_property
      • ({}).hasOwnProperty.__secret_injected_property

执行内容安全政策 (CSP) 可能仍会阻止 JavaScript 代码运行。这种情况使重现 XSS 更加困难。如果您遇到此问题,请查看浏览器日志控制台,详细了解已发生的 CSP 违规行为。