威胁与对策

更新日期: 2004年04月12日
本页内容
本模块内容本模块内容
目标目标
适用范围适用范围
如何使用本模块如何使用本模块
准备工作准备工作
对攻击的剖析对攻击的剖析
了解威胁类别了解威胁类别
网络威胁和对策网络威胁和对策
主机威胁和对策主机威胁和对策
应用程序威胁和对策应用程序威胁和对策
输入验证输入验证
身份验证身份验证
授权授权
配置配置
敏感数据敏感数据
会话管理会话管理
加密加密
参数操纵参数操纵
异常管理异常管理
审核和记录审核和记录
小结小结
其他资源其他资源

本模块内容

本模块从威胁、对策、漏洞和攻击的角度分析了 Web 应用程序的安全。如果您在应用程序设计、实现和部署过程中考虑安全功能,将有助于更好地理解攻击者的思想。通过从攻击者的角度思考问题并了解他们可能采取的策略,您在应用对策时将会更加有效。本模块介绍了典型的攻击者方法,并简要描述了对典型攻击的剖析。

本模块以展示攻击者用来危及 Web 应用程序安全的常见方法开始,并建议使用 STRIDE 方法将这些威胁分类。然后介绍了可能危及您的网络、主机基础结构和应用程序安全的最大威胁。有关这些威胁的知识和相应的对策为威胁建模过程提供了必要信息。

本模块使您可以识别对您的特定方案而言存在的威胁,并可以根据它们给您的系统造成的危险程度对其区分优先次序。

返回页首返回页首

目标

使用本模块可以实现:

开始从攻击者的角度考虑问题。

了解在威胁范畴广泛使用的 STRIDE 方法。

识别并应对在网络、主机和应用程序级别存在的威胁。

返回页首返回页首

适用范围

Web 应用程序

返回页首返回页首

如何使用本模块

本模块介绍了一组普遍的网络、主机和应用程序级别的威胁,还介绍了为解决每种威胁所推荐的对策。

本模块并不包含各种威胁的冗长列表,但它强调了许多最危险的威胁。根据此信息以及有关攻击者工作原理的知识,您可以识别其他威胁。

您需要了解最可能危害系统的威胁,以便建立有效的威胁模型。这些威胁模型是模块 3 威胁建模的主题。

为了充分理解本模块内容,请:

熟悉对您的网络、主机和应用程序造成影响的特定威胁。尽管攻击者的目标是相同的,但对系统各个部分的威胁是不同的。

使用威胁来识别危险并创建用以应对威胁的计划。

应用对策来消除漏洞。本模块中总结了各种对策。有关对策实现的详细信息,请使用本指南中的第 III 部分“构建安全的 Web 应用程序”和第 IV 部分“确保您的网络、主机和应用程序的安全”。

当您设计、构建新系统并确保其安全时,请将本模块所介绍的威胁考虑进去。无论使用何种平台或技术,都存在这些威胁。

返回页首返回页首

准备工作

开始威胁建模过程之前,理解以下基本术语是至关重要的。

资产。具有价值的资源,如数据库中或文件系统上的数据,或者是系统资源

威胁。可能危害资产的潜在发生(恶意或非恶意)

漏洞。使威胁成为可能的弱点

攻击(或利用)。所执行的危害资产的操作

对策。用以解除威胁并减轻危险的安全措施

返回页首返回页首

对攻击的剖析

通过了解攻击者攻击您的 Web 应用程序所采用的基本方法,您可以确定您面对的对象,从而采取更有效的防御措施。攻击者方法的基本步骤总结如下,并进行了图解,见图 2.1:

调查和评估

利用和渗透

提升特权

保留访问权

拒绝服务

攻击方法的基本步骤

图 2.1
攻击方法的基本步骤

调查和评估

先后对潜在目标进行调查和评估。攻击者通常采取的第一步是调查潜在目标,以识别和评估其特征。这些特征可能包括它所支持的服务和协议,以及潜在漏洞和入口点。攻击者使用在调查和评估阶段所收集的信息来规划最初的攻击。

例如,攻击者可以通过测试检测跨站点脚本 (XSS) 的漏洞,以查看网页中的控件是否会返回输出。

利用和渗透

对潜在目标进行调查后,下一步是利用和渗透。如果网络和主机是完全安全的,则您的应用程序(前门)将成为攻击的下一渠道。

对于攻击者而言,进入应用程序最简便的方法是通过合法用户使用的同一入口—例如,通过应用程序的登录页面或不需要身份验证的页面。

提升特权

攻击者在通过向应用程序插入代码或创建与 Microsoft® Windows® 2000 操作系统进行的已验证身份的会话来设法危及应用程序或网络的安全后,他们立即尝试提升特权。特别是,他们想得到 Administrators 组成员帐户提供的管理特权。他们也寻求本地系统帐户所提供的高级别特权。

在整个应用程序中使用特权最低的服务帐户是针对特权提升攻击的主要防御措施。而且,许多网络级别的特权提升攻击要求交互式的登录会话。

保留访问权

获得系统的访问权后,攻击者采取措施使以后的访问更加容易,并且掩盖其踪迹。用来使以后的访问更加容易的常用方法包括插入后门程序,或使用现有的缺少强大保护的帐户。掩盖踪迹通常包括清除日志和隐藏工具。因此,审核日志是攻击者的主要目标。

应该确保日志文件的安全,而且应该对其进行定期分析。日志文件分析通常会揭露尝试的入侵在进行破坏之前的早期迹象。

拒绝服务

无法获得访问权的攻击者通常装入拒绝服务的攻击,以防止其他攻击者使用此应用程序。对于其他攻击者而言,拒绝服务选项是他们最初的目标。例如 SYN 大量攻击,其中攻击者使用程序发送大量 TCP SYN 请求,来填充服务器上的挂起连接队列。这样便阻止了其他用户建立网络连接。

返回页首返回页首

了解威胁类别

因为存在许多不同的攻击和攻击技术,所以从攻击者要达到的目标的角度来考虑威胁是很有用的。这使您的注意力从识别每个特定攻击(它实际上只是达到目标的一种方法)转移到可能的攻击的最终结果。

STRIDE

应用程序所面临的威胁可根据攻击的目标和目的进行分类。熟知这些威胁的类别有助于您组织安全策略,从而对威胁作出规划的响应。STRIDE 是 Microsoft 对不同威胁类型进行分类所使用的首字母缩略语。STRIDE 表示:

哄骗。哄骗是指尝试使用假身份获取系统的访问权。可以使用偷取的用户凭证或假的 IP 地址来实现。攻击者作为合法用户或主机成功获取访问权后,则可以开始特权提升或滥用授权。

篡改。篡改是指未经授权修改数据,例如当数据通过网络在两台计算机之间传递时。

抵赖。抵赖是指用户(合法或非合法)否认他们已执行了特定操作或事务的能力。没有足够的审核,抵赖攻击很难证明。

信息泄漏。信息泄漏是指保密数据的不期望的泄漏。例如,用户查看无权打开的表或文件的内容,或者监视网络上以存文本形式传输的数据。有关信息泄漏的漏洞的示例包括使用隐藏表格字段、网页中嵌入的注释(其中包括数据库连接字符串和连接详细信息)以及脆弱的异常处理(它可能导致内部系统级别的详细信息暴露给客户端)。这些信息中的任何内容对攻击者都非常有用。

拒绝服务。拒绝服务是使系统或应用程序不可用的过程。例如,拒绝服务攻击可能通过以下途径实现,使用请求轰击服务器以耗费所有可用的系统资源,或者向其传输可使应用程序进程崩溃的破坏性的输入数据。

特权提升。当具有有限特权的用户冒充具有高级特权的用户来获得应用程序的特权访问权时,会发生特权提升。例如,具有有限特权的攻击者可能提升其特权级别以危害并控制具有高级别特权且受信任的进程或帐户。

STRIDE 威胁和对策

STRIDE 所描述的每种威胁类别都有相应的一套用以降低危险的对策技术。表 2.1 汇总了这些技术。相应的对策取决于特定的攻击。适用于网络、主机和应用程序级别的更多威胁、攻击和对策将在本模块的后面部分介绍。

表 2.1:STRIDE 危险和对策

威胁对策

哄骗用户身份

使用增强的身份验证。
不要以纯文本形式存储机密(例如,密码)。
不用通过网络传递纯文本形式的凭证。
使用安全套接字层 (SSL) 保护身份验证 Cookie。

篡改数据

使用数据哈希和签名。
使用数字签名。
使用增强的身份验证。
在通讯链接中使用反篡改协议。
使用提供消息完整性的协议来确保通讯链接的安全。

抵赖

创建安全的审核记录。
使用数字签名。

信息泄漏

使用增强的身份验证。
使用增强的加密。
使用可提供消息保密性的协议来确保通讯链接的安全。
不要以纯文本形式存储机密(如密码)。

拒绝服务

使用资源和带宽调节技术。
验证并筛选输入。

特权提升

遵循最低特权的原则,使用最低特权服务帐户来运行进程和访问资源。

返回页首返回页首

网络威胁和对策

组成网络基础结构的主要组件是路由器、防火墙和交换机。它们就像看门人一样保护服务器和应用程序免受攻击和入侵。攻击者可能会利用未正确配置的网络设备。通常的漏洞包括默认安装设置很脆弱、访问控制广泛开放以及设备缺少最新的安全修补程序。最危险的网络级别威胁包括:

信息搜集

侦听

哄骗

会话劫持

拒绝服务

信息收集

网络设备和其他类型的系统一样可以被发现和分析。攻击者通常从端口扫描开始。他们在识别开放端口后,使用标志攫取和枚举来检测设备类型和确定操作系统及应用程序版本。具备了这些信息后,攻击者可以攻击那些可能未使用安全修补程序更新的已知漏洞。

防止收集信息的对策包括:

配置路由器以限制它们对于跟踪足迹请求的响应。

配置网络软件(如软件防火墙)所驻留的操作系统,通过禁用不使用的协议和不需要的端口来防止跟踪足迹。

侦听

侦听或偷听是指监视网络传输以获取纯文本形式的密码或配置信息的行为。采用简单的数据包侦听器,攻击者可以轻易读取所有纯文本通信。而且,攻击者可以解开采用轻量级哈希算法加密的数据包,并可以破译您认为安全的有效负荷。侦听数据包要求在服务器/客户端通讯路径中有一个数据包侦听器。

有助于防止侦听的对策包括:

使用增强的物理安全和合适的网络分段。这是防止从本地收集通信的第一步。

将通讯完全加密,包括身份验证凭证。这样即可防止攻击者使用侦听的数据包。SSL 和 IPSec(Internet 协议安全)是加密解决方案的示例。

哄骗

哄骗是在网络上隐藏真实身份的方法。为创建哄骗身份,攻击者使用并不代表数据包真实地址的假的源地址。哄骗可用来隐藏攻击者的原始来源,或者规避网络访问控制列表 (ACL),该列表用以限制基于源地址规则的主机访问。

尽管从来也无法追踪到精心设计的哄骗数据包的发信人,但组合使用各种筛选规则可以防止在您的网络上生成哄骗数据包,从而使您可以显著地阻止哄骗数据包。

防止哄骗的对策包括:

筛选从您的外围的内部 IP 地址进入的数据包。

筛选从无效的本地 IP 地址传出的数据包。

会话劫持

会话劫持也称为 man in the middle,它欺骗服务器或客户端接受上游主机为实际的合法主机。不是上游主机而是攻击者主机操纵网络,从而攻击者的主机似乎成为期望的目标。

有助于防止会话劫持的对策包括:

使用加密的会话协商。

使用加密的通讯通道。

让自己能够得到平台修补程序通知,以消除 TCP/IP 漏洞,如可预测的数据包序列。

拒绝服务

拒绝服务拒绝合法用户访问服务器或服务。SYN 大量攻击是网络级别拒绝服务攻击的典型示例。它容易启动且难以跟踪。攻击的目标是向服务器发送多于其处理能力的请求。此攻击利用 TCP/IP 连接建立机制的潜在漏洞,向服务器的挂起连接队列发送大量数据。

防止拒绝服务的对策包括:

应用最新的服务数据包。

通过应用合适的注册表设置来强化 TCP/IP 堆栈,以增加 TCP 连接队列的大小,减少连接建立时间,并采用动态储备机制来确保连接队列不耗竭。

使用网络入侵检测系统 (IDS),因为它能自动检测并响应 SYN 攻击。

返回页首返回页首

主机威胁和对策

主机威胁存在于根据其建立应用程序的系统软件内。其中包括 Windows 2000、Internet 信息服务 (IIS)、.NET Framework 和 SQL Server 2000,具体取决于特定的服务器角色。最危险的主机威胁包括:

病毒、特洛伊木马和蠕虫病毒

跟踪足迹

概要分析

密码破解

拒绝服务

任意代码执行

未授权访问

病毒、特洛伊木马和蠕虫病毒

病毒是一种设计用来执行恶意操作并造成操作系统或应用程序破坏的程序。特洛伊木马与病毒类似,不同的是它将恶意代码包含在看起来无害的数据文件或可执行程序内。蠕虫病毒与特洛伊木马类似,不同的是它自行在服务器之间进行复制。蠕虫病毒很难检测,因为它们通常不创建可以看到的文件。通常在蠕虫病毒开始消耗系统资源时注意到它,因为此时系统速度减慢或其他应用程序的执行终止。红色代码蠕虫病毒是攻击 IIS 的最臭名昭著的病毒;它依赖于特定 ISAPI 筛选器中的缓冲区溢出漏洞。

尽管这三种威胁是实际攻击,但是对以下对象构成了严重的威胁:Web 应用程序、这些应用程序所在的主机以及用以传输这些应用程序的网络。对任何系统的攻击都可能取得成功,这是因为系统存在许多漏洞,如脆弱的默认设置、软件缺陷和 Internet 协议的固有漏洞。

对病毒、特洛伊木马和蠕虫病毒可以使用的对策包括:

通过最新的操作系统服务数据包和软件修补程序保持最新状态。

禁用防火墙和主机上所有不必要的端口。

禁用不使用的功能,包括协议和服务。

强化脆弱的默认配置设置。

跟踪足迹

跟踪足迹的示例有端口扫描、ping 扫射和 NetBIOS 枚举,攻击者可使用这些方法来发现有价值的系统级别的信息,以准备更重要的攻击。可能被跟踪足迹发现的信息类型包括帐户详细信息、操作系统和其他软件版本、服务器名称和数据库方案的详细信息。

有助于防止跟踪足迹的对策包括:

禁用不必要的协议。

采用相应的防火墙配置来锁定端口。

使用 TCP/IP 和 IPSec 筛选器以进行深度防御。

配置 IIS 以防止通过标志攫取泄漏信息。

使用可配置的 IDS 来识别跟踪足迹模式并拒绝可疑通信。

密码破解

如果攻击者无法与服务器建立匿名连接,他或她将尝试建立经过身份验证的连接。因此,攻击者必须知道一个有效的用户名和密码组合。如果您使用默认帐户名,则为攻击者创造了开始的机会。然后,攻击者只需破解帐户的密码。使用空密码或弱密码会使攻击者的工作变得更加容易。

有助于防止密码破解的对策包括:

对所有帐户类型使用强密码。

对于最终用户帐户使用锁定策略,以限制可用来猜密码的重试次数。

不要使用默认帐户名,并且重命名标准帐户,如管理员帐户和许多 Web 应用程序所使用的匿名 Internet 用户帐户。

审核失败登录是否属于劫持密码尝试模式。

拒绝服务

以基础结构内的几个目标为目的的许多方法都可以实现拒绝服务。在主机上,攻击者可以通过强力攻击应用程序来中断服务,或者攻击者知道您的应用程序所在的服务中或运行服务器的操作系统中所存在的漏洞。

有助于防止拒绝服务的对策包括:

以防止拒绝服务为目标,配置您的应用程序、服务和操作系统。

通过修补程序和安全更新保持最新状态。

针对拒绝服务,强化 TCP/IP 堆栈。

确保您的帐户锁定策略不能用来锁定众所周知的服务帐户。

确保您的应用程序能够处理大容量通信,且设置了阈值以处理反常的高负载。

检查您的应用程序的故障转移功能。

使用 IDS 可检测潜在的拒绝服务攻击。

任意代码执行

如果攻击者可以在您的服务器上执行恶意代码,则攻击者或者危及服务器资源的安全,或者继续攻击下游系统。如果攻击者代码运行所在的服务器进程越权,则任意代码执行所造成的危险更大。常见漏洞包括弱 IID 配置和无修补程序的服务器,这将允许路径遍历和缓冲区溢出攻击,都可能导致任意代码执行。

有助于防止任意代码执行的对策包括:

将 IIS 配置为拒绝带有“../” 的 URL,以防止路径遍历。

锁定具有受限制的 ACL 的系统命令和实用程序。

通过修补程序和更新保持最新状态,以确保快速修补新近发现的缓冲区溢出。

未授权访问

不充分的访问控制会允许未授权用户访问受限制的信息或执行受限制的操作。常见漏洞包括弱 IIS Web 访问控制,其中包含 Web 权限和弱 NTFS 权限。

有助于防止未授权访问的对策包括:

配置安全的 Web 权限。

锁定具有受限制的 NTFS 权限的文件和文件夹。

在 ASP.NET 应用程序内使用 .NET Framework 访问控制机制,包括 URL 授权和主要权限要求。

返回页首返回页首

应用程序威胁和对策

分析应用程序级别威胁的较好方法是将其按照应用程序漏洞类别来组织。表 2.2 中总结了本模块的后续部分和整个指南所使用的各种类别,以及对您的应用程序的主要威胁。

表 2.2:按应用程序漏洞类别分类的威胁

类别威胁

输入验证

缓冲区溢出;跨站点脚本;SQL 插入;标准化

身份验证

网络偷听;强力攻击;字典攻击;Cookie 重播;凭证偷窃

授权

特权提升;机密数据泄漏;数据篡改;诱惑攻击

配置管理

未授权访问管理界面;未授权访问配置存储区;检索明文配置数据;缺少各自的可说明性;越权进程和服务帐户

敏感数据

访问存储区中的敏感数据;网络偷听;数据篡改

会话管理

会话劫持;会话重播;man in the middle 攻击

加密

不完善的密钥生成或密钥管理;弱加密或自定义加密

参数操纵

查询字符串操纵:表格字段操纵;Cookie 操纵;HTTP 头操纵

异常管理

信息泄漏;拒绝服务

审核和记录

用户拒绝执行操作;攻击者利用应用程序而不留踪迹;攻击者掩盖其踪迹

返回页首返回页首

输入验证

如果攻击者发现您的应用程序对输入数据的类型、长度、格式或范围进行了无理由的假设,则输入验证是一个安全问题。攻击者然后便可提供精心设计的输入,从而危及您的应用程序的安全。

当网络和主机级别入口点完全安全时,您的应用程序所暴露的公共接口则成为攻击的唯一来源。对您的应用程序进行输入既是测试系统的方法,也是执行对于攻击者有益的代码的方法。您的应用程序会盲目信任输入吗?如果是这样,则您的应用程序可能容易受下列情况的影响:

缓冲区溢出

跨站点脚本

SQL 插入

标准化

下一部分将详细说明这些漏洞,包括使其成为可能的原因。

缓冲区溢出

缓冲区溢出漏洞会导致拒绝服务攻击或代码插入。拒绝服务攻击会引起进程崩溃;代码插入则会更改程序执行地址以运行攻击者插入的代码。下面的代码片段演示了缓冲区溢出漏洞的典型示例。

void SomeFunction( char *pszInput )
{
char szBuffer[10];
// 当不执行类型检查时,输入将直接复制到缓冲区内
strcpy(szBuffer, pszInput);
  . . .
}

托管的 .NET 代码不容易受到此问题的影响,因为不论何时访问数组时,都会自动检查数组界限。这使得缓冲区溢出攻击的威胁对托管代码而言并不构成很大的问题。但是,当托管代码调用非托管的 API 或 COM 对象时,它仍是个要考虑的问题。

有助于防止缓冲区溢出的对策包括:

执行彻底的输入验证。这是防御缓冲区溢出的第一道防线。尽管应用程序可能存在缺陷,使得期望的输入超出容器的界限,但不期望的输入仍将成为产生这种漏洞的主要原因。通过验证输入的类型、长度、格式和范围来限制输入。

在可能的情况下,限制应用程序对非托管代码的使用,并彻底检查非托管的 API,以确保输入已经过正确的验证。

检查调用非托管的 API 的托管代码,以确保仅将合适值作为参数传递给非托管的 API。

使用 /GS 标记来编译使用 Microsoft Visual C++® 开发系统开发的代码。/GS 标记将使编译器向编译代码中插入安全检查。这并非无错的解决方案或是对您特定的验证代码的替换;但是,它确实能保护您的代码免受众所周知的缓冲区溢出攻击。有关更多信息,请参阅 .NET Framework 产品文档,网址为:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vclrfGSBufferSecurity.asp(英文)和 Microsoft 知识库文章 325483“Support WebCast:Compiler Security Checks:The /GS compiler switch”,网址为:http://support.microsoft.com/default.aspx?scid=325483(英文)。

通过缓冲区溢出插入代码示例

攻击者可以利用缓冲区溢出漏洞来插入代码。通过这种攻击,恶意用户可以在进程中利用未检查的缓冲区,方法是提供精心构造的输入值来覆盖程序的堆栈,并更改函数返回地址。这会使执行跳到攻击者插入的代码。

攻击者的代码通常在进程安全上下文中结束运行。这突出了使用最低特权进程帐户的重要性。如果当前的线程正在模仿,则攻击者的代码将在线程模仿标记定义的安全上下文中结束运行。攻击者通常所做的第一件事情是调用 RevertToSelf API 以转换到攻击者希望具有更高特权的进程级别安全上下文。

确保验证输入的类型和长度,特别是在调用非托管的代码之前,因为非托管代码特别容易受到缓冲区溢出的影响。

跨站点脚本

当浏览器连接到受信任的网站时,XSS 攻击会导致任意代码在用户浏览器中运行。此攻击以应用程序的用户而不是应用程序本身为目标,但它使用应用程序作为攻击工具。

因为脚本代码是从受信任站点上通过浏览器下载的,所以浏览器无法知道此代码是非法的。Internet Explorer 安全区域未提供任何防御。因为攻击者的代码可以访问与受信任站点相关的 Cookie 而且此代码存储在用户的本地计算机上,所以用户身份验证 Cookie 通常是攻击的目标。

跨站点脚本示例

为启动攻击,攻击者必须使用户单击一个精心设计的超链接,例如,通过在发送给用户的电子邮件中嵌入链接或向新闻组公告中添加恶意链接。链接指向应用程序中易受攻击的页面,该页面以 HTML 输出流形式将未经验证的输入发送回浏览器。例如,考虑下面两个链接。

这是一个合法链接:

www.yourwebapplication.com/logon.aspx?username=bob

这是一个恶意链接:

www.yourwebapplication.com/logon.aspx?username=<script>alert('hacker code')</script>

如果 Web 应用程序提取了查询字符串,无法对其进行正确验证并使其返回浏览器,则脚本代码将在浏览器中执行。前面的示例将显示一条无害的弹出式消息。采用合适的脚本,攻击者可以轻松提取用户的身份验证 cookie 并将其粘贴到自己的站点,然后作为经过身份验证的用户向目标网站发出请求。

防止 XSS 的对策包括:

执行彻底的输入验证。您的应用程序必须确保查询字符串、表格字段和 Cookie 的输入对应用程序而言有效。认为所有用户输入都可能是恶意的,并筛选和清洁下游代码的上下文。验证已知有效值的所有输入,并拒绝所有其他输入。使用正则表达式来验证通过 HTML 表格字段、Cookie 和查询字符串接收的输入数据。

使用 HTMLEncode URLEncode 函数来对任何包含用户输入的输出进行编码。这会将可执行脚本转换为无害的 HTML。

SQL 插入

SQL 插入攻击利用输入验证中的漏洞来在数据库中运行任意命令。当您的应用程序使用输入来构造动态 SQL 语句以访问数据库时,可能出现这种攻击。如果您的代码使用的存储过程传递了包含未筛选的用户输入的字符串,则也可能出现这种攻击。使用 SQL 插入攻击,攻击者可以在数据库中执行任意命令。如果应用程序使用越权帐户来连接到数据库,则此问题将会更加严重。在这种情况下,使用数据库服务器来运行操作系统命令是可能的,但会潜在地危及其他服务器的安全,而且还会检索、操纵和损坏数据。

SQL 插入示例

当您的数据库查询中包括未经验证的用户输入时,您的应用程序可能很容易受到 SQL 插入攻击。特别容易受到影响的是用未筛选的用户输入构造动态 SQL 语句的代码。考虑以下代码:

SqlDataAdapter myCommand = new SqlDataAdapter(
"SELECT * FROM Users 
WHERE UserName ='" + txtuid.Text + "'", conn);

攻击者可以通过终止特定的 SQL 语句来插入 SQL,方法是使用单引号字符加分号字符开始一个新命令,然后执行他们自己选择的命令。考虑下面输入到 txtuid 字段的字符串。

'; DROP TABLE Customers -

这将导致以下语句提交给数据库以执行。

SELECT * FROM Users WHERE UserName=''; DROP TABLE Customers --'

假定应用程序的登录具有足够的数据库权限,则此语句会删除客户表格(这也是在数据库中使用最低特权的另一个原因)。双短划线 (--) 表示 SQL 注释,用来对程序员所添加的任何其他字符(例如右引号)进行注释。

注意 分号实际上并非必需。SQL Server 将执行由空格分开的两个命令。

还可执行其他更具欺骗性的命令。将以下内容输入到 txtuid 字段:

' OR 1=1 -

建立此命令:

SELECT * FROM Users WHERE UserName='' OR 1=1 -

因为 1=1 恒成立,攻击者将检索 Users 表格中的每一行数据。

防止 SQL 插入的对策包括:

执行彻底的输入验证。您的应用程序应在向数据库发送请求之前验证其输入。

将参数化的存储过程用于数据库访问,以确保不会将输入字符串误认为可执行语句。如果您不能使用存储过程,那么在建立 SQL 命令时请使用 SQL 参数。

使用最低特权的帐户来连接数据库。

标准化

将不同形式的输入解析为相同的标准名称(标准的名称),称为标准化。如果代码使安全决策基于作为输入传递给程序的资源的名称,那么代码特别容易受到标准化问题的影响。文件、路径和 URL 都是易受标准化问题影响的资源类型,因为对于以上每种资源类型都有不同的方法来表示相同的名称。文件名也是有问题的。例如,单个文件可以表示为:

c:\temp\somefile.dat
somefile.dat
c:\temp\subdir\..\somefile.dat
c:\  temp\   somefile.dat
..\somefile.dat

理论上,您的代码不接受输入文件名。如果是这样,则应在作出安全决策之前将名称转变为标准形式,例如批准或拒绝对指定文件的访问。

解决标准化问题的对策包括:

尽可能避免输入文件名,而使用最终用户无法更改的绝对文件路径。

如果必须将文件名接受为输入,应确保文件名形式正确,并在应用程序的上下文中对其进行验证。例如,检查它们是否在您的应用程序的目录层次结构中。

确保字符编码设置正确,以限制表示输入的方法。检查您的应用程序的 Web.config 已在<全局化 >元素上设置了 requestEncoding responseEncoding 属性。

返回页首返回页首

身份验证

根据您的要求,有几种可用的身份验证机制可选。如果未能正确选择和实现身份验证机制,则攻击者会利用该机制暴露的漏洞来获取您的系统的访问权。利用身份验证机制的漏洞所构成的最大的威胁包括:

网络偷听

强力攻击

字典攻击

Cookie 重播攻击

凭证偷窃

网络偷听

如果从客户端向服务器以纯文本形式传递身份验证凭证,在同一网络的主机上具有初级的网络监测软件的攻击者就可以捕捉通信并获得用户名和密码。

防止网络偷听的对策包括:

使用不通过网络传输密码的身份验证机制,如 Kerberos 协议或 Windows 身份验证。

如果必须通过网络传输密码,则需确保密码已加密,或使用已加密的通讯通道,如 SSL。

强力攻击

强力攻击依赖计算能力来解开哈希密码或其他使用了哈希和加密的机密。为减少这种危险,请使用强密码。

字典攻击

此攻击用于获取密码。多数密码系统不存储纯文本密码或加密的密码。它们避免使用加密的密码,因为泄漏的密钥会危及数据存储区中所有密码的安全。丢失密钥则意味着所有的密码都未通过验证。

多数用户存储实现具有密码哈希(或摘要)。根据用户提供的密码值重新计算哈希并将其与数据库中存储的哈希值进行比较,来对用户进行身份验证。如果攻击者设法获得哈希密码列表,则会使用强力攻击来破解密码哈希。

在字典攻击中,攻击者使用程序来重述字典中的所有词(或采用多种语言的多个字典)并计算每个词的哈希。生成的哈希与数据存储区中的值进行比较。可以快速破解弱密码,如“Yankees”(一个受欢迎的团队)或“Mustang”(一种受欢迎的车)。较强密码(如“?You'LlNevaFiNdMeyePasSWerd!”)被破解的可能性较小。

注意 一旦攻击者获得了密码哈希列表,则可以脱机执行字典攻击,而且并不要求与应用程序交互。

防止字典攻击的对策包括:

使用强密码,此强密码应该复杂,不是常规单词,且包含混用大写、小写、数字和特殊字符。

在用户存储区中存储不可还原的密码哈希。还要在密码哈希中包含一个 Salt 值(一个加密性强的随机数字)。

有关使用添加的 Salt 存储密码哈希的更多信息,请参考模块 14 构建安全的数据访问。

Cookie 重播攻击

采用这种类型的攻击,攻击者可以使用监测软件捕捉用户的身份验证 Cookie 并将其重播给应用程序,以便使用虚假身份获取访问权。

防止 Cookie 重播的对策包括:

无论何时传输身份验证 Cookie 时,请使用提供的 SSL 加密通讯通道。

将 Cookie 超时设置为一个值,以在经过相对短的时间间隔后强制进行身份验证。尽管这并不能防止重播攻击,但它缩短了攻击者可以重播请求而无需强制进行重新身份验证的时间间隔,因为此会话已超时。

凭证偷窃

如果您的应用程序实现其自身的包含用户帐户名和密码的用户存储区,那么将其安全值与平台提供的凭证存储区(例如 Microsoft Active Directory® 目录服务或安全帐户管理器 (SAM) 用户存储区)相比较。浏览器历史记录和缓存也存储用户登录信息,以备将来之用。如果登录用户以外的人访问了终端,而且点击了相同的页面,则保存的登录将可用。

有助于防止凭证偷窃的对策包括:

使用并强制强密码。

以添加了 Salt 的单向哈希的方式存储密码验证符。

在重试一定次数后,对最终用户帐户强制帐户锁定。

为了应对浏览器缓存允许登录访问的可能性,创建允许用户选择不保存凭证的功能,或强制此功能作为默认策略。

返回页首返回页首

授权

根据用户身份和角色成员身份,可以允许或拒绝对特定资源或服务的授权。利用授权漏洞的最大威胁包括:

特权提升

保密数据的泄漏

数据篡改

诱惑攻击

特权提升

设计授权模型时,您必须考虑攻击者的威胁,攻击者尝试将其特权提升到功能强大的帐户(如本地 Administrators 组成员或本地系统帐户)所具有的权限。这样,攻击者能够对应用程序和本地计算机进行完全的控制。例如,在典型的 ASP 编程中,从组件中调用 RevertToSelf API 会导致执行线程以本地系统帐户(在本地计算机上具有最大能力和特权)运行。

可用来防止特权提升的主要对策是使用最低特权的进程、服务和用户帐户。

保密数据的泄漏

如果未授权用户可以查看敏感性数据,则可能发生保密数据的泄漏。保密数据包括应用程序特定数据(如信用卡号码、职员详细信息、财务记录等)以及应用程序配置数据(如服务帐户凭证和数据库连接字符串)。为防止保密数据的泄漏,您应该确保其在永久存储区(如数据库和配置文件)中的安全以及在网络传输期间的安全。只有经过身份验证和授权的用户才能够访问他们特定的数据。应仅限管理员可以访问系统级别的配置数据。

防止保密数据泄漏的对策包括:

在允许访问可能暴露敏感数据的操作之前,执行角色检查。

使用强 ACL 来确保 Windows 资源的安全。

使用标准加密在配置文件和数据库中存储敏感数据。

数据篡改

数据篡改指未经授权修改数据。

防止数据篡改的对策包括:

使用强访问控制来保护永久存储区中的数据,以确保只有经过授权的用户可以访问和修改数据。

使用基于角色的安全来区分可查看数据的用户和可修改数据的用户。

诱惑攻击

当具有很少特权的实体能够让具有更多特权的实体执行对其有利的操作时,便发生了诱惑攻击。

为了应对这种威胁,您必须使用适当的授权机制来限制对受信任代码的访问。无论何时访问安全资源或执行特权操作时,则使用 .NET Framework 代码访问安全通过授权调用代码来帮助这操作。

返回页首返回页首

配置

许多应用程序支持配置界面和功能,以允许操作员和员更改配置参数、更新网站内容并执行常规维护。最危险的配置威胁包括:

对界面的未授权访问

对配置存储区的未授权访问

检索纯文本配置机密

缺少各自的可说明性

越权进程和服务帐户

对界面的未授权访问

管理界面通常通过附加的网页或单独的 Web 应用程序提供,该网页或 Web 应用程序允许管理员、操作员和内容开发人员管理网站内容和配置。这样的管理界面仅限于受限制的和经过授权的用户使用。可以访问配置管理功能的恶意用户可能会破坏网站,访问下游系统和数据库,或终止应用程序操作并破坏配置数据。

防止对管理界面的未授权访问的对策包括:

使管理界面的数量最小化。

使用强身份验证,如使用证书。

使用具有多个看门人的强身份验证。

考虑只支持本地管理。如果远程管理是绝对需要的,因为通过管理界面传递的数据很敏感,需使用加密通道(如带有 VPN 技术或 SSL)。为了进一步减少危险,还要考虑使用 IPSec 策略来将远程管理限制在内部网络中的计算机。

对配置存储区的未授权访问

由于在配置存储区中的数据具有敏感性,所有您应该确保存储区充分安全。

保护配置存储区的对策包括:

在基于文本的配置文件(如 Machine.config 和 Web.config)中配置受限制的 ACL。

在 Web 空间外保存自定义配置存储区。这消除了下载 Web 服务器配置以利用其漏洞的可能性。

检索纯文本配置机密

必须限制对配置存储区的访问。作为一种重要深度防御机制,您应该对敏感数据(如密码和连接字符串)加密。这有助于防止外部攻击者获取敏感的配置数据。它也能防止恶意管理员和内部员工获得敏感的详细信息,如使其可以访问其他系统的数据库连接字符串和帐户凭证。

缺少各自的可说明性

缺少对配置信息更改的审核和记录会威胁到识别更改时间和更改人员的能力。无论是由正直操作员的错误,还是由恶意更改以获取特权访问权而发生中断更改,都必须首先采取操作来更正更改。然后应用预防性措施防止以同一方式引入中断更改。请记住,共享帐户可以骗取审核和记录;这既适用于管理帐户,也适用于用户/应用程序/服务帐户。必须不能共享管理帐户。分配用户/应用程序/服务帐户的级别必须允许使用此帐户识别访问的单个来源,而且包含授予该帐户的任何特权损害。

越权的应用程序和服务帐户

如果向应用程序和服务帐户授予访问权以更改系统中的配置信息,则攻击者可能操纵它们来执行此操作。可以通过采纳使用最低特权的服务和应用程序帐户的策略可以减少这种威胁的危险。请记住,除非设计明确要求,否则不要允许帐户修改其各自配置信息。

返回页首返回页首

敏感数据

敏感数据容易受到各种威胁。尝试查看或修改敏感数据的攻击可能以永久数据存储区和网络为目标。对敏感数据的最大威胁包括:

访问存储中的敏感数据

网络偷听

数据篡改

访问存储中的敏感数据

您必须确保存储中的敏感数据的安全,以防止用户(恶意或非恶意)获取数据访问权和读取数据。

保护存储中的敏感数据的对策包括:

对于包含敏感数据的永久数据存储区使用受限制的 ACL。

存储加密的数据。

使用基于身份和角色的授权来确保只允许具有适当级别授权的用户访问敏感数据。使用基于角色的安全来区分可查看数据的用户和可修改数据的用户。

网络偷听

来自 Web 应用程序的 HTTP 数据以纯文本形式在网络上传输,并容易受到网络偷听攻击,其中攻击者使用网络监测软件来捕捉敏感数据并可能修改敏感数据。

防止网络偷听并提供隐私的对策包括:

对数据加密。

使用加密的通讯通道,如 SSL。

数据篡改

数据篡改是指对数据的未经授权修改,通常发生在此数据通过网络传输时。

一种防止数据篡改的对策是使用防篡改协议(例如哈希消息验证代码 (HMAC))来保护通过网络传输的敏感数据。

HMAC 通过以下方法来提供消息的完整性:

1.

发件人使用共享的秘密密钥来创建基于消息负荷的哈希。

2.

发件人将哈希与消息负荷一同传输。

3.

收件人使用共享密钥根据收到的消息负荷重新计算哈希。收件人然后将新的哈希值与传输的哈希值进行比较。如果它们相同,则消息并未篡改。

返回页首返回页首

会话管理

Web 应用程序的会话管理是应用程序层的职责。会话安全对于应用程序的整体安全而言非常关键。

最大的会话管理威胁包括:

会话劫持

会话重播

Man in the middle

会话劫持

当攻击者使用网络监视软件来捕捉表示用户的会话和应用程序的身份验证令牌(通常是 Cookie)时,发生了会话劫持攻击。通过捕捉的 Cookie,攻击者可以哄骗用户的会话并获取应用程序的访问权。攻击者与合法用户具有相同级别的特权。

防止会话劫持的对策包括:

使用 SSL 来创建安全的通讯通道,并仅通过 HTTPS 连接传递身份验证 Cookie。

实现注销功能,允许用户在另一会话启动时结束强制进行身份验证的会话。

如果您未使用 SSL,请确保限制了会话 Cookie 的有效期。尽管这并不能防止会话劫持,但它减少了攻击者可用的时限。

会话重播

当攻击者截取并提交用户的会话令牌以便绕过身份验证机制时,即发生了会话重播。例如,如果会话令牌在 Cookie 或 URL 中以纯文本形式存在,则攻击者可以对其侦听。攻击者然后使用劫持的会话令牌发出请求。

有助于消除会话重播威胁的对策包括:

执行关键功能时重新进行身份验证。例如,在银行应用程序中执行货币转移之前,使用户再次提供帐户密码。

使相应的会话(包括所有 Cookie 和会话令牌)过期。

创建“do not remember me”选项,以不允许在客户端上存储会话数据。

Man in the Middle 攻击

当攻击者截取您与您的目标收件人之间发送的邮件时,发生了 man in the middle 攻击。然后,攻击者更改您的邮件,再将其发送给原来的收件人。收件人接收到邮件,发现邮件来自于您,则对邮件执行操作。当收件人向您回复邮件时,攻击者截取邮件并修改它,然后再发给您。您和您的收件人从不曾知道已遭到攻击。

任何涉及客户端-服务器通讯的网络请求(包括 Web 请求、分布组件对象模型 (DCOM) 请求)以及对远程组件和 Web 服务的调用都容易受到 man in the middle 攻击。

防止 man in the middle 攻击的对策包括:

使用加密。如果您在传输数据之前对其加密,则攻击者仍可以截取数据,但不能进行读取或修改。如果攻击者不能读取数据,则他或她将不知道要修改哪些数据。如果攻击者盲目修改了加密的邮件,那么原来的收件人将无法成功对其解密,结果是,收件人知道邮件已被篡改。

使用哈希消息验证代码 (HMAC)。如果攻击者修改了邮件,则在收件人处重新计算 HMAC 将失败,而且数据会因无效而被拒绝。

返回页首返回页首

加密

多数应用程序使用加密来保护数据,以确保数据保持专用而且不被修改。应用程序使用加密所面临的最大威胁包括:

不完善的密钥生成和密钥管理

弱加密或自定义加密

校验和哄骗

不完善的密钥生成和密钥管理

攻击者如果拥有加密密钥的访问权或获取了加密密钥,那么攻击者会对加密数据解密。如果密钥管理不完善,或者密钥并非以随机方式生成,则攻击者能够发现密钥。

解决密钥生成和密钥管理不完善问题的对策包括:

使用内置的、包括安全密钥管理的加密例程。数据保护应用程序编程接口 (DPAPI) 是 Windows 2000 及更高版本的操作系统提供的加密服务的示例,其中,操作系统管理密钥。

如果您使用要求生成或管理密钥的加密机制,则需使用强随机密钥生成功能,并将密钥存储在受限制的位置(例如,存储在受限制的 ACL 所保护的注册表项中)。

使用 DPAPI 来对加密密钥进行加密,以增加安全性。

定期使密钥过期。

弱加密或自定义加密

如果加密被破解或者易受到强力破解,则加密算法不提供安全性。自定义算法如果未经测试,则特别容易受到攻击。相反,应使用已发布的、众所周知的加密算法,它们已经历过多年的严峻攻击和仔细检查。

解决弱加密或自定义加密的漏洞的对策包括:

不要开发自定义算法。

使用平台提供的已经过验证的加密服务。

及时了解最新用于解密的破解算法和技术。

校验和哄骗

不要依赖哈希来提供网络发送邮件的数据完整性。哈希(如安全哈希算法 (SHA1) 和消息摘要压缩算法 (MD5))可能被截取和更改。考虑以下的基本 64 编码 UTF-8 邮件,它具有追加的消息验证代码 (MAC)。

Plaintext:Place 10 orders.
Hash:T0mUNdEQh13IO9oTcaP4FYDX6pU=

如果攻击者通过监视网络截取了邮件,则攻击者可以更新邮件并重新计算哈希(猜测您使用的算法)。例如,邮件可能被更改为:

Plaintext:Place 100 orders.
Hash:oEDuJpv/ZtIU7BXDDNv17EAHeAU=

当收件人处理此邮件时,他们通过哈希算法运行纯文本(“Place 100 orders”),并重新计算哈希,他们计算的哈希将等于攻击者所计算的值。

要应对这种攻击,需使用 MAC 或 HMAC。消息验证代码三重数据加密标准 (MACTripleDES) 算法计算 MAC,而 HMACSHA1 计算 HMAC。两种方法都使用密钥来产生校验和。采用这些算法,攻击者需要知道密钥,才能在收件人处生成计算正确的校验和。

返回页首返回页首

参数操纵

参数操纵攻击属于攻击的一种类型,它主要修改客户端和 Web 应用程序之间的发送的参数数据。这包括查询字符串、表格字段、Cookie 和 HTTP 头。最大的参数操纵威胁包括:

查询字符串操纵

表格字段操纵

Cookie 操纵

HTTP 头操纵

查询字符串操纵

用户可以轻易操纵由 HTTP GET 从客户端传递到服务器的查询字符串值,因为它们显示在浏览器的 URL 地址栏中。如果您的应用程序依赖查询字符串值来作出安全决策,或者如果此值表示敏感数据(如货币金额),则应用程序很容易受到攻击。

解决查询字符串操纵威胁的对策包括:

避免使用包含敏感数据或可能影响服务器的安全逻辑的数据的查询字符串参数。相反,应使用会话标识符来标识客户端,并在服务器的会话存储区中存储敏感项。

选择 HTTP POST 而不是 GET 来提交表格。

加密查询字符串参数。

表格字段操纵

以纯文本形式、采用 HTTP POST 协议将 HTML 表格字段的值发送到服务器。这可能包括可见的和隐藏的表格字段。任何类型的表格字段都容易被修改,而客户端一侧的验证例程被绕过。因此,服务器上依赖表格字段输入值来作出安全决策的应用程序便容易受到攻击。

为了应对表格字段操纵的威胁,不要使用隐藏的表格字段,而使用会话标识符来引用服务器的状态存储区中保留的状态。

Cookie 操纵

Cookie 容易被客户端更改。永久的和驻留在内存的 Cookie 都是如此。攻击者可以使用许多工具来修改驻留在内存的 Cookie 的内容。Cookie 操纵是指修改 Cookie 以获取对网站的未授权访问权的一种攻击。

尽管 SSL 保护网络上的 Cookie,但它并不阻止在客户端计算机上修改这些 Cookie。要应对 Cookie 操纵的威胁,需要对 HMAC 加密或将 HMAC 与 Cookie 一起使用。

HTTP 头操纵

HTTP 头在客户端和服务器之间传递信息。客户端构造请求头,而服务器构造响应头。如果您的应用程序依赖于请求头进行决策,那么您的应用程序容易受到攻击。

不要以 HTTP 头为基础作出安全决策。例如,不要信任 HTTP Referer 来确定客户端来源,因为这很容易伪造。

返回页首返回页首

异常管理

允许传播给客户端的异常会揭示内部实现的详细信息,此信息对最终用户而言毫无意义,但对攻击者而言非常有用。不使用异常处理或异常处理实现很不完善的应用程序容易受到拒绝服务攻击。最大的异常处理威胁包括:

攻击者揭示了实现详细信息

拒绝服务

攻击者揭示了实现详细信息

.NET Framework 的一个重要特征是它提供了充足的异常详细信息,该信息对开发人员而言毫无价值。如果同一信息落入攻击者手中,此信息将非常有助于攻击者利用潜在漏洞并规划以后的攻击。可以返回的信息类型包括平台版本、服务器名称、SQL 命令字符串和数据库连接字符串。

防止客户端揭示内部实现详细信息的对策包括:

在整个应用程序代码库中使用异常处理。

处理并记录可以传播到应用程序范围的异常。

将一般的、无害的错误消息返回到客户端。

拒绝服务

攻击者常常通过故意传递恶意的输入来刺探 Web 应用程序。他们通常有两个目标。第一个目标是引起异常以揭示有用信息,第二个目标是使 Web 应用程序进程崩溃。如果未正确捕捉并处理异常,则可能发生这种情况。

有助于防止应用程序级别的拒绝服务的对策包括:

彻底验证服务器上的所有输入数据。

在整个应用程序代码库中使用异常处理。

返回页首返回页首

审核和记录

使用审核和记录可帮助检测可疑的活动,如足迹跟踪或在利用发生前可能的密码破解尝试。它还有助于处理抵赖的威胁。如果在多个服务器上的一系列同步记录项表明用户执行了某项事务,那么对用户而言,否认进行了此操作是很难的。

最大的审核和记录相关威胁包括:

用户否认执行了某操作

攻击者利用应用程序,而不留任何踪迹

攻击者掩盖了其踪迹

用户否认执行了某操作

抵赖问题是指用户否认他或她曾执行了某操作或启动过某事务。您需要采取到位的防御机制以确保可以跟踪和记录所有的用户活动。

有助于防止抵赖威胁的对策包括:

审核并记录在 Web 服务器、数据库服务器和应用程序服务器(如果您使用了一台应用程序服务器)上的活动。

记录密钥事件,如事务、登录和注销事件。

不要使用共享帐户,因为原始来源无法确定。

攻击者利用应用程序,未留下任何踪迹

需要进行系统和应用程序级别的审核,以确保可以检测到可疑活动。

检测可疑活动的对策包括:

记录关键的应用程序级别的操作。

使用平台级别的审核来审核登录和注销事件、文件系统的访问权和失败的对象访问尝试。

备份日志文件并定期对其进行分析,以发现可疑活动的迹象。

攻击者掩盖了其踪迹

必须对日志文件进行完善的保护,以确保攻击者无法掩盖其踪迹。

有助于防止攻击者掩盖踪迹的对策包括:

通过使用受限制的 ACL 来确保日志文件的安全。

重新定位系统日志文件,使其不再位于默认位置。

返回页首返回页首

小结

了解了攻击者使用的常用方法以及他们的目标,您可以应用更加有效的对策。它还有助于您在考虑和识别威胁时使用基于目标的方法,并使用 STRIDE 模型来根据攻击者的目标对威胁分类(例如哄骗身份、篡改数据、拒绝服务、特权提升等)。这使您可以把精力集中在用于减少危险的常用方法上,而不是集中在识别每种可能攻击上,后者既耗时,还可能作用不大。

本模块向您介绍了可能危害您的网络、主机基础结构和应用程序的最大威胁。有关这些威胁的知识以及相应的对策为威胁建模过程提供了必要的信息。它使您可以识别特定于您的方案的威胁,并按照它们对系统构成危害的程度对其排序。这一识别威胁和对威胁排序的结构化过程称为威胁建模。有关更多信息,请参考模块 3 威胁建模。

返回页首返回页首

其他资源

有关相关的阅读材料,请参考以下资源:

有关网络威胁和对策的更多信息,请参考模块 15 保护您的网络。

有关主机威胁和对策的更多信息,请参考模块 16 保护 Web 服务器、模块 17确保应用程序服务器的安全、模块 18 保证数据库服务器的安全以及模块 19 确保 ASP.NET 应用程序和 Web Services 的安全。

有关解决本模块中提到的应用程序级别威胁的更多信息,请参阅本指南第 III 部分“构建安全的 Web 应用程序”中的“构建模块”。

Michael Howard and David LeBlanc, Writing Secure Code 2nd Edition.Microsoft Press, Redmond, WA, 2002(英文)

有关跟踪和解决缓冲区溢出的更多信息,请参阅 MSDN 文章修复缓冲区溢出问题!


返回页首返回页首