评估您的 Web 应用程序的安全性
网站正在从静态 HTML 转向动态交互式 Web 应用程序。正是动态交互式 Web 应用程序使互联网成为通用媒介。Web 应用程序为网站带来了新的风险级别。这些 Web 应用程序的安全性对于网站的安全性至关重要。
对来自互联网的安全威胁的意识正在提高安全技术的采用率。部署防火墙是许多组织采用的标准第一步。防火墙可以防御许多针对网络和系统基础设施的攻击。此外,一些防火墙提供过滤功能,并包含入站恶意 Java 和 Active-X 应用程序。但是,防火墙对于防御针对合法应用程序的入站恶意请求几乎无济于事。基于 Web 的应用程序由于互联网的普及而非常流行。提供对客户信息、用户个人资料、财务记录和健康记录的访问是 Web 应用程序可以提供的服务的常见示例。最常见的情况是,这些应用程序访问后端数据库,为用户提供动态生成的内容。设计时没有考虑安全性的应用程序可能会导致数据完整性、可用性、机密性和隐私的丢失。
大多数 Web 应用程序测试可以分为静态或动态。静态测试涉及手动检查源代码并自动测试危险结构。另一方面,动态测试涉及执行 Web 应用程序以检测意外输入时的异常行为。本文的重点是动态测试。
一些信息寻求者心怀恶意。黑客有时能够预料到程序员采用的不足之处和编码实践。通常,“快速上市”的态度促使应用程序开发人员忽略标准和安全的编码实践。这在电子商务环境中尤其如此,在电子商务环境中,诸如变更管理之类的标准实践经常被忽视。因此,安全通常是事后才考虑的。通常,这会导致应用程序的第一个版本容易受到攻击。修复漏洞的过程相当昂贵。
不同开发环境中的代码模板和示例为开发人员提供了一种实现所需功能的方法。但是,这些代码片段可能没有考虑到应用程序安全性。恶意用户有时只需查看 Web 应用程序生成的 HTML 代码即可识别开发环境。注释和一些 HTML 标记可以提供有关开发环境的信息。在识别开发环境后,恶意用户能够利用可能已使用示例或模板的漏洞。
另一个常见的漏洞利用领域是应用程序维护会话状态信息的方式。超文本传输协议 (HTTP) 本身是无状态的。Cookie 通常用于在后续 HTTP 请求之间维护状态信息。Cookie 只是 Web 应用程序服务器写入浏览器的一组字符串。它们用于维护会话状态、记住密码和用户名,以及用于个性化和配置功能。恶意用户可能会劫持未实施强会话控制的应用程序。
应用程序漏洞很重要,因为它们允许访问机密信息,例如信用卡号、帐号或姓名以及客户列表,而无需闯入 Web 服务器。恶意用户和普通用户之间的区别在于意图。
在最近一起震惊在线社区的事件中,一名黑客在一个公共网站上发布了多达 25,000 个被盗信用卡号(请参阅“资源”)。这些号码是从 CD Universe 网站上被盗的。黑客声称拥有来自该网站的超过 300,000 个信用卡号。此外,黑客声称信用卡号泄露的原因是用于处理信用卡交易的软件存在缺陷。您有风险吗?这取决于。如果出现以下情况,您可能会有风险
您是一家大型公司,吸引了许多用户访问您的公司网站。
您刚刚发布了一份声明,吹嘘您网站的安全性。
您正在完成并在市场上发布新产品。
您是一家金融机构。
您是一个政府组织。
您是许多知识相关或数据服务的提供商。
您是一个电子商务网站。
如果您不属于上述任何类别,您仍然可能容易受到攻击。如果发生泄露,只有您组织的数据分类策略和丢失数据的价值才能决定损害的程度。就在去年,网站破坏的数量增加了 900% 以上(请参阅“资源”)。这可能会导致尴尬和不必要的媒体曝光。一些上市公司由于其网站的安全漏洞而导致股票价值下跌。
现在我们在理论上了解了恶意用户的想法。我们也对谁可能面临风险有了一些了解。本文的其余部分将重点介绍网站开发人员在保护组织资产方面可以实施的安全问题和措施。这很重要,因为网站管理员无法轻松强制执行客户端安全措施。接下来是与安全相关的风险列表和描述。
Cookie 是一小段数据,当 Web 浏览器访问服务器站点时,该数据从 Web 服务器发送到 Web 浏览器。Cookie 存储在用户的机器上,但它不是可执行程序,无法对该机器执行任何操作。但是,Cookie 可能允许恶意用户劫持 Web 会话,并查看、修改或以其他方式利用与另一个用户会话相关的信息。黑客可以通过各种方式获取 Cookie,包括物理访问或网络嗅探,以及猜测 Cookie 的内容。接下来,黑客可以尝试通过劫持用户的会话来冒充用户。这在共享工作站、网吧和公共信息亭环境中尤其是一个严重的问题。
有时,Cookie 用于存储用户信息,例如用户主机名、密码、帐户 ID、会话 ID 和其他用户个人资料信息。Cookie 通常用于维护用户及其购物车之间的会话信息。存在两种类型的 Cookie
持久性 Cookie 具有过期日期,并存储在用户的硬盘上,直到该日期。持久性 Cookie 可用于跟踪用户的浏览习惯,方法是在用户每次返回站点时识别她。
非持久性 Cookie 存储在 Web 浏览器的内存中。它们仅在浏览器关闭之前存在,然后被销毁。
如果用户能够通过网络嗅探或任何其他方式捕获 Cookie,他可能能够未经授权访问个人信息,包括信用卡号、密码、用户 ID 和邮寄地址。
您可以采取的安全措施是
使用非持久性 Cookie 而不是持久性 Cookie。
如果您必须使用持久性 Cookie,则为 Cookie 的生命周期指定较短的持续时间。Cookie 过期的时间越长,风险就越大。
避免使用持久性 Cookie 存储隐私相关信息的应用程序功能。示例:“请选中以记住用户名和密码。”
使用安全标记,以便仅在使用安全通道 (https) 时才发送 Cookie。
加密 Cookie 中的信息。一些网站将一个 Cookie 分割成多个 Cookie,这些 Cookie 将被进一步加密。
简而言之,表单篡改涉及保存网站的表单并离线编辑它。很多时候,这涉及到向下拉列表添加更多条目或增加文本字段的大小。其目的通常是在服务器上引起缓冲区溢出。过去,客户端表单验证已用于减轻服务器的性能负载。虽然从性能的角度来看,客户端验证是一种很好的技术,但从安全的角度来看,它不是首选的解决方案。设计不当的 Web 应用程序可能包含隐藏字段,这些字段包含用户 ID、帐户 ID 或其他定义用户会话的关键字段。同样,所有这些信息都可以在离线状态下被篡改,以访问另一个用户的会话。
表单篡改是一种简单的技术,只需要了解 HTML 即可。经验丰富的程序员可以通过猜测用于处理表单的服务器端代码来更改和提交表单。
应实施以下措施以提高应用程序针对表单篡改的安全性
在服务器端执行引用检查。这将确保从包含提供表单访问权限的超链接的页面访问给定的表单。
不要依赖表单字段长度检查或 JavaScript 来确保表单输入完整性。也在服务器上执行表单输入长度检查。
处理和验证用户输入的表单输入字段值,以检查范围、预期输入(例如,数字与字母)、奇怪字符以及任何其他特定于用户的关联。
不要将关键用户信息存储在表单的隐藏字段中。
有时表单是按顺序填写的。这可能是必要的,因为在一个表单中提供的信息用于将用户带到 Web 应用程序中的下一个表单。此外,整个 Web 应用程序可以分为多个表单,以方便使用。
恶意用户可能能够通过在浏览器 URL 字段中键入整个表单名称而不是使用网站页面提供的导航控件来绕过中间表单。这可能会导致意外的应用程序行为、访问已停用的应用程序、不完整的数据库记录或缓冲区溢出。
您可以采取的安全措施是
确保用户仅在提供先前表单中请求的所有必需信息后才进入下一个表单。此外,确保用户访问了所有先前的表单。
在服务器端执行引用检查。这将确保从包含提供表单访问权限的超链接的页面访问给定的表单。
很多时候,表单字段用于将用户提供的输入发送到后端网站以进行进一步处理。例如,用户可以输入其用户 ID 或全名以列出与其用户帐户相关的信息。一旦 Web 服务器收到此信息,它将向关系数据库发出查询。查询结果将显示给用户。
恶意用户可能会以某种方式输入字段条目,以至于返回的结果也提供有关其他用户的其他信息。此外,嵌入式查询可能会运行其他 SQL 命令,例如管道命令,这可能会导致机密信息泄露。
您可以采取的安全措施是
Web 应用程序必须仔细检查用于创建数据库查询的输入字段中是否包含非法字符,例如星号 (*)。
验证并确保输入字段仅包含相关的用户相关信息。
确保 Web 应用程序访问的数据库对象上存在适当的权限。
许多网站管理员感到安全,仅仅是因为该网站在其所有会话中都使用了 SSL。SSL 提供 Web 客户端和 Web 服务器之间的数据传输安全性。一旦建立 SSL 会话,Web 服务器和 Web 客户端之间交换的所有信息都将被加密。会话超时指定“无活动”持续时间,超过该持续时间用户将必须重新验证自己在网站上的身份。会话超时通常基于应用程序的类型。严肃的金融机构可能会指定非常短的会话超时期限。常规应用程序(例如基于 Web 的电子邮件)可能会使用更长的超时期限。
如果会话超时时间过长,恶意用户可能能够劫持另一个用户的会话。这会产生广泛的影响,从尴尬到用户信息的机密性和完整性丢失。这是信息亭、网吧、实验室和共享工作站环境中的一个主要问题。
您的安全措施是仔细评估应用程序的会话超时时间。如果您使用多个应用程序服务器,请确保多个应用程序的会话超时时间与为整个网站确定的超时时间一致。
大多数服务器都配置了自动目录列表。这意味着任何不包含服务器提供的任何默认文件(例如,index.htm 或 default.htm)的目录都将显示该目录的内容。这对于 CGI 程序源或可执行文件所在的目录来说是危险的。此外,这些目录可能包含其他文件(例如,带有 ~ 前缀或 .bak 后缀的文件),这些文件可能提供有关网站应用程序的更多信息。
恶意用户可能能够浏览目录并下载关键文件。可以检查包含源代码的文件,以识别进入 Web 服务器或应用程序的后门。
您可以采取的安全措施是
配置 Web 服务器以指定可能使用的所有默认文件并禁用目录浏览。
在添加 Web 应用程序文件时,建立适当的程序。
确保定期删除不必要的文件。
网站上的动态内容将继续增强网站的业务功能;它得到了越来越多的电子商务网站的支持。此外,这些 Web 应用程序越来越多地连接到以前只能通过内部构建的自定义应用程序访问的数据库。恶意个人可以利用这些基于 Web 的应用程序来访问特权信息。几种简单的方法,例如 Cookie 中毒和表单篡改,可用于利用设计不当的 Web 应用程序;最常见的情况是,只需一个文本编辑器和一个浏览器就足够了。用于执行漏洞利用的工具很容易获得,并且只需要最少的知识。完全相同的工具和方法可用于测试 Web 应用程序的稳健性。
对 Web 应用程序进行详尽的测试将需要构建测试场景来识别漏洞。适当的 Web 应用程序设计、Web 服务器配置、安全编程实践和良好的内务管理对于任何网站和网站的特权资源的安全都是必要的。由于 Web 应用程序的自定义性质,它们对网站的安全性提出了挑战。未来,随着用于构建应用程序的认证组件获得支持,Web 应用程序有望变得更加安全。目前,我们将不得不依赖 Web 应用程序的静态和动态测试。
Nalneesh Gaur (Nalneesh.Gaur@gte.net) 是 Ernst & Young LLP 在德克萨斯州达拉斯市 eRisk Solutions 实践部门的经理。多年来,他一直专注于 UNIX 和 Windows NT 系统、集成以及 Internet/intranet 安全问题。