软件安全风险.pdf_第1页
软件安全风险.pdf_第2页
软件安全风险.pdf_第3页
软件安全风险.pdf_第4页
软件安全风险.pdf_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二讲 软件安全风险 n1.软件安全风险分类 软件源代码安全分类 WEB安全分类 攻击对象分类 软件生命周期分类 n2.典型安全风险介绍 本讲目标 n理解软件安全到底需要解决哪些问题 n了解目前软件中存在的主要问题 对这些安全漏洞的分类目 前有很多种,我们主要采用 McGraw提出的分类方法.将软 件代码中存在的安全漏洞分为 8类,分别是: 1 输入验证与表示输入验证与表示 2 API误用误用 3 安全特征安全特征 4 时间与状态时间与状态 5 错误处理错误处理 6 代码质量代码质量 7 封装封装 8 环境环境 软件安全风险 输入验证与表示 API误用 安全特征 时间与状态 错误处理代码质量 环境 封装 1.1 软件安全风险分类软件安全风险分类: Gary Mcgraw 软软 件源代码安全分类件源代码安全分类 软件代码安全问题分类原则- - 输入 验证与表示 输入验证和表示问题通常是由特殊字符、编码和数字表示 所引起的,这类安全问题的发生是对输入的信任所造成的。 一些较严重的安全问题往往都是由于对输入的信息过度信一些较严重的安全问题往往都是由于对输入的信息过度信 任造成的,主要问题包括:任造成的,主要问题包括: 输入验证与表示 输入验证与表示 软件代码安全问题分类原则- - API误用 API是调用者与被调用者之间的一个约定,大多数的API误 用是由于调用者没有理解约定的目的所造成的。 举个例子,如果一个程序在调用chroot()后调用chdir()失 败,那是因为它违背了约定所指定的如何在安全模式下改 变动态root目录。 另一个lib误用的好例子是调用者期望被调用者返回可信的 DNS信息,在该例子中,调用者根据自己对API功能的假 定(认为它会返回用于验证的值)来调用API,造成了被 调用API的误用。 API误用 nAPI误用包括以下方面: 危险函数(危险函数(Dangerous Function)不能被安全使用的函数不应该使用;不能被安全使用的函数不应该使用; 目录限制(Directory Restriction)不合理的使用系统调用chroot()可能使攻击 者逃脱chroot的限制 堆检查(Heap Inspection)堆检查经常出现类似密码等敏感信息因为 没有及时从内存中移走从而被黑客利用。 所以不应该使用realloc()重新分配藏有敏感 信息的缓冲区; 认证误用(Often Misused: Authentication) 攻击者经常伪造DNS进行攻击; 异常处理误用(Often Misused: Exception Handling) _alloca()函数会抛出stack overflow exception,从而会使程序当掉; 路径操纵误用(Often Misused: Path Manipulation) 传送一个大小不够的输出缓冲区给路径操 纵函数会导致缓冲区溢出; API误用 nAPI误用包括以下方面: 权限管理误用(权限管理误用(Often Misused: Privilege Management) 未能坚持最小权限原则会增大其他弱点出未能坚持最小权限原则会增大其他弱点出 现的风险;现的风险; 字符串操纵(Often Misused: String Manipulation) 在进行多字节和unicode字符串转换时容易 发生缓冲区溢出; 未检查的返回值(Unchecked Return Value) 不考虑方法的返回值会导致程序出现意外 的状况。 软件代码安全问题分类原则- - 安全特征 n安全特征主要关系认证,访问控制,机密性,密码,权限 管理等方面的内容:不安全随机数(不安全随机数(Insecure Randomness) 标标准准的的伪伪随机数随机数生生成成器器不能不能抵抗加密攻抵抗加密攻 击击; 最小权限违规(Least Privilege Violation) 程序在运行到需要将权限提高的函数时将 权限提高,当不需要时应立即将权限降到 最低 缺少访问控制(Missing Access Control) 程序未能在所有可能的执行路径执行访问 控制检查 口令管理(Password Management) 用明文存储密码或者口令为空将导致系统 的不安全。在HTTP重定向报文发送密码会 导致密码泄露 隐私违规(Privacy Violation)对私有信息的不恰当处理会给用户带来损 害。 软件代码安全问题分类原则- - 时 间与状态 分布式计算是与时间和状态有关的。也就是说,为了让多个 部件之间交互,需要状态共享,而这要花费时间。 大多数程序员将他们的工作人格化。他们认为控制器的一 个线程会按照他们所想的方式来执行整个程序。然而,现在 的计算机能在多任务之间快速切换,采用多核、多CPU或 者说分布式系统,两个事件甚至能在同一时间发生。 这样一来,在程序员所想的程序执行模式和实际发生的情况 之间就会产生问题。这些问题可能涉及到线程、进程、时间 和信息之间的非法交互。这些交互通过共享的状态产生:如 信号量、变量、文件系统以及任何能够存储信息的东西。 时间与状态 n包括以下方面: 死锁死锁(Deadlock)不一不一致致的的程序锁定程序锁定会会导致死锁导致死锁; 固定会话(Session Fixation)通过认证后使用同一个会话会导致攻击 者劫持已认证过的会话 文件访问竞争条件TOCTOU(File Access Race Condition: TOCTOU) 文件属性被验证和文件被使用之间的时 间差可以引起文件使用权限提升的攻击 不安全临时文件(Insecure Temporary File) 创建和使用临时文件可能会导致应用程 序和系统受到攻击; 软件代码安全问题分类原则 错误处理 错误和错误处理代表了一类API。与错误处理有关的错误是 很常见的。与API误用相比,和错误处理相关的安全漏洞一 般是两种方式造成的: 第一种是根本忘记处理错误或者只是简单的处理,并没有彻底解决 第二种则是程序对可能的攻击者泄露了过多的信息或者涉及面太广 没有人愿意去处理这些问题。 错误处理 n包括以下方面: 捕获空指针异常捕获空指针异常(Catch NullPointerException) 捕获捕获一一个空指针异常个空指针异常不是一不是一个有效个有效的的防防 止空指针发生止空指针发生的的办法办法 空的捕获(Empty Catch Block)忽视异常以及其他错误可能会导致攻击 者引发意想不到的行为 过度捕获异常(Overly Broad Catch Block) 捕获过多的异常会使错误处理代码过度 复杂,使代码更可能携带安全弱点 软件代码安全问题分类原则 代码质量 n低劣的代码质量会导致不可预测的行为。从用户的角度来看,这通常 会表现为低劣的可用性。对于攻击者而言,低劣的代码使他们可以以 意想不到的方式威胁系统: 双双重重释放释放(Double Free)对对同同一一个内存地址调个内存地址调用用2次次free()会会导致导致 缓冲区溢缓冲区溢出出 内存泄露(Memory Leak)内存分配却没有释放,会致资源枯竭 空指针调用(Null Dereference)程序使用一个空指针引用时,就会抛出 NullPointerException 已废弃(Obsolete)尽量不要使用已经废弃的函数; 未定义行为(Undefined Behavior)函数行为未定义,直到其控制参数被设 置为特定的值; 未初始化变量(Uninitialized Variable) 程序可能在变量没初始化之前使用它 未释放资源(Unreleased Resource)程序有时可能不能释放系统资源; 释放后使用(Use After Free)在内存已被释放后使用可能会导致程序 崩溃; 软件代码安全问题分类原则 封装 n封装就是划定强力的分界线。在web浏览器中,这就意味着你的代码 模块不能被其他代码模块滥用。在服务端,这意味着要区分校验过的 数据和未经校验的数据,区分不同用户的数据,或者区分用户能看到 的和不能看到的数据。 通通过过名字比名字比较类较类通通过过名字比名字比较类较类可可能会对能会对导致程序将两导致程序将两 个个不不同同的类的类认为认为是是相同相同的的 用户间数据泄露通过不同的会话访问同一个对象里的变 量,数据可能被泄露。例如servlert以及 通过共享池保存的对象 残留的debug代码Debug代码可能会无意识的在应用程序 中创建一些入口点; 系统信息泄露系统数据和调试信息的泄露会给攻击者 对系统发动攻击机会; 信任边界违规将可信的以及不可信的数据混杂在同一 个数据结构中可能会导致程序员错误地 信任未验证的数据。 软件代码安全问题分类原则 环境 环境包括的内容虽然是源代码之外的,但它们对产品的安全 性仍然至关重要。因为其覆盖的内容并不与源代码直接相 关,所以我们将它与其他内容分隔开来。 环境中可能存在风险例如: 不安全的编译器优化(Insecure Compiler Optimization) 不安全的传输(J2EE Misconfiguration: Insecure Transport) 弱访问许可(J2EE Misconfiguration: Weak Access Permissions) 配置文件中的密码(Password Management: Password in Configuration File) 1.2 OWASP的WEB安全风险分类 n认证(Authentication) n授权(Authorization) n客户端攻击(Client- side Attacks) n命令执行(Command Execution) n信息泄露(Information Disclosure) n逻辑攻击 认证(Authentication) n这一部分的安全威胁涵盖了针对Web应用 程序识别用户、服务或应用的方法的攻击。 n1.暴力破解(暴力破解(Bruce Force) n2.不充分认证(不充分认证(Insufficient Authentication) n3.弱口令恢复(弱口令恢复(Weak Password Recovery Validation) 授权(Authorization) n这一部分的威胁涵盖了对判断用户、服务或应用 是否具有进行某一请求操作所需要的授权的攻击。 n1.会话预测(会话预测(Credential/Session Prediction) n2.不充分授权(不充分授权(Insufficient Authorization) n3.不恰当的会话超时(不恰当的会话超时(Insufficient Session Expiration) n4.会话定置(会话定置(Session Fixation) 客户端攻击(Client- side Attacks) n客户端攻击关注的是来自Web站点用户的 滥用和恶意利用。 n1.内容欺骗(内容欺骗(Content Spoofing) n2.跨站脚本(跨站脚本(Cross- site Scripting) 命令执行(Command Execution) n命令执行所涵盖的攻击是指针对在Web站点上执 行远程命令的攻击。 n1.缓冲区溢出(缓冲区溢出(Buffer Overflow) n2.格式化字符串攻击(格式化字符串攻击(Format String Attack) n3.LDAP注入(注入(LDAP Injection) n4.运行操作系统命令(运行操作系统命令(OS Commanding) n5.SQL注入(注入(SQL Injection) n6.SSI注入(注入(SSI Injection) n7.XPath注入(注入(XPath Injection) 信息泄露(信息泄露(Information Disclosure) n信息泄露部分涵盖的是获取Web站点特定系统信息的攻击。 特定系统信息包括软件部署、版本、补丁级别,或者是备 份和临时文件的存放路径等。大多数情况下,都不需要公 开这些信息来满足用户的需求,因此应该尽可能地将这些 信息隐藏起来。 n1.目录索引(目录索引(Directory Indexing) n2.信息泄露(信息泄露(Information Leakage) n3.路径递归(路径递归(Path Traversal) n4.可预见的资源位置(可预见的资源位置(Predictable Resource Location) 逻辑攻击逻辑攻击 n逻辑攻击部分关注的是对Web应用逻辑的滥用和 非法利用。应用逻辑是指执行一个特定动作的过 程,如密码恢复、账户注册等都属于应用逻辑。 n1.功能误用(功能误用(Abuse of Functionality) n2.拒绝服务(拒绝服务(Denial of Service) n3.不充分的过程验证(不充分的过程验证(Insufficient Process Validation) 1.3根据攻击对象的分类 n软件的安全威胁的对象各不相同。拒绝服 务攻击是针对软件服务器所在网络的;命 令执行的对象是软件服务器所运行的主机、 服务器软件等;不充分认证和授权则是针 对软件应用的威胁。据此,可以将软件安 全威胁划分为网络级、主机级和应用级。 网络级软件安全威胁 n构成网络基础结构的主要组件有路由器、 防火墙和交换机。它们担当网关守卫的角 色,来保护服务器和应用程序不受攻击与 入侵。常见的缺陷包括脆弱的默认安装设 置、对外开放的访问控制等。主要的网络 级威胁包括: n会话预测 n拒绝服务 主机级软件安全威胁 n主机威胁主要针对构建应用程序的系统软件,也还可能威 胁到架设系统软件的主机,包括操作系统、应用服务器 (如IIS、Apache等)和数据库服务器(如SQL Server、 Oracle等)。主要的主机级威胁包括: n暴力破解 n拒绝服务 n跨站脚本 n命令执行 n信息泄露 应用级软件安全威胁 n应用级威胁的主要攻击对象是Web应用,即这些威胁都是要针对每一 个软件应用的不同实现(实现语言、部署方式等)来进行不同的有针 对性的攻击。应用级威胁攻击的目标包括获取应用内受保护的信息、 破坏应用所能提供的服务、窃取使用同一应用的其他帐号信息等。主 要的应用级威胁包括: n不充分认证 n脆弱的密码恢复验证 n不充分授权 n会话定置 n客户端攻击 n命令执行 1.4 根据软件生命周期的分类 n此处所涉及的软件生命周期是指设计、开发和管理配置这三个层面。 在这三个层面上,软件安全威胁可以被划分到不同的阶段加以改善、 防范或解决。 n例如,如果在设计阶段,充分考虑了身份验证策略,如使用强密码、 支持密码期限和账户禁用等,那么就可以在很大程度上抵御暴力破解 的攻击,从而大大降低了暴力破解的成功率。 n再如,如果在开发编码阶段,制定并实施了详细的安全代码规范,那 么就完全可以避免Java代码发生SQL注入攻击示例的情况。 n在管理配置层面,如果根据实际需要合理配置会话的超时时间就可以 避免不恰当的会话超时攻击;而如果注意了Web服务器对于目录索引 的缺省配置,那么也就可以避免目录索引攻击的发生 不恰当的会话超时、信息泄露不恰当的会话超时、信息泄露管理配管理配 置置 不充分认证、会话预测、会话定置、内容欺骗、跨站脚本、命不充分认证、会话预测、会话定置、内容欺骗、跨站脚本、命 令执行、不充分的过程验证令执行、不充分的过程验证 开发开发 暴力破解、不充分认证、脆弱的密码恢复验证、会话预测、不暴力破解、不充分认证、脆弱的密码恢复验证、会话预测、不 充分授权、功能误用、拒绝服务、不充分的反机器人机制、充分授权、功能误用、拒绝服务、不充分的反机器人机制、 不充分的过程验证不充分的过程验证 设计设计 软件安全威胁软件安全威胁层次层次 2.典型安全风险介绍 2.1 竞态条件: n竞态条件是指使用应用安全控制和使用该服务之 间的时差。 n由和事件时间相关的意料之外的依赖所导致的反 常行为。换句话说,由程序员不正确地假设一个 特殊的事件总是在另一个事件之前发生而导致的 反常行为。 竞态条件: n每一个线程竞相在其它线程进入同一关键代码部 份前完成它自己的关键代码部份的行为。因为线 程的执行顺序是不可知的,所以不能保证一个线 程能够在其它线程进入关键代码部份前完成它自 己的关键代码部份。因此,我们会有竞态条件引 起不一致。 n要阻止竞态条件,每一个线程必须在其它线程进 入同一关键代码部份或其它操作同一共享变量或 资源的相关关键代码部份前完成它自己的关键代 码部份。 竞态条件 p竞态条件发生在以下三种情况: 1.静态数据库连接:静态数据库连接: n问题:在静态域中存储的数据库连接会在多个线 程间共享。 n说明:一个事务资源对象,如数据库连接,一次 只能与一个事务关联。因此,一个连接不应该在 线程间共享,也不应该存储在一个静态域中。 竞态条件 2.文件访问文件访问 文件访问的竞态条件发生在: n1)程序校验文件的属性,通过名字来引用文件。 n2)程序随后用同一个文件名进行文件操作,认为 文件仍然保持之前校验过的属性。 n利用校验文件属性和使用文件之间的时间差可以 进行权限扩大攻击。 n实例1:面的代码来自于一个setuid root的程序。程序允许 没有特权的用户进行某些文件操作,为了防止用户利用程 序的root权限来进行未经授权的操作,程序在打开文件进 行操作前,会调用access()来校验用户是否有权限去访问 指定文件。 竞态条件实例 if(!access(file,W_OK) f = fopen(file,“w+“); operate(f); . else fprintf(stderr,“Unable to open file %s.n“,file); n实例说明: 若运行程序的用户有权限去写文件,access()会返回0,否则返回- 1。 然而由于access()和fopen()都是对文件名而不是对文件句柄进行操 作,所以并不能保证access()和fopen()所用file变量是指向同一个文件。 如果攻击者在调用access()后将file替换为指向另一个文件的符号链 接,那么即使这个文件不允许攻击者修改,程序也会利用root权限对该 文件进行操作。通过欺骗程序让它进行不被允许的操作,攻击者获得 了更高的权限。 这种攻击并不仅限于有root权限的程序,如果一个应用程序可以进行攻 击者不被允许的操作,那么它就有可能成为攻击者的目标。 这种攻击的原因是校验文件的时间和使用文件的时间之间存在间隔。 即使在校验之后立即使用,现在的操作系统也不能保证CPU会立即执 行。攻击者有各种技术可以用来延长此时间间隔,但即使是很小的时 间间隔,攻击者也可以反复尝试攻击,直到成功为止。 竞态条件实例 竞态条件 3.单独的成员域单独的成员域 n问题简介:Servlet成员域可能允许一个用户看到另一个用 户的数据。 n说明:很多Servlet开发者并没有认识到:只有当一个 Servlet实现了SingleThreadModel接口时,这个Servlet才 是单独的。否则只会有一个Servlet实例,这个Servlet实例 被反复使用,用来处理不同线程同时进行的多个请求。 n这种误解所造成的一个常见的后果就是开发者在使用 Servlet成员域的时候,一个用户可能会在不经意间看到另 一个用户的数据。换句话说,将用户数据存储在Servlet成 员域中会导致数据访问的竞态条件竞争条件。 n实例1:下面的Servlet将一个请求的参数值存储在成员域 中,然后在响应输出流中将该参数值输出。 竞态条件实例 public class GuestBook extends HttpServlet String name; protected void doPost (HttpServletRequest req, HttpServletResponse res) name = req.getParameter(“name“); . out.println(name + “, thanks for visiting!“); n在单用户环境下该代码可以完美的运行,但是如果在差不 多同一时间有2个用户访问这个Servlet,那么处理这2个请 求的线程很可能以如下方式工作: 竞态条件实例 Thread 1: 分配 “Dick“ 给 name Thread 2: 分配 “Jane“ 给 name Thread 1: 打印 “Jane, thanks for visiting!“ Thread 2: 打印 “Jane, thanks for visiting!“ 这样就把第2个用户的名字显示给了第1个用户。 2.2 HTTP应答截断(应答截断(HTTP Response Splitting) 问题简介问题简介: 在HTTP响应头中包含未经验证的数据将可能导致缓存中毒(cache- poisoning)、跨站脚本(cross- site scripting)、跨用户攻击(cross- user defacement)或者页面劫持(page hijacking)攻击。 HTTP应答截断攻击发生在:应答截断攻击发生在: 数据通过一个非可信源进入web应用程序,最可能的是通过HTTP请 求。 包含在HTTP响应头中发送给web用户的数据没有对恶意字符进行验 证。 HTTP应应答截断答截断(HTTP Response Splitting) 与很多软件安全攻击一样,HTTP响应截断是一种达到目的的手段,它本 身并不是目的。起初,这种攻击很简单:攻击者传递恶意数据给有漏洞的 应用程序,应用程序将这些数据包含在HTTP响应头中。 要想成功地使用该攻击,应用程序必须允许响应头中包含CR(回车,即 %0d或者r)和LF(换行,即%0a或者n)字符。这些字符不仅使得攻击者 可以控制应用程序发送的部分响应头和响应体,还使得攻击者可以创建能 够完全控制的HTTP响应。 在HTTP响应头中包含未经验证的数据,将可能导致: 缓存中毒(cache- poisoning) 跨站脚本(cross- site scripting) 跨用户攻击(cross- user defacement) 页面劫持(page hijacking) HTTP应应答截断答截断(HTTP Response Splitting) 攻击者可以制作一个专门的请求发给有漏洞的服务端,服务 端将会创建两个响应,第二个响应会被误解为是另一个请求的 响应,这个请求是由使用同一个TCP连接访问服务端的另一个 用户发来的。 当攻击者诱使用户自己提交恶意请求时,或者更隐蔽的,当 攻击者与用户共用同一个TCP连接到服务端(比如共享的代理 服务)时,就可以完成上述攻击。最好的情况下,攻击者可以 通过这种攻击使用户认为应用程序已经被修改了,导致用户对 应用程序的安全性失去信心。最糟的情况下,攻击者可以模仿 应用程序,提供相似的内容,诱使用户将私有信息(如账号和 密码)发送给攻击者。 跨跨用用户户攻击攻击: 一旦攻击者可以控制应用程序发送的响应,他们就可以选择 各种恶意内容来提供给用户。 跨站脚本是最常见的攻击,它在用户浏览器上执行响应中包 含的恶意JavaScript或者其他代码。基于XSS的攻击种类几乎 是无限的,但是它们通常会包括:传送私有数据(如cookies 或者其他session信息)给攻击者,将受害者的浏览器重定向 到攻击者所控制的web内容中,或者假借有漏洞的站点在用户 机器上进行其他恶意操作。 针对一个有漏洞的应用程序的用户,最常见的也是最危险的 攻击方式是通过JavaScript将session和认证信息发送给攻击 者,使得攻击者能够完全控制受害者的账号。 跨站脚本跨站脚本: 除了通过有漏洞的应用程序来发送恶意内容给用户以外,这种攻 击还能够将服务端生成的要发送给用户的敏感内容重定向给攻击者。 攻击者通过一个请求生成两个响应,一个是服务端原有的响应,一 个是攻击者制造的响应。然后攻击者通过一个中间节点,如共享的 代理服务,将服务端产生的发给用户的响应指向攻击者。因为攻击 者制造的请求产生了两个响应,第一个作为攻击者请求的响应,第 二个会保留在响应池中。当用户通过同一个TCP连接提出HTTP请求 时,由于攻击者制造的响应已经存在,所以该响应会被当作用户的 响应发送给用户。然后攻击者发送第二次请求给服务端,此时代理 服务器就会把服务端生成的原本要发给用户的响应当作攻击者的响 应发送给攻击者,这样攻击者就能从该响应中获取危及用户安全的 敏感信息。 页面劫页面劫持:持: 实例:实例:下面的代码段从HTTP请求中读取一篇博客文章的作者名author, 然后将它放入HTTP响应的cookie头。 String author = request.getParameter(AUTHOR_PARAM); . Cookie cookie = new Cookie(“author“, author); cookie.setMaxAge(cookieExpiration); response.addCookie(cookie); String author = request.getParameter(AUTHOR_PARAM); . Cookie cookie = new Cookie(“author“, author); cookie.setMaxAge(cookieExpiration); response.addCookie(cookie); HTTP应应答截断答截断(HTTP Response Splitting) 假如在HTTP请求中提交的字符串是由标准的文字和数字字符组成,如“Jane Smith”,那么HTTP响应中包含的cookie可能是如下形式: HTTP/1.1 200 OK . Set- Cookie: author=Jane Smith HTTP/1.1 200 OK . Set- Cookie: author=Jane Smith 然而,因为cookie的值是根据未经验证的用户输入生成的,所以只有当 提交的Author.Text的值中不包含任何CR和LF字符时,HTTP响应才会是以 上 形 式 。 如 果 攻 击 者 提 交 了 一 个 恶 意 字 符 串 , 比 如 “ Wiley HackerrnHTTP/1.1 200 OKrn.”,那么HTTP响应将被分割为如下两个响 应: HTTP/1.1 200 OK . Set- Cookie: author=Wiley Hacker HTTP/1.1 200 OK . HTTP/1.1 200 OK . Set- Cookie: author=Wiley Hacker HTTP/1.1 200 OK . 显然,第二个响应是由攻击者完全控制的,它能够构成任何攻击者想 要的响应头和响应体。这种攻击者可以构造任意HTTP响应的能力可以 导致各种攻击 HTTP应应答截断答截断(HTTP Response Splitting) 说明: n造成http响应头截断漏洞的主要原因是对用户提交的非法字 符没有进行严格的过滤,尤其是CR,LF字符的输入。攻击者 通过发送一经过精心构造的request,迫使服务器认为其返 回的数据是两个响应,而不是常规的一个响应。 n当可以通过精心制作的request完全控制第二个响应时,可 以通过这样来实现攻击: 发送两个请求A,B。A请求包含构造数据,该请求致使服务 器返回两个响应R1,R2,其中R2是可以通过在A中的精心 构造而完全控制的。服务器将R1作为response返回给A,而 第R2则被服务器作为B的response而返回给了B即使R2并 不是服务器自己生成的)。 Request A- - - - - - - - - - - - - Web Server(R1,R2) Request B- - - - - - - - - - - - - Web Server (本该是R3) Web Server(R1)- - - - - - - - - - - - A Web Server(R2)B 解决方案: n要想进行HTTP响应截断攻击,应用程序必须允许响应头 中包含CR(回车,即%0d或者r)和LF(换行,即%0a或 者n)字符。所以我们可以在数据进入应用程序之前把可 能的危险拦截,针对CR和LF字符进行过滤。 2.3系统信息泄漏 n问题简介: 当系统数据或者调试信息通过输出流或者日志函 数离开系统时,会发生信息泄露。 说明: nHTML注释中暴露的任何信息都可能会帮助攻击者了解系 统并制定攻击计划。 n暴露系统数据或者调试信息会帮助攻击者了解系统并制定 攻击计划。 n如果Servlet不能抓住所有的异常,那么暴露的异常信息会 帮助攻击者制定攻击计划。 n数据库错误信息可能会暴露应用程序容易遭受SQL注入攻 击。其他错误信息可能会暴露更多关于系统的间接线索。 n实例 1: 下面的代码将一个异常在标准错误流中打印出来。 系统信息泄露实例 try . catch (Exception e) e.printStackTrace(); u根据系统设置,该信息可能出现在控制台、写入日志文件或者暴露给一 个远程用户。在某些情况下,错误信息会准确的告诉攻击者系统容易遭受 哪类攻击。举个例子,数据库错误信息可能会暴露应用程序容易遭受SQL 注入攻击。其他错误信息可能会暴露更多关于系统的间接线索。在上述例 子中,搜索路径可能会暗含操作系统的类型信息、系统安装的应用程序信 息以及管理员放入程序配置的信息。 n实例 2:HTML注释为攻击者提供了一个方便的信息源,攻击 者可以通过注释了解动态生成的web页面的信息。 系统信息泄露实例 . 每一个看起来无害的注释对于那些企图了解系统构造的人来说都可能是有 用的。 n实例当Servlet抛出异常时,默认的错误处理方式是容器将 调试信息返回给用户,这些信息对攻击者来讲非常有用。 系统信息泄露实例 protected void doPost (HttpServletRequest req, HttpServletResponse res) throws IOException String ip = req.getRemoteAddr(); InetAddress addr = InetAddress.getByName(ip); . out.println(“hello “ + addr.getHostName(); DNS查询失败会使Servlet 抛出异常。 2.4 密码管理:源代码中的密码 n问题简介: 将密码放在源代码中或者以明文形式存储 密码可能导致系统安全受到威胁。 源代码中的密码会危及系统安全,并且很 难补救。 说明: n源代码中的密码不仅使得所有的工程开发者可以 看到密码,还使得修改问题变得非常麻烦。一旦 这种代码出现在产品中,那么不对软件进行修改 就无法改变密码。 n如果密码保护的帐户受到了安全威胁,那么系统 的所有者将不得不在安全性和实用性之间做出选 择。 下面的代码使用源代码中的密码来连接数据库 . DriverManager.getConnection(url, “scott“, “tiger“); . n代码能够成功运行,任何人只要能够访问该代码,就能读 取密码。一旦程序开始运行,就没有办法对数据库用户 scott和密码tiger进行改动,除非修改程序。 n如果攻击者能够访问该信息,就能用它来侵入系统。更糟 的是,如果攻击者能够访问应用程序的class文件,他们 就能用javap c命令分解反编译代码,找出包含的密码值。 n这种操作可能以如下形式: javap - c ConnMngr.class 22: ldc#36; /String jdbc:mysql://rxsql 24: ldc#38; /String scot 26: ldc#17; /String tiger 2.5 日志伪造日志伪造 n问题简介: 应用程序使用日志文件来存储历史事件或者事务,用于日 后的检查、统计或者调试。检查日志文件的工作可能是按照 需要手动进行,也可能是通过工具自动选出日志中的重要事 件或者趋势信息。 将未经验证的用户输入写进日志文件,会让攻击者能够伪 造日志或者向日志中注入恶意内容。 详细描述 n攻击者可能通过向应用程序提供包含特定字符的输入来向 日志文件中插入错误记录。如果日志文件是自动处理的, 那么攻击者能够通过破坏文件格式或者注入非法字符来致 使日志文件不可用。 n通过伪造或者其他方法,被破坏的日志文件可以用来掩盖 攻击者的踪迹甚至用来暗示是其他人进行了恶意攻击。 n在最坏的情况下,攻击者可能向日志文件中注入代码或者 其他命令,在日志处理过程中进行攻击。 详细描述 n日志伪造攻击发生在: 1.数据通过一个非可信信源进入应用程序。 2.数据被写入应用程序的日志文件或者系统 的日志文件。 nExample:下面的web应用程序代码试图从请求中读取一个 整数值,如果这个值不能被转化为整数,那么这个输入会 被作为错误信息记录到日志以说明发生了何种错误。 . String val = request.getParameter(“val“); try int value = Integer.parseInt(val); catch (NumberFormatException) (“Failed to parse val = “ + val); . 详细描述 详细描述 n如果用户提交了字符串“twenty- one”作为变量val,那么下 面的信息会被记录到日志: INFO: Failed to parse val=twenty- one n如果攻击者提交了字符串“twenty- one%0a%0aINFO:+User+logged+out%3dbadguy”,那么 记录到日志的信息如下: INFO: Failed to parse val=twenty- one INFO: User logged out=badguy n很显然,攻击者可以利用相同的机制向日志中插入任意信 息。 解决方案: n应用程序应该避免将用户的输入直接记入日志, 可以根据产生的异常,在程序内部生成日志信息 记入日志。 n如果需要将来自于外部的数据记入日志,则需要 对记入日志的数据进行校验,过滤非法字符。 n此外,应该对日志文件进行严格的访问控制,杜 绝未经授权的用户访问日志。 2.6 缓冲区溢出 n问题简介: 在所分配的内存块之外进行写操作会覆盖数据, 使程序崩溃甚至导致执行恶意代码。 n在缓冲区溢出攻击中,攻击者向程序发送大于堆 栈缓冲区的数据块,导致堆栈上的数据被覆盖, 甚至程序的返回地址被覆盖。当程序返回时,将 会返回到攻击者的恶意代码段,从而完成攻击。 下图是一次堆栈溢出的示意图: 可以直观的见到,写入内存的数据大于我们分配的长度, 导

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论