SQL注入攻击分析与防御
第1章网络攻击与防范的机制及其原理1.1网络攻击过程如今 ,计算机网络已经成为工 、农、商以及国防等方面的重要信息交换手段 ,渗透到社会生活的各个领域。于是一些为了追逐金钱和利益以及其他目的的人(一般称其为黑客) 。通过网络利用各种“手段”非法获得他们所需的信息 。这些“手段”也就是所谓的网络攻击。网络攻击具有以下特点:
①没有地域和时间的限制 ,跨越国界的攻击就如同在现场一样方便 ;
②通过网络的攻击往往混杂在大量正常的网络活动之中 ,隐蔽性强 ;
③入侵手段更加隐蔽和复杂。
通常来说 ,一般的网络攻击行为都要经过以下阶段 :
(1)收集信息
通过多种途径获得有关目标系统的大量信息 ,包括域名 、IP地址范围 、邮件地址 、用户帐号、网络拓扑、路由跟踪信息、系统运行状态等等 。其工具以有命令行方式运行的finger 、whois 、ping 、traceroute等;也有以图形界面方式运行的VisualRoute 、AmartWhois 、SamApade、NeoTracePro、NetScanTools工具等 。这个是为进一步的探测和攻击所用的。
(2)扫描
也称探测漏洞。也就是要找到一些敏感的信息或漏洞,并针对具体的脆弱性研究相应的攻击方法。例如,某些产品或操作系统,已发现有些安全漏洞,且该产商也提供了“补丁”程序,但用户并不一定及时使用了这些“补丁”程序来补上漏洞 。黑客一旦扫描到这些“补丁”程序的接口后就通过自编程序 ,从这个忘记打“补丁”的接口进入系统 。黑客可用的扫描手段包括端口扫描 、操作系统类型探测、针对特定应用及服务的漏洞扫描(包括Web漏洞扫描 、Windows漏洞扫描、SNMP漏洞扫描、RPC漏洞扫描等) 。
(3)嗅探
它是黑客攻击过程中较为灵活的一种手段,如果满足必要的条件 ,通过嗅探,黑客可以获得大量的敏感信息 ,包括用户帐号 、登陆口令、邮件内容等 ,它更难被察觉 ,也更容易操作。对安全管理人员来说,借助嗅探技术,可以对网络活动进行实时监控 ,并及时发现各种网络攻击行为 。
(4)攻击
这就是黑客实施攻击行为的阶段 ,也就是实现其最直接的攻击目的 。对于黑客攻击的目的无非有两种:一种是给目标以致命打击 ,使其丧失基本能力 ,让目标系统受损,甚至瘫痪;另一种目的就是在于获取直接的利益 ,比如截取到目标系统的机密信息 ,又或是得到目标系统的最高控制权 。在此过程中,黑客无意对目标系统的正常工作能力进行破坏 ,一般都希望能非常隐蔽地实现自己的目的。在稍后的文章里 ,我将简要的介绍一些攻击方法。
(5)消灭痕迹
获得目标系统的控制全后 ,攻击者会清理自己先前“工作”过程中遗留下来的黑机,列如Web服务器的日志 ,时间日志等。这样攻击者才能不被机警的管理员发现并追踪 。
(6)留置后门
在完全控制了受害主机之后,为了使以后远程操作时更加隐蔽和方便 ,又或计划将受害主机作为跳板去进一步攻击新的目标,攻击者通常都会在受害主机上安装各种后门程序 ,这些程序操作灵活,运行方式灵隐蔽 ,是黑客控制受害主机的利器 。
1.2网络攻击类型以及常见的网络攻击那么计算机网络系统开放式环境面临的威胁有那些呢?主要有以下几种类型 :①欺骗(Masquerade);②重发(Replay);③报文修改(Modificationofmessage);④拒绝服务(Denyofservice);⑤陷阱门(Trapdoor);⑥特洛伊木马(Trojanhorse) ;⑦攻击如透纳攻击(TunnelingAttack) 、应用软件攻击等 。以下是几种常见的网络攻击 :
●分布式拒绝服务攻击(DistributedDenialofService,DDoS)
可以说是DoS攻击的变种。由于DoS攻击的攻击源多是单个主机或单个网络 ,在现在普遍带宽的网络环境中,加上通信协议以及系统防护能力的加强 ,以及单点攻击手段容易被追查等“不足”,就使得传统的DoS攻击手段就失去了往日的“魅力”,于是就出现了DDoS 。黑客使用DDoS工具 ,往往可以同时控制成百上千的攻击源 ,向某个单个目标发动攻击 ,导致目标系统无法正常的运行或处理正常的服务请求 。从遭受攻击的主机来看,一种是因为对突入其来的服务请求应接不暇 ,或者是系统资源的最终耗尽而导致系统服务的实际“停顿” ;另一种就是因为系统某方面的漏洞被黑客利用而导致系统全面崩溃 。一些典型的DDoS攻击工具有 :Trinoo、TFN(TheTribeFloodNetwork) 、Stachelaraht、Trinityv3、Shaft 、TFN2K等 。在发动DDoS攻击之前,黑客一般都需要先控制一个或多个高带宽网络上的主机系统 ,并在这些被控制的主机(也称作Master)上加载许多黑客工具 ,包括Scanners 、Exploittools、Rootkits、DDoS工具等 ,然后借助一些自动化工具 ,在网络中扫描并攻击那些具有特定漏洞的主机 ,并在上面加载Daemon(守护进程端 ,是实施攻击的前锋)软件 ,黑客维护一个受空主机的Daemon ,并策动Master与Daemons进行通信 ,Master上的工具软件也可以自动发现其他的受控系统。有了这些前期准备 ,黑客就可以利用DDoS攻击工具开始他的攻击了 。由于DDoS攻击的具体方式多种多样 ,所以对DDoS的防御至今也没有一种很好的解决办法 。其最基本防御方法 ,那就是先解决好操作系统 、协议栈 ,以及网络服务和应用系统的漏洞问题 。但是我们也可以借助被称作find-ddos的系列工具来帮助我们发现多种常见的DDoS攻击。
●IP欺骗攻击
IP欺骗是利用了主机之间的正常信任关系来发动的。它伪造数据包源IP地址来进行攻击,其实现的可能性基于两个前提:第一 ,目前的TCP/IP网络在路由数据包时 ,只判断目的IP地址 ,并不对源IP地址进行判断 ,这就给伪造IP包创造了条件 ;第二 ,两台主机之间 ,存在基于IP地址的认证授权防卫,这就给会话劫持(SessionHijack ,是一种结合了嗅探和欺骗技术在内的攻击手段 。所谓会话劫持 ,就是在一次正常的通信过程中,黑客做为第三方参与其中 ,或者是在数据流里注射额外的信息 ,又或是将双方的通信模式暗中改变)创造了条件。其具体攻击步骤是:(为了好表示 ,我用H表示攻击者 ,A表示被攻击目标 ,T表示被A信任的主机)
(1)首先使被信任主机T的网络暂时瘫痪 ,即实施拒绝服务攻击 ,以免对攻击造成干扰;
(2)攻击者H连接到被攻击目标A的某个端口来猜测ISN(InitialSequenceNumber ,TCP连接的初始序列号)基值以及规律 ,以估算下一次连接是A的ISN值 ;
(3)接下来把源址址伪装成被信任主机T ,发送带有SYN标志的数据(源IP为T ,H的ISN为M,连接rlogin端口(端口号是513);
(4)然后等待目标机A发送SYN+ACK ,A的ISN为N,应答号为M+1包给已经瘫痪的主机T ;
(5)在等待一恰当的时间后,攻击者H再次伪装成T向目标主机A发送的ACK ,源IP为T ,H的应答号为N+1 。此时发送的数据段中N的值是H估算出来的 ;
(6)连接建立 ,发送命令请求。
其防御策略就是让操作系统使用较强壮的随机系列号生成器 ,使其很难猜测TCP连接的ISN 。为了有效防范这种攻击 ,需注意 :①对进入本网络的IP包 ,要检查其源IP地址,禁止外来的却使用本地IP的数据报进入,避免IP欺骗 ;②禁止r-类型的服务 ,不要使用简单的基于IP地址的认证机制,用SSH代替Telnet 、rlogin这样的不安全网络服务;③如果是Linux系统 ,可以借助路由模块的源地址过滤功能防止IP欺骗。
●缓冲区溢出攻击(BufferOverflowAttactiong)
它是近年来应用非常广泛的一种攻击手段 。先来看下缓冲区和溢出的定义 :缓冲区是程序运行期间 ,用于保存包括字符数组在内的各种数据库类型 ;而溢出,其实就是所填充数据超出了原有缓冲区的边界,并非法占据了另一段内存区域 。所谓缓冲区溢出 ,就是由于填充数据越界而导致程序原有流程的改变,黑客借此精心构造填充数据,让程序转而执行特殊的代码 ,最终获取系统的控制权。按填充数据溢出的缓冲区位置来看 ,可以有栈溢出(StackOverflow) 、堆溢出(HeapOverflow)以及BSS(静态数据区),还有近两年出项的溢出类型是格式化字符串溢出 ;如果按照黑客重新定向程序流程的方式来看 ,有直接植入黑客自己代码的方式,也有跳转执行系统中已经加载了的代码的方式;而根据黑客利用缓冲区溢出漏洞的外部条件的不同 ,有可以分为本地缓冲区溢出和远程缓冲区溢出。从技术上讲,缓冲区溢出牵涉的内容非常广泛,要求也比较高 。再加上论文的中心不在于此 ,因此就不再赘述 。如果想继续深入的了解它 ,可以参考其他方面的资料 。
●木马
对于木马 ,有趣的是,如果你看过电影“特洛伊木马”,那么你就应该知道在故事的结局中 ,古希腊士兵藏在木马内进入特洛伊从而占领它,获得胜利 ,结束了延续几年的战争 。这就是木马的来源 。在Internet上 ,“特洛伊木马”指一些程序设计人员在其可从网络上下载(Download)的应用程序或游戏中 ,包含了可以控制用户的计算机系统的程序 ,可能造成用户的系统被破坏甚至瘫痪 。“木马”程序会想方设法的隐藏自己 ,其主要途径有 :在任务栏中隐藏自己,只要把Form的Visible属性设为False、ShowInTaskBar设为False ,程序运行时就不会出现在任务栏中了 。在任务管理器中隐形 :将程序设为“系统服务”可以很轻松地伪装自己。木马会在每次用户启动时自动装载服务端 ,并无声无息地启动 。“木马”会用上Windows系统启动时自动加载应用程序的所有方法,如:启动组、win.ini、system.ini 、注册表等等都是“木马”藏身的好地方 。知道了木马的藏身之所,就可以很好的查杀它了 。
1.3网络攻击的新趋势在最近几年里,伴随网络技术的飞速发展 ,网络攻击技术与攻击工具也有了新的发展趋势,使借助网络运行业务的机构面临的风险更大。其发展的趋势主要有 :(1)自动化程度和攻击速度提高 。表现在攻击工具的自动化水平的提高 ,攻击的传播速度加快以及能够自我传播等 ;(2)攻击工具复杂化 。与以前的相比 ,现在的攻击工具更难发现和检测 ,隐蔽性较强 ,其“智能化”也有所提高,能够根据随机选择 、预先定义的路径或是黑客直接的管理 ,来变化其模式和行为 ;可在每次攻击中出现多种不同形态的攻击工具 ,并可执行在多种操作系统平台之上;(3)发现安全漏洞越来越快 。通常在管理人员用上补丁修补已发现的漏洞后 ,黑客就又能够发现漏洞的新类型 ;(4)越来越高的防火墙渗透率。越来越多的攻击技术能够饶过作为网络卫士的防火墙 ,如Internet打印协议(IPP)和基于Web的分布式创作与翻译(WebDAV) ;(5)越来越不对称的威胁。网络上的安全是相互依赖的 。每个网络系统遭受攻击的可能性取决于连接到全球网络上其他系统的安全状态 。攻击技术的不断进步,攻击者可以轻松地利用分布式系统,对一个受害者发动破坏性的攻击 。随着自动化程度和攻击工具管理技巧的提高,威胁的不对称性将继续增加 ;(6)对基础设施将形入侵成越来越大的威胁 。基础设施攻击是大面积影响Internet关键组成部分的攻击 。由于用户过多地依赖Internet完成日常业务,就引起人们对基础设施攻击极大的担心 。基础设施面临分布式拒绝服务攻击、蠕虫病毒 、对Internet域名系统(DNS)的攻击和对路由器攻击或利用路由器的攻击。
1.4网络安全防范既然威胁存在 ,我们就不能坐以待毙。认清网络的脆弱性和潜在威胁 ,采取有力的安全防范技术,来保障网络的安全性 ,维护网络世界的“和平” 。要进行网络安全建设,就必须通过技术手段以及有效的管理来确保信息系统的安全性。安全性主要体现在信息安全的保护和系统安全的保护两点上 。保护信息安全就是要保护系统运行过程中信息的机密性 、完整性和可用性。网络安全技术包括网络隔离、访问控制 、加密通道 、入侵检测 、安全扫描等。
(1)隔离
由于在传统的以太网络 ,信息发送采用的是广播方式 ,这就给信息“共享”打开了门户 。攻击者只要能够进入局域网,就可能监听所有数据通信 ,窃取机密 。网络分段就是保证网络安全的一项基本措施 ,其本质是根据业务或分类级别的不同,将网络和用户隔离,通过设定不同的访问权限,防止越级越权对网络资源的非法访问 。它分为物理分段和逻辑分段两种方式 :物理分段通常是指将网络从物理层和数据链路层分为若干网段,各网段之间无法进行直接通信;逻辑分段则是将整个系统在网络层上进行分段 。在实际的应用中,通常是将两者相结合的方法来实现对网络系统的安全性控制 。如交换网和虚拟局域网。
(2)访问控制
访问控制主要是通过防火墙的使用来实现的。防火墙是应用最广的一种防范技术。作为系统的第一道防线 ,它通过制定严格的安全策略来监控可信任网络和不可信任网络之间的访问通道 ,可在内部与外部网络之间形成一道防护屏障,拦截来自外部的非法访问并阻止内部信息的外泄 ,但它无法阻拦来自网络内部的非法操作 。由于它是根据事先设定的规则来确定是否拦截信息流的进出,但无法动态识别或自适应地调整规则,因而其智能化程度很有限。它分为3类 :①包过滤防火墙 ,它的控制功能是在网络层和传输层实现的 ,其根据分组包的源 、宿地址、端口号 ,协议类型以及标志位来确定对分组包的控制规则 ,所有过滤依据的信息均源于IP 、TCP或UDP协议的包头 ;②应用级网关防火墙,在应用层实现,其特点是对网络通信进行完全隔离 ,并通过针对各种应用服务的代理程序,实现其功能优点是能识别应用层信息,并对其进行很好的过滤 ,可提供详细的日志记录 ,相对性教好 ,弱点在于限制了网络通信的多样性,其处理速度也是一个问题。③状态监测防火墙 ,通过监视并记录每一个有效连接的状态,根据这些信息决定网络数据包是否允许通过防火墙,其速度比较快 ,也可以有效的防止IP欺骗的发生。
(3)信息加密
信息加密的目的是保护网内的数据、文件、口令和控制信息,保护传输的数据 。加密可以建立在链路层 ,也可以建立在网络层、传输层以及应用层。其可使用的技术有IPSec(VPN的一种典型技术,用于网络层加密) 、SSL(SecureSocketLayer)技术、TLS(TransportLayerSecurity,传输层安全)、SMIME(SecureMultipurposeInternetMailExtensions,加密多用途Internet邮件扩展,用于应用层加密)。
(4)入侵检测
1987年 ,DerothyDenning首次提出了一种检测入侵的思想,经过不断发展和完善,作为监控和识别攻击的标准解决方案,IDS系统已经成为安全防御系统的重要组成部分 。它通过在计算机网络或计算机系统的关键点采集信息进行分析,从中发现网络或系统中是否有违反安全策略的行为和被攻击的迹象。入侵检测采用的分析技术可分为三大类 :签名、统计和数据完整性分析法 。签名分析法主要用来监测对系统的已知弱点进行攻击的行为 。人们从攻击模式中归纳出它的签名 ,编写到IDS系统的代码里。签名分析实际上是一种模板匹配操作;统计分析法是以统计学为理论基础,以系统正常使用情况下观察到的动作模式为依据来判别某个动作是否偏离了正常轨道;数据完整性分析法是以密码学为理论基础 ,可以查证文件或者对象是否被别人修改过。而入侵检测所使用的软件与硬件的组合便是入侵检测系统(IntrusionDetectionSystem),IDS的种类包括基于网络和基于主机的入侵监测系统、基于特征的和基于非正常的入侵监测系统、实时和非实时的入侵监测系统等 。由于单一布局的IDS结构已经不适应多网段入侵检测的要求了,分布式 、多系统的IDS就成为其发长的一个重点方向。
(5)安全扫描
以上四种是被动的防御技术,如果要真正了解网络当前的安全状况 ,就该使用安全扫描技术 ,对网络整体的安全状况进行有效评估 。进行网络安全扫描 ,其工具可用基于网络的扫描器和基于主机的扫描器 。基于网络的扫描器可以置于网络的任何部位,可从外部网络透过防火墙对内部网进行扫描,也可以在内部网直接对网络中的主机和设备进行扫描。它可以完全模拟黑客的入侵和攻击行为 ,对网络的安全状况进行最直接的评测;基于主机的扫描器一般采用Agent/Console(代理/控制台)结构 ,通常是一对一的单点扫描,在将进行扫描的目标主机上安装代理程序 ,由代理程序完成真正的扫描工作,而控制台负责向代理发送扫描指令,并汇总分析扫描结果,它更细致更全面,同时还具有日志审计功能 。
另外,我们还应该保护计算机系统 、网络服务器、打印机等硬件设备和通信链路免受自然灾害以及人为操作失误及计算机犯罪行为导致破坏的过程 ;加强网络的安全管理 ,制定有关规章制度 ,以确保网络的安全和可靠的运行 。
第2章数据库系统安全技术及数据库攻击技术2.1数据库系统安全概述数据库系统(DataBaseSystem ,DBS)是计算机技术的一个重要分支 ,从60年代后期开始发展 ,已经成为一门新兴的学科了。形象点说 ,数据库就是若干数据的集合体 。由于它的组织形式以其数据具有共享性 、独立性 、一致性、完整性和可控性的优势 ,而在数据库系统内被广泛应用 ,成为了目前计算机系统存储数据的主要形式 。对目前的操作系统(OS)而言,操作系统对数据库系统内的数据文件没有特殊的安全保护措施 ,数据库文件的安全就只有通过数据库管理系统自身来实现 。并对其进行科学的组织和管理,以确保其安全性和完整性。正因为数据库系统担负着存储和管理数据信息的任务 ,而且数据库管理系统(DBMS)技术的广泛应用 ,就使得其重要性非同寻常 。数据库丢失以及数据库被非法用户的使用 ,使得数据库系统的安全性就成为目前迫切需要解决的一个热门话题。
2.2数据库系统安全简介2.2.1数据库安全面临的威胁数据库系统的安全除依赖自身内部的安全机制外 ,还与外部网络环境 、应用环境 、从业人员素质等因素息息相关 。大致分为两个方面 :人为的和自然的 。
人为的因素主要有6种:
●非授权用户的非法存取数据或篡改数据。例如 ,数据库系统管理员对数据库中数据的访问控制权缺乏进行严格的监控,使得非授权用户有意或无意的进入到系统内部对其中的数据进行存取或修改 ,导致内部数据的泄露或破坏。
●授权用户在输入或处理数据时 ,对发生了变动的数据进行了输入或处理导致数据的不正确 。
●授权用户故意破坏数据或泄露机密和敏感的数据资料 。
●在装有数据库文件的计算机内部 ,程序员设计安装了木马导致数据资料被窃取。
●系统设计人员为了回避系统的安全功能,安装了不安全的系统。
●存储介质的丢失 。
自然因素有3种 :
●计算机硬件故障引起数据库内数据的丢失或破坏。例如 ,存储设备故障造成数据信息的丢失或破坏 。
●软件保护功能失效造成的数据信息的泄露。例如 ,系统本身的漏洞 。
●病毒入侵数据库系统破坏和修改数据信息的泄露。
2.2.2数据库安全系统特性数据库系统是为了企业管理人员便于管理而开发的管理系统 。企业内部的数据是可以时常添加和修改的,既要方便访问控制,又要保证数据的安全。因此,它具有以下的特性:
(1)数据独立性:数据独立于应用程序之外。理论上数据库系统的数据独立性分为以下两种:物理独立性和逻辑独立性 。其都需靠DBMS来实现 。
(2)数据安全性:通常来说 ,比较完整的数据库对数据安全性采取以下措施 :
A.数据库中需要保护的部分与其他部分相隔离;
B.使用授权规则 ;
C.将数据加密 ,以密码的形式存于数据库内。
(3)数据的完整性:数据完整性泛指与损坏和丢失相关的数据状态 。它通常表明数据在可靠性与准确性上是可信赖的 ,同时有可能也意味着数据是无效的或不完整的。包括 :正确性;有效性;一致性。因为数据库系统对数据的使用是集中控制,所以数据的完整性控制的实现就相对比较容易 。
(4)并发控制:如果数据苦应用要实现多用户共享数据,这就可能在同一时刻多个拥护存取数据 ,这就被称为并发事件。当发生并发时间时 ,需要对这种并发操作施行控制 ,排除和避免这种错误的发生 ,保证数据的正确性
(5)故障恢复 :如果数据库系统运行时出现物理或逻辑上的错误 ,系统能尽快的恢复正常,这就是数据库系统的故障恢复功能 。
2.2.3数据库的安全需求数据库的安全性主要体现在以下几方面 :
(1)数据库的完整性:DBMS 、操作系统和用户负责数据库的完整性。DBMS必须对数据库进行访问控制,确保只有授权用户才能对数据库尽心更新 、修改和删除 ,防止人为因素的灾难。对操作系统和用户来说,必须对数据库系统内的数据进行周期性的备份 ,以防止由于各种灾难造成的损失 。
(2)数据元素的完整性 :它是指数据库元素的正确性和准确性,DBMS能帮助用户发现错误并纠正 ,采用以下3种维护方式:字段检查 、访问控制、更改日志文件。
(3)审计性 :数据库的应用中需要对数据库的所有访问产生审计,以帮助在事后查看什么人对数据库进行了什么操作 ,带来了什么影响,以便维护数据库的完整性。包括对记录 、字段和数据元素的访问记录的审计跟踪。
(4)可获取性:由于DB内的数据不是在任何时候都可被任何用户读取和使用的,因此就必须保证DB内的数据能被用户进行读取 。例如 ,当一个用户在对其中的数据进行更新操作时,其他用户的访问请求就不能响应 ,当这一操作完成后,其他用户才能使用这一新数据 。
(5)访问控制:DBMS必须对用户访问的数据进行规定 。哪些数据可被访问 ,哪些不能。DBMS得对用户是否能操作(读写、修改 、删除 、添加)进行授权 ,只有那些具有某种访问控制权限的用户才能做相应的操作 。
(6)用户认证 :DBMS应具有严格的用户身份识别和认证。DBMS可能要求用户输入口令 、日期、时间以用来确定用户的合法性 。
总之 ,数据库系统的安全需求需要从传输过程、读取过程 、存储介质等多方面考虑 ,才能尽力保证数据库使用过程不受破坏。表1列出了数据库的安全区域、安全功能和安全过程 :
表1数据库的安全区域、安全功能和安全过程
区域
安全功能和安全过程
外部过程
个人安全许可证 、口令保护 、信息等级和安全策略规则 、检测和字段处理
通信线路
数据加密
物理环境
确定文件 、处理者 、计算机终端的安全(信息辐射的屏蔽、防泄露和防盗)
数据存储
数据加密 、备份、存储器的安全(防盗和物理破坏)
处理机软件 、硬件
用户授权 、存取控制 、对盗窃的监视记录、数据的痕迹 、内容的保护、建立特权状态 、安全可靠的硬件
2.3数据库系统安全技术从广义上讲 ,数据库系统的安全框架可以划分为三个层次 :网络系统层次 、宿主操作系统层次、数据库管理系统层次 。
2.3.1网络系统层次安全技术首先 ,数据库的安全来于网络系统 。网络系统是数据库应用的外部环境和基础 ,数据库系统要发挥其功能就绝对离不开网络系统的支持 ,其用户(如远程用户、分布式用户)都需通过网络才能访问数据库的数据 。网络系统的安全是数据库安全的第一道屏障,外部入侵首先就是从入侵网络系统开始的。
从技术角度讲,网络系统层次的安全防范技术有很多种,大致可以分为防火墙 、入侵检测 、协作式入侵检测技术等。防火墙和入侵检测技术请参看前面1.4节的相关内容 。在这里就只介绍一下协作式入侵检测技术。在独立的入侵监测系统不能够对广泛发生的各种入侵活动都做出有效的监测和反应 ,为弥补独立运作的不足,人们提出了协作式入侵监测系统的想法 。在协作式入侵监测系统中 ,IDS基于一种统一的规范,入侵监测组件之间自动地交换信息 ,并且通过信息的交换得到了对入侵的有效监测 ,可以应用于不同的网络环境。
2.3.2宿主操作系统层次安全技术操作系统是大型数据库系统的运行平台 ,为数据库系统提供一定程度的安全保护 。目前操作系统平台大多数集中在Windows2000和Unix ,安全级别通常为C1 、C2级(安全级别分4个级别:C1未保密级、C2共享级 、C3内部访问级、C4机密级)。在这一层主要可以实现的安全技术有操作系统安全策略、安全管理策略 、数据安全等方面。
操作系统安全策略用于配置本地计算机的安全设置,包括密码策略、账户锁定策略 、审核策略 、IP安全策略、用户权利指派、加密数据的恢复代理以及其它安全选项。具体可以体现在用户账户、口令 、访问权限、审计等方面 。
安全管理策略是指网络管理员对系统实施安全管理所采取的方法及策略 。针对不同的操作系统、网络环境需要采取的安全管理策略一般也不尽相同 ,其核心是保证服务器的安全和分配好各类用户的权限。
数据安全主要体现在以下几个方面:数据加密技术 、数据备份、数据存储的安全性、数据传输的安全性等。其可用的数据加密技术在1.4节前面已提过 。
2.3.3数据库管理系统层次安全技术数据库管理系统在很大程度上决定了数据库系统的安全性。数据库管理系统安全机制越强 ,数据库系统的安全性能就越好 。例如关系式数据库管理系统的安全性功能就比较弱,以至于其数据库系统的安全性存在一定的威胁 。由于数据库系统是依赖于操作系统的一种系统软件 ,而且其在操作系统中是以文件形式进行管理的 ,因此黑客可以直接利用操作系统的漏洞窃取数据库文件,又或者直接利用OS工具来伪造、篡改数据库文件内容 。这种隐患一般都难以察觉 ,因此需用B2级的安全技术措施来分析和堵塞这种漏洞 。
当前面两个层次已经被突破的情况下 ,数据库管理系统层次安全技术仍能保障数据库中数据的安全 ,这也是设定这一层次的安全技术的目的所在 。这就要求数据库管理系统的安全机制必须强而有力。数据库管理系统对数据库文件进行加密处理是解决这一问题的有效方法之一 。这样就使得即使数据不幸泄露或者丢失 ,也难以被人破译和阅读。
可以考虑在OS层、库内和库外这三个不同层次实现对数据库数据的加密 :
①在OS层加密。在OS层无法辨认数据库文件中的数据关系,从而无法产生合理的密钥,对密钥合理的管理和使用也很难 。所以 ,对大型数据库来说 ,在OS层对数据库文件进行加密很难实现 。
②在库内实现加密。这种加密是指数据在物理存取之前完成加/解密工作 ,它是对数据库系统内数据元素(可以是记录 、字段)进行加密 。这种加密方式的优点是加密功能强 ,并且加密功能几乎不会影响DBMS的功能 ,可以实现加密功能与数据库管理系统之间的无缝耦合 。其缺点是加密运算在服务器端进行 ,加重了服务器的负载,而且DBMS和加密器之间的接口需要DBMS开发商的支持 。过程如下 :
定义加密要求工具→DBMS→数据库应用系统→加密器(可以是软件的也可以是硬件的)
③在库外实现加密。它是利用了操作系统对数据管理的特点来加密的 。数据库系统把数据当作一个文件,把每个数据块当作文件的一个记录进行加密 。比较实际的做法是将数据库加密系统做成DBMS的一个外层工具 ,根据加密要求自动完成对数据库数据的加/解密处理 。其过程只是将库内流程中的加密器放在了定义加密要求工具这一步骤上。采用这个库外加密的优点加解密处理在客户端进行,不会加重数据库服务器的负载 ,并可实现网上传输加密,而且系统对数据库的最终用户是完全透明的,管理员可根据需要进行明、密文的转换,加密系统也是完全独立于数据库应用系统 ;缺点是加密功能会受到一些限制,与数据库管理系统之间的偶合性稍差点 。
2.4数据库攻击技术为了能够更好地维护数据库系统,保护数据库中的数据。我们还应该了解一些数据库攻击技术 ,以便制定相应的防御措施 。下面就介绍一些数据库攻击技术 ,并举例说明 。
(1)突破script的限制
例如,在网页上有一允许你输入用户名称的文本框,但是它限制只能输入8个字符 。一般程序多是在客户端限制 ,然后用msgbox弹出错误提示 。如果在攻击时需要突破此8个字符的限制 ,那就在本地做一个一样的主页,取消字符输入限制 ,通常是去掉VBscript或JavaScript的限制程序 ,就可以成功突破 。
(2)对SQL的注入
例如在网页需要你输入用户名称和密码 ,这样就有两个文本框等待你的输入 。现在我们假设有一用户user,密码是111。我们想以他的身份登陆,但又不知道user的密码 。正常情况下 ,在第一个文本框输入user,在第二个文本框输入密码 ,就可以进入了 。但是我们不知道正确的密码啊 ,该怎样做呢?一般来说 ,程序中的查询语句可能是:
sql="select*fromadminwhereusername='"&text1.value&"'andpassword='"&text2.value&"'"
在输入正确的名称和口令后 ,语句执行就是 :
select*fromadminwhereusername='user'andpassword='111'
那么如果我们在text2里输入的不是111,而是111'"&"'or1=1,我们的sql语句就成了:
select*fromadminwhereusername='user'andpassword='111'or1=1
这样 ,我们就通过了 。在下一个章节中 ,将再具体的讲解。
(3)利用多语句执行漏洞
根据上面的思路 ,如果用户根据书名(例如C#入门)查询所有的书,SQL语句为 :
selectbook.name,book.contentfrombookwherebookname='C#入门'
如果我们输入的不是C#入门而是C#入门'deletefromuserwhere'1'='1
从而构成对表的删除 。成功的前提条件是对方允许多条语句的执行。由于程序没有处理特殊字符“'”产生的漏洞的危害程度和结果集的类型及数据库的配置有很大的关系 。首先说结果集,如果结果集不允许多条的SQL语句 ,只支持单条的执行语句,那么所能做的事就只能是上面提到的那种在密码框内输入'or'1'='1来登录,其他的就做不了了。用这种方法还可以在数据库里增加用户 。
(4)利用管理用户sa
SQLServer装完后会自动创建一个管理用户sa ,密码为空。许多人在装完后并不去改密码,从而留下了一个极大的安全问题 。程序中的连接一般用两种 ,不是用global.asa就是用SSL文件。SSL文件一般人习惯放到到Web的/include或/inc目录下 。而且文件名常会是conn.inc、db_conn.inc 、dbconninc ,等等 ,反正有时能猜到 。如果这个目录没有被禁读 ,一旦猜到文件名就可以了 ,因为.inc一般不会去做关联的,直接请求不是下载就是显示源文件。还有当主要程序放到一个后缀为.inc的文件而没有处理“'”,当运行出错时返回的出错信息中常会暴露.inc文件。其实可以在IIS里设置不显示脚本出错信息。
(5)数据库的利用。
如果程序中的连接用户权限极小,甚至多数表只能读,你就很难有所作为了 。这时所能做的是能猜解表名和字段名来进行删除数据或对表的操作。其工作就比较繁琐了,特别是在猜用户名字段和密码的时候。其他的不说了 ,还是说说怎样利用数据库吧 。如果对方的数据直接在Web服务器上而且你知道端口号 ,有帐号就干脆用SQLAnalyzer来直接连接数据库 。在它里面可以执行SQL语句 。常用的是存储过程master.dbo.xp_cmdshell,这是一个扩展存储过程 ,它只有一个参数,把参数做系统命令以用来给系统执行。如果是管理用户就有权执行这个存储过程 ,而且这时可以执行很多操作 ,如用ipconfig来看ip设置,用netuser来看系统用户 。不过用netuser/add用户名密码并不一定成功,有时会返回一个“指定的登录会话不存在”而不能执行 。如果没有权限也不要紧,MSSQLServer有个漏洞,你可以创建一个临时存储过程来执行,就可以绕过去 ,如:
CREATEPROC#cmdshell(@cmdstrvarchar(200))
AS
当然这时是没有权限执行netuser/add等的 ,不过可以查看,可以创建文件 。反复用echo创建一个FTP脚本 ,把木马传到一个FTP站点上 ,然后用存储过程调用FTP来利用脚本下载并安装 ,就大功告成了。
(6)数据库里如何留后门 。
创建用户的sp_addlogin 、权限分配的sp_addsrvrolemember是用一条语句来判断用户是否有权限执行,也就是说用户都可以执行它 。当你成功攻入一个数据库时可以用它的EnterpriseManager来连上去 ,并修改这些存储过程(因为其都没有加密)。可以在判断的地方加个条件 ,当这个条件满足时就不直接执行下去而不管是什么权限的用户调用它。不过改完要注意,这时它的Type成了User ,要想改回可以到sysobjects表中把name为sp_addlogin的一条删除,然后再把没有改过的相同版本的MSSQLServer的同一条记录拷贝进去就可以了 。当然不要忘了这些默认是不能手工修改的,要修改得先去掉SQLServer的参数 ,改完后还得再改回来啊 !这时只要网站的程序有问题 ,不管程序中的用户权限如何,你都可以随时创建SQLServer的管理用户 。
(7)数据库扫描工具
有了现成的攻击工具就好办多了,只要我们知道怎样去用这个工具就ok了 。由于各种攻击工具针对的数据库可能不同,所以这里就不讲述了。不过,还是推荐一个吧 !ISSDATABASEScanner看其英文名字就知道是什么了 。如果用得着 ,就去这个地址下载:
http://www.is-one.net/product/product.php?p
[Microsoft][ODBCSQLserverDriver][SQLserver]字符串的语法错误在查询表达式''中 。
/list.asp行9
从该信息中可以得出 :数据库类型是SQL,使用的ODBC连接数据库 ,并可判断出可以注入 。
(2)判断数据库类型及方法:不同的数据库的函数、注入方法都是有差异的 ,所以在注入之前,我们还要判断一下数据库的类型 。怎么让程序告诉你它使用的什么数据库呢?来看看:SQLServer有一些系统变量 ,如果服务器IIS提示没关闭 ,并且SQLServer返回错误提示的话,那就可以直接从出错信息获取。方法就是用错误的表达式来测试 。如在起网址后面加anduser>0,由于user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个nvarchar的值跟int的数0比较 ,系统会先试图将nvarchar的值转成int型 ,当然,转的过程中肯定会出错 ,SQLServer的出错提示是(假设当前用户名是AAA) :将nvarchar值”AAA”转换数据类型为int的列时发生语法错误,呵呵,AAA正是变量user的值,这样还轻而易举地就拿到了数据库的用户名 。这种方法会在猜解用户名和密码会大有用武之地 。如果服务器IIS不允许返回错误提示,那怎么判断数据库类型呢?我们可以从各种数据库的区别入手 ,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中 ,但在Web环境下读该表会提示“没有权限” ,SQLServer是在表[sysobjects]中,在Web环境下可正常读取 。在确定可以注入之后,在其地址后加and(selectcount(*)fromsysobjects)>0或and(selectcount(*)frommsysobjects)>0。如果数据库是SQLServer ,那么出现的页面与原页面是大致相同的 ;而对于出现的第二个网址 ,由于找不到表msysobjects ,会提示出错 ,即使程序能够处理容错 ,出现的页面与正常的页面也有差别的。
(3)猜解:在以上的工作都做完了之后,我们就应该破解管理员帐号及密码了 。以下就是猜解的方法 :
猜表名 :加andexists(select(*)fromadmin)
这是猜测他是否有个admin表段 ,页面返回正常,即表Admin存在。反之 ,即不存在。如此循环,直至猜到表名为为止。由于程序员一般都用user 、users、mem、member、members 、userlist 、memberlist、admin 、manager 、用户 、yonghu这些常用表名 ,只要一个个放进去试 ,一般成功率都比较高的 。
以下说明加参数所获得的信息 ,返回正常 ,则猜解ok 。
andexists(selectidfromadmin)
*admin表中有个id的字段
andexists(selectusernamefromadmin)
*admin表中是否有username字段
andexists(selectpasswordfromadmin)
*admin表中有个密码的字段password
andexists(selectidfromadminwherehttps://www.ggdoc.com/getpic.php?tkey=4cfdLqRfzc%2F0Q113U9wnpBO66tvltCiBfICMnBNaBC6M9NqOcMSAr%2FEPgBpAqdAWUPzOYwGdD0aRsEUKOp%2B%2FakEEwqw03R2j1%2BUJI6tCaCEi1pPTgFC5iN51yunhODiOs3GS%2FATFOMr4PaCArgAortT5aZ1jUBVdPg81vOyoG45Z0b7R%2FY0%2FvewrLKSj34Ix9U%2F9MxckalyVxBeCQn6MbtNE41Envvokl%2F17BSFMVlKMEx3DqkXlpXNWUkJrVX%2FTAcuHZjIoXdLXZfv6JkxR9SGgX239duDVCluqroB0h0LepmnvbIr5K1xjsA9mtkxKcnkLh8VRiZQTG%2BjorUPPvlBaL5oUl99h1qzSoTt9Z8dNFyXrXqsf%2FiM898LVyV71pIuURygFuR%2FGaf%2Bhc43XVrfpNre8XcVkxDfhT6zajBqNtpeFRuwyGg'>
图1IIS的设置
服务器管理员还应在IIS中为每个网站设置好执行权限 ,一定别给静态网站以"脚本和可执行"权限。一般情况下给个“纯脚本”权限就够了 ,对于那些通过网站后台管理中心上传的文件存放的目录 ,就更谨慎一点吧,执行权限设为"无"好了,这样就能防止别有用心的人上传ASP木马 ,即使上传了 ,ASP木马也运行不了 。由于SQL注入漏洞涉及整个网站安全 ,一旦黑客通过这个漏洞上传了ASP木马并运行起来 ,那整个网站也就完蛋了。所以责任心强的服务器管理员都应该十分谨慎的配置IIS的执行权限 。
同样的谨慎态度也应该用在数据库用户的权限配置上(MS_SQL,ACCESS都没有用户权限配置)。如果PUBLIC权限已经够用,那就不需要给更高的权限了,千万别把SA级别的权限随随便便地给人家啊 。要知道SA可是个等同管理员权限的角色,拿到了SA权限 ,几乎就等于拿到主机的管理员帐号了。黑客可是能通过编程跨库进行SQL注入的 ,如果把SA权限给了存在SQL注入漏洞的库 ,就会殃及到其他的数据库了。而且黑客还可以通过调用xp_cmdshell命令得到系统的最高权限。
3.4.2程序员的防御措施程序员的防范措施就是对客户端提交的变量参数进行仔细地检测以防止SQL注入 ,只要在利用表单输入的内容构造SQL命令之前 ,把所有输入内容过滤一番就可以了 。过滤输入内容可以按多种方式进行 。
(1)对于动态构造SQL查询的场合 ,可以使用下面的技术 :
第一:替换字符 。例如把所有单独出现的单引号改成两个单引号,以防止攻击者修改SQL命令的含义。这样这个语句:
“select*fromUserswhereadmin='''or''1''=''1'’andpassword='''or''1''=''1'’”
显然会得到与
“select*fromUserswhereadmin=''or'1'='1'ANDpassword=''or'1'='1'”
不同的结果 。
第二:删除特殊字符 ,防止攻击者构造出类似“select*fromUserswhereadmin='AAA'——andpassword=''”之类的查询,因为这类查询的后半部分已经被注释掉 ,不再有效 ,攻击者只要知道一个合法的用户登录名称,根本不需要知道用户的密码就可以顺利获得访问权限 。
(2)限制表单或查询字符串输入的长度范围 。如果用户的登录名字范围在6-10个字符 ,那么不要认可表单中输入的6个以下和10个以上的字符 ,从而增加攻击者在SQL命令中插入有害代码的难度。
(3)检查用户输入的合法性,防止非法数据的输入 。数据检查应当在客户端和服务器端两端执行 。执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。因为在客户端,攻击者很有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此 ,为保证是否执行了验证操作 ,就需在服务器端也执行验证,可以使用许多内建的验证对象 ,例如RegularExpressionValidator ,它们能够自动生成验证用的客户端脚本 ,当然也可以插入服务器端的方法调用 。如果找不到现成的验证对象 ,也可以通过CustomValidator自己创建一个。
(4)加密保存用户登录名称 、密码等数据。加密输入的数据后 ,再将它与数据库中保存的数据进行比较 ,这就相当于对用户输入的数据进行了“消毒”处理 ,用户输入的数据不再对数据库有任何特殊的意义 ,从而也就防止了攻击者注入SQL命令 。System.Web.Security.FormsAuthentication类有一个HashPasswordForStoringInConfigFile ,就是一个对输入数据进行加密处理的文件。
(5)检查提取数据的查询所返回的记录数量 。假如程序只要求返回一定数目的记录 ,但实际返回的记录却超出了程序要求返回的数目 ,那就把该查询操作当作非法处理 。
3.5对3.3节的SQL注入攻击的防御实现:通过对上节知识的了解 ,实际上就应该知道怎样去防御它了 。只需过滤掉一些比较敏感的字符就行了 ,下面这段代码我就定义了18个需要过滤的字符 。
只要把该代码结合到查询语句就行了,这样的话,3.3节的注入就不能实现了。
第4章SQL注入攻击防范系统的设计为了更有效的防止SQL注入攻击 ,作者根据3.4.2节防御SQL注入给出了如图2所示的模型(SQL注入攻击的检测/备案模型),即基于提交信息的合法性检查 ,在客户端和服务端进行两级检查 ,只要任一级检查没有通过,提交的信息就不会进入查询(query)语句 ,也就防止了SQL注入攻击 。从技术上来说 ,是可以饶开客户端检查的 ,也就是所谓的高级别的注入攻击。在这种情形下 ,SQL注入的数据会被直接发往服务器端。那么通过在服务器端设定二级检查就是必要的了 ,也就弥补了能避开客户端进行SQL注入的不足了 。由于正常提交到服务端的数据已经在客户端检查过 ,因此,只要服务器端检查到提交异常 ,就基本可以认定为是恶意的攻击行为,从而中止提交信息的处理,进行攻击备案 ,并对客户端给出出错 、警告提示。
客户端服务器端
图2SQL注入攻击的检测/备案模型
(1)检测
对提交信息的检查 ,主要包括数据类型检查、数据长度检查以及特殊字符和字符串的过滤 。对于数据类型检查和数据长度检查这两项 ,在SQLserver中可直接利用函数办到 ,而敏感字符的过滤就需要程序员做相应的开发 。其实一般的http请求只有get和post两种,只要我们在文件中过滤所有post或者get请求中的参数信息中非法字符即可 ,所以我们实现http请求信息过滤就可以判断是是否受到SQL注入攻击 。一般来说,SQL注入攻击的特殊字符包括 :“’”,“+”,“..”,“;” ,“%”,“exec”,“select”,“and”,“declare” ,“Union”,“cmd”,“insert”,“delete” ,“count” ,“char” ,“0x”等 。针对这些敏感字符 ,设定过滤函数,再把这些上传的参数结合到query语句之前进行过滤,就可以防止SQL注入了 。先实现get函数请求的拦截:
DimSQL_injdata
SQL_injdata=“’+ 、..、;、% execselect and declareUnioncmdinsert delete countchar0x”//如果还有其他敏感字符的话还可以加 。
SQL_inj=split("SQL_Injdata")
IfRequest.QueryString<>""Then
ForEachSQL_GetInRequest.QueryString
ForSQL_Data=0ToUbound(SQL_inj)
ifinstr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0thenResponse.Write"<ScriptLanguage=****>alert('你提交的字符中含有非法的字符 !');history.back(-1)</Script>"
Response.end
endif
next
Next
EndIf
过滤了post请求,还得继续考虑request.form,这个也是以数组形式存在的 ,因此只需要再进一次循环判断即可。代码如下:
IfRequest.Form<>""Then
ForEachSql_PostInRequest.Form
ForSQL_Data=0ToUbound(SQL_inj)
ifinstr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0Then
Response.Write"<ScriptLanguage=****>alert('你提交的字符中含有非法的字符 !');history.back(-1)</Script>"
Response.end
endif
next
next
endif
(2)备案
提交非法字符的人 ,都有可能是SQL注入攻击者。但考虑到用户在正常使用中的误操作也有提交非法字符/字符串的可能 ,因此客户端的一级检查无论对用户误操作 ,还是一般性攻击 ,所做出的处理措施就只是中止信息提交 ,给出比较友好的出错提示。在经过一级检查以后提交到服务器端的信息中仍然包括非法字符/字符串的,那就说明攻击者绕开了客户端的一级检查 。对于这种危险的信号,服务器端将从收到的提交信息数据包中提取攻击源的IP地址 ,存入数据库备查 ,同时中止对数据库的操作 。在用户端给出出错提示甚至是警告。
设置的大概步骤也是先检测 ,对敏感的字符进行过滤 。当检测到非法字符时 ,提交字符源计算机的IP地址将被存入到设定函数的一个表中,这张表将记录下该攻击源第一次和最后一次提交非法字符的时间,以及提交非法字符的次数 。从而对其进行备案。在备案之后 ,还应该决定是否添加新记录或更新已有记录 。在做完相关跟踪记录以后 ,页面就自动转往一个出错或警告的页面。当然经过了非法字符过滤的提交参数则认为是不具有威胁的 ,执行正常处理 ,也就是正常的服务请求 。
这种模型的优点是显而易见的 ,通过在客户端检查可以减少网络流量 ,降低服务器负载;同时还可以区分出高级别和低级别的攻击 ;通过设置二级检查 ,使得直接发往服务器端的高级别SQL注入也难进行 。而不足之处也体现在设置了二级检查 ,使得服务器的负荷也增加了 ,但毕竟要安全得多了。
第5章结束语这次毕业设计是我学习生涯中的最后一次“家庭作业” 。在作为综合能力测试的毕业设计期间 ,我学到许多新知识 ,良好的心态 ,认真的态度 ,团结的气氛等 ,这些都使我受益非浅。毕业设计虽然结束了,但它留给我许多宝贵的东西。一个个的难题 ,一次次的解决,使我懂得了勤学的重要 ;多一个为什么,就多得到一份知识 ,让我明白了好问的可贵 。因为只有这样 ,我们才能对它有一个系统的掌握,才能激励自己不断前进 。其他方面的能力也得到提高 。
本文只涉及到数据库安全性的一个方面,随着数据库管理系统功能的不断增强、性能的不断完善,将各类数据完全由数据库管理系统统一存储和管理,已成为技术发展的趋势。只有这样,数据库管理系统的强大功能才能得到充分发挥 ,数据的安全性才能得到充分的保障 。
新的攻击手段将不断的出现 ,数据库要安全,了解攻击手段是必须的 。这有助于我们更好的防范。由于SQL注入攻击针对的是应用开发过程中的编程不严密,因而只有完善编程 ,才能使那些所谓的SQL注入黑客无用武之地 。这样才能保障数据不被非法窃取 ,保障我们的利益 。
。