SV.TAINTED.XSS.REFLECTED

跨站点脚本漏洞

此检查器会报告 CGI 脚本的潜在跨站点脚本问题(使用公共网关接口的 Web 服务器)。尤其是,每当通过调用 getenv() 函数把从 QUERY_STRING 环境变量接收到的受污染字符串,传递到将其写入 stdout 流的函数时,此检查器都会报告缺陷。

漏洞与风险

跨站点脚本 (XSS) 是一种 Web 应用程序安全漏洞。跨站点脚本攻击使攻击者能够将来自其他站点的脚本注入合法 Web 页面。在 Web 服务器程序中,将 HTTP 请求直接传递到 Web 页面可能会导致出现跨站点脚本漏洞的反射用例场景。

缓解与预防

缓解反射式跨站脚本问题取决于不受信任的数据在生成的 HTML 页面上的插入位置。通常,运用转义不受信任数据这个操作对 HTML 元素内容效果很好(类似于本说明文档中的修正示例)。然而,有关如何防止跨站脚本的完整信息,请参阅 OWASP 说明文档

漏洞代码示例

复制
   #include <iostream>
   #include <string>
   using namespace std;
   void vulnerableServer() {
      string query = getenv("QUERY_STRING");
      cout << "Viewing query ";
      cout << query << endl;    
   }

在以上示例中,攻击者可以在查询中插入脚本。当显示在 Web 页面上时,该脚本会开始运行并可以从系统收集敏感信息。

Klocwork 在第 7 行生成 SV.TAINTED.XSS.REFLECTED 缺陷,这表示“通过在第 5 行调用 getenv,从 QUERY_STRING 环境变量接收到了未经验证的字符串 query,并在第 7 行通过 cout 写入到 stdout。这可能造成出现跨站点脚本漏洞。”

修正代码示例

复制
   #include <iostream>
   #include <string>
   using namespace std;
   string validate(string &query);
   void secureServer() {
      string query = getenv("QUERY_STRING");
      cout << "Viewing query ";
      string validated_query = validate(query);
      cout << validated_query << endl;    
  }

在此示例中,检查器不会报告缺陷 SV.TAINTED.XSS.REFLECTED,因为受污染的字符串 query 已在第 8 行得到验证。第 8 行的 validate() 函数是一个自定义实现的函数(原型位于第 4 行)。此函数会对查询字符串中的特殊字符进行转义,以防出现跨站点脚本。这是消除潜在跨站点脚本的便捷方法。

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。

扩展

此检查器可通过 Klocwork 知识库进行扩展,以便
  • 运用规范字段 TSCheckXSS,指定可清除查询字符串的函数
  • 运用规范字段 TSSinkXSS,指定可以写入 stdout 流的函数

有关详情,请参阅 调整 C/C++ 分析 。