【缺陷周话】第36期:弱验证
字数 1465 2025-08-18 11:38:41

弱验证缺陷分析与防护指南

1. 弱验证概述

弱验证是指由于应用程序验证不足导致浏览器执行恶意代码的安全缺陷。当不受信任的数据进入Web应用程序时,如果应用程序仅依靠不足的HTML、XML或其他类型编码验证,未能有效阻止Web浏览器解析可执行内容(如JavaScript、HTML标记、HTML属性、鼠标事件、Flash、ActiveX等),就会产生此类漏洞。

相关CWE条目

  • CWE ID 82: 网页中IMG标签属性的脚本不当中和
  • CWE ID 83: 网页中属性的脚本不当中和
  • CWE ID 87: 替代XSS语法的不当中和
  • CWE ID 692: 针对跨站脚本的不完整黑名单

2. 弱验证的危害

弱验证主要导致跨站脚本攻击(XSS),其危害包括:

  • 蠕虫传播
  • 帐户泄露
  • Cookie劫持
  • 伪造用户请求
  • 破坏机密信息
  • 在用户系统上执行恶意代码

2019年1-5月相关漏洞统计:CVE中共记录了668个与弱验证相关的漏洞,包括:

  • CVE-2019-9709: Mahara集合标题XSS漏洞
  • CVE-2019-1852: Cisco Prime网络注册器XSS漏洞
  • CVE-2019-1701: Cisco ASA和FTD软件WebVPN服务XSS漏洞

3. 缺陷代码分析

示例代码(BenchmarkTest00002.java)

// 获取请求中的所有Cookie
Cookie[] theCookies = request.getCookies();

// 遍历Cookie
for (Cookie theCookie : theCookies) {
    if ("BenchmarkTest00002".equals(theCookie.getName())) {
        // 对Cookie值进行UTF-8解码
        param = java.net.URLDecoder.decode(theCookie.getValue(), "UTF-8");
        break;
    }
}

// 拼接文件名
String fileName = org.owasp.benchmark.helpers.Utils.testfileDir + param;

// 输出到页面
response.getWriter().println(
    "File: '" + org.owasp.esapi.ESAPI.encoder().encodeForHTML(fileName) + "' created."
);

缺陷点分析

  1. 不受信任数据源:Cookie值(param)来自用户输入,不受信任
  2. 验证不足:仅对最终拼接的fileName进行HTML编码
  3. 潜在XSS风险:当Cookie中包含<script>或``标签时,浏览器会将其解析为可执行内容

4. 修复方案

修复后的代码

// 获取并解码Cookie值后,添加白名单过滤
param = org.owasp.esapi.ESAPI.encoder().canonicalize(param);
param = org.owasp.esapi.ESAPI.encoder().encodeForHTML(param);

// 拼接文件名
String fileName = org.owasp.benchmark.helpers.Utils.testfileDir + param;

// 输出到页面
response.getWriter().println(
    "File: '" + org.owasp.esapi.ESAPI.encoder().encodeForHTML(fileName) + "' created."
);

修复要点

  1. 规范化输入:使用canonicalize()处理输入
  2. 白名单过滤:对param进行HTML编码
  3. 防御深度:多层防护(输入过滤+输出编码)

5. 防护措施

1. 输入验证

  • 实施严格的数据类型验证(如年龄只能是数字)
  • 对特殊字符进行过滤:<, >, ', ", javascript标签等
  • 使用正则表达式进行格式验证

2. 输出编码

根据数据在HTML中的位置采用不同的编码方式:

上下文位置 编码方法
HTML标签内容 encodeForHTML()
HTML属性值 encodeForHTMLAttribute()
JavaScript代码 encodeForJavaScript()
CSS值 encodeForCSS()
URL参数 encodeForURL()

3. 安全配置

  • 设置HttpOnly属性防止Cookie劫持
  • 使用Content-Security-Policy头限制脚本执行
  • 启用X-XSS-Protection

4. 安全开发实践

  • 采用安全编码框架(如OWASP ESAPI)
  • 实施安全开发生命周期(SDL)
  • 进行代码审计和安全测试

6. 工具支持

使用奇安信代码卫士等静态分析工具可以:

  1. 自动检测弱验证缺陷
  2. 定位漏洞代码位置
  3. 评估漏洞风险等级
  4. 验证修复效果

7. 总结

弱验证是Web应用常见的高风险漏洞,通过实施严格的输入验证、适当的输出编码和全面的安全配置,可以有效预防此类安全问题。开发人员应当将安全防护措施融入开发流程的各个阶段,而非仅依赖后期的安全测试。

弱验证缺陷分析与防护指南 1. 弱验证概述 弱验证是指由于应用程序验证不足导致浏览器执行恶意代码的安全缺陷。当不受信任的数据进入Web应用程序时,如果应用程序仅依靠不足的HTML、XML或其他类型编码验证,未能有效阻止Web浏览器解析可执行内容(如JavaScript、HTML标记、HTML属性、鼠标事件、Flash、ActiveX等),就会产生此类漏洞。 相关CWE条目 CWE ID 82 : 网页中IMG标签属性的脚本不当中和 CWE ID 83 : 网页中属性的脚本不当中和 CWE ID 87 : 替代XSS语法的不当中和 CWE ID 692 : 针对跨站脚本的不完整黑名单 2. 弱验证的危害 弱验证主要导致跨站脚本攻击(XSS),其危害包括: 蠕虫传播 帐户泄露 Cookie劫持 伪造用户请求 破坏机密信息 在用户系统上执行恶意代码 2019年1-5月相关漏洞统计 :CVE中共记录了668个与弱验证相关的漏洞,包括: CVE-2019-9709 : Mahara集合标题XSS漏洞 CVE-2019-1852 : Cisco Prime网络注册器XSS漏洞 CVE-2019-1701 : Cisco ASA和FTD软件WebVPN服务XSS漏洞 3. 缺陷代码分析 示例代码(BenchmarkTest00002.java) 缺陷点分析 不受信任数据源 :Cookie值( param )来自用户输入,不受信任 验证不足 :仅对最终拼接的 fileName 进行HTML编码 潜在XSS风险 :当Cookie中包含 <script> 或 `` 标签时,浏览器会将其解析为可执行内容 4. 修复方案 修复后的代码 修复要点 规范化输入 :使用 canonicalize() 处理输入 白名单过滤 :对 param 进行HTML编码 防御深度 :多层防护(输入过滤+输出编码) 5. 防护措施 1. 输入验证 实施严格的数据类型验证(如年龄只能是数字) 对特殊字符进行过滤: < , > , ' , " , javascript 标签等 使用正则表达式进行格式验证 2. 输出编码 根据数据在HTML中的位置采用不同的编码方式: | 上下文位置 | 编码方法 | |------------|---------| | HTML标签内容 | encodeForHTML() | | HTML属性值 | encodeForHTMLAttribute() | | JavaScript代码 | encodeForJavaScript() | | CSS值 | encodeForCSS() | | URL参数 | encodeForURL() | 3. 安全配置 设置 HttpOnly 属性防止Cookie劫持 使用 Content-Security-Policy 头限制脚本执行 启用 X-XSS-Protection 头 4. 安全开发实践 采用安全编码框架(如OWASP ESAPI) 实施安全开发生命周期(SDL) 进行代码审计和安全测试 6. 工具支持 使用 奇安信代码卫士 等静态分析工具可以: 自动检测弱验证缺陷 定位漏洞代码位置 评估漏洞风险等级 验证修复效果 7. 总结 弱验证是Web应用常见的高风险漏洞,通过实施严格的输入验证、适当的输出编码和全面的安全配置,可以有效预防此类安全问题。开发人员应当将安全防护措施融入开发流程的各个阶段,而非仅依赖后期的安全测试。