安全性编程方法课程论文.docx
《安全性编程方法课程论文.docx》由会员分享,可在线阅读,更多相关《安全性编程方法课程论文.docx(13页珍藏版)》请在冰豆网上搜索。
安全性编程方法课程论文
天津农学院
计算机科学与信息工程系
《安全性编程方法》课程论文
论文题目:
《SQL注入式漏洞》
专业:
软件工程
班级:
2009级软件
(2)班
学号:
0908054201
姓名:
晏海鹏
指导教师:
许晓华
成绩:
2012年6月19日
目录
1总述系统安全漏洞2
2SQL注入的危害3
3SQL注入式攻击的检测、跟踪以及攻击的种类与防范4
4总结与体会13
1总述系统安全漏洞
随着互联网技术的飞速发张,负面的软件瑕疵也是越演越烈,人们通常将那些可能引发安全问题的软件瑕疵称为“安全漏洞’,这一称呼是相当形象的,他们所导致的后果可能非常严重,比如系统被非法入侵、数据丢失等。
其实,定义一个让多方都能够认同的安全漏洞并不是一件简单的事,因为并不是所有的安全问题都可以归结到安全漏洞的层面,很多安全问题的产生是由于用户的不规范操作或者历史因素所造成的。
举个例子,在Windows2000/XP的管理共享功能中,由于安装者将管理员密码设定为空或弱密码,而导致他人通过管理共享入侵系统,就不能被划定为安全漏洞范畴,用户操作的不规范才是问题产生的主要因素。
另外,FTP使用明文传递密码也不能称之为安全漏洞,因为这是FTP协议制定时惯用的做法。
总的来说,那些与用户操作无关,且非历史因素造成的软件安全问题,才能够被定义为安全漏洞。
不可否认的是,经过这么多年的发展,、软件开发体系仍然不够成熟。
现在软件开发有了很多的方法可以做需求定义、模块交互、代码重用、测试等。
问题是:
这些方法对计算机有什么用处?
计算机有CPu、BIOS、存储设备、显示卡、网卡、主板等硬件设备,有操作系统、驱动、防病毒软件、个人防火墙、其他各种各样的第三方应用程序。
您的计算机上能列举出数百种不同组织提供的硬件和软件,他们都共存于一台计算机上,因此,每台计算机都是一个特殊的平台。
而许多应用程序必须运行在这些平台上。
焦点便在此:
不同的用户群使用不同的风格、方法、工具生成了这些代码,而当您把这些不同的软件放到一起工作时∥因为有这极大的变数,变化结果不可预测。
于是产生了Bug。
当软件变得日益复杂时,代码中错误的数量会随着增加,软件中潜在的Bug将随之增多,,软件团队修正漏河时,他们基于的环境相对用户的千千万万复杂环境来说,又太单纯了,不可能把用户的环境都模拟测试一遍,漏洞也无法避免。
Windows操作系统的普及率和市场占有率比较高,所以很容易使它成为很多黑客攻击的目标。
Windows系统主要的安全漏洞有Unicode漏洞、.ida/.idq缓冲区溢出漏洞、MicrosoftIISCGI文件名错误解码漏洞、SQL数据库注入漏洞、FrontPage服务器扩展和Primer漏洞等等。
而在这么多系统安全隐患中,SQL注入漏洞当属危害最为严重的漏洞之一。
2SQL注入的危害
Web安全纷繁复杂,危害最严重的当属SQL注入。
SQLInjection,中文名称为“SQL注射”是一种数据库攻击手段,也是WEB应用程序漏洞存在的一种表现形式,它的实际意义就是利用某些数据库的外部接口把用户数据插入到实际的数据库操作语言当中,从而达到入侵数据库乃至操作系统的目的。
SQLInjection的主要形式是,直接将代码插入与SQL命令串联并执行的用户输入变量中,间接的将恶意代码注入要在表中存储或作为元数据存储的字符串,在存储的字符串随后串连到一个动态SQL命令中时,执行该恶意代码。
基本的攻击是提前终止文本字符串,然后追加一个新的命令。
由于插入的命令可能在执行前追加其他字符串,因此攻击者将用注释标记“--”来中止注入的字符串。
执行时,此后的指令将被忽略.SQLInjection攻击技术就其本质而言,它利用的工具是SQL的语法,针对的是应用程序开发者编程中的漏洞,当攻击者能操作数据,向应用程序中插入一些SQL语句时,SQLInjection攻击就发生了。
实际上,SQLInjection攻击是存在于常见的多连接的应用程序中的一种漏洞,攻击者通过在应用程序预先定义好的查询语句结尾加上额外的SQL语句元素,欺骗数据库服务器执行非授权的任意查询。
这类应用程序一般是WebApplication,它允许用户输入查询条件,并将查询条件嵌入SQL语句中,提交到数据库中执行。
通过构造畸形SQL语句攻击者能够获取额外的信息数据。
就风险而言,SQLInjection攻击也是位居前列,和缓冲区溢出漏洞相比,其优势在于能够轻易的绕过防火墙直接访问数据库,甚至能够获得数据库所在的服务器的访问权限。
在某些环境下,SQLInjection漏洞的风险要高过其他所有的漏洞。
SQLInjection攻击利用的是SQL语法,这使得这种攻击具有广泛性。
特点鲜明:
2.1隐蔽性强
利用Web漏洞发起对WEB应用的攻击纷繁复杂,包括SQL注入,跨站脚本攻击等等,一个共同特点是隐蔽性强,不易发觉,因为一方面普通网络防火墙是对HTTP/HTTPS全开放的,另一方面,对Web应用攻击的变化非常多,传统的基于特征检测的IDS对此类攻击几乎没有作用。
2.2攻击时间短
可在短短几秒到几分钟内完成一次数据窃取、一次木马种植、完成对整个数据库或Web服务器的控制,以至于非常困难作出人为反应。
2.3危害性大
目前几乎所有银行,证券,电信,移动,政府以及电子商务企业都提供在线交易,查询和交互服务。
用户的机密信息包括账户,个人私密信息(如身份证),交易信息等等,都是通过Web存储于后台数据库中,这样,在线服务器一旦瘫痪,或虽在正常运行,但后台数据已被篡改或者窃取,都将造成企业或个人巨大的损失。
据权威部门统计,目前身份失窃(identitytheft)已成为全球最严重的问题之一。
政府网站被攻击和篡改造成恶劣的社会影响甚至被外来势力所利用,已经在危害着社会的稳定.非常严重的有形和无形损失。
目前,包括政府以及很多大型企业尤其是在国内外上市的企业,一旦发生这类安全事件,必将造成人心惶惶,名誉扫地,以致于造成经济和声誉上的巨大损失,即便不上市,其影响和损失也是不可估量的。
3SQL注入式攻击的检测、跟踪以及攻击的种类与防范
3.1SQL注入攻击简介
SQL注入攻击源于英文“SQLInjectionAttack”。
目前还没有看到一种标准的定义,常见的是对这种攻击形式、特点的描述。
微软技术中心从2个方面进行了描述:
(1)脚本注入式的攻击。
(2)恶意用户输入用来影响被执行的SQL脚本。
StephenKost给出了这种攻击形式的另一个特征,“从一个数据库获得未经授权的访问和直接检索”。
SQL注入攻击就其本质而言,他利用的工具是SQL的语法,针对的是应用程序开发者编程过程中的漏洞。
“当攻击者能够操作数据,往应用程序中插入一些SQL语句时,SQL注入攻击就发生了”。
由于SQL注入攻击利用的是SQL语法,使得这种攻击具有广泛性。
理论上说,对于所有基于SQL语言标准的数据库软件都是有效的,包括MSSQLServer,Oracle,DB2,Sybase,MySQL等。
当然,各种软件有自身的特点,最终的攻击代码可能不尽相同。
SQL注入攻击的原理相对简单,易于掌握和实施,并且整个Internet上连接有数目惊人的数据库系统(仅在中国,截至2003年3月的统计就有82900多个),在过去的几年里,SQL攻击的数量一直在增长。
3.2攻击检测/防御/跟踪模型
针对SQL攻击的防御,前人做过大量的工作,提出的解决方案包括:
(1)封装客户端提交信息。
(2)替换或删除敏感字符/字符串。
(3)屏蔽出错信息以及。
(4)在服务端正式处理之前对提交数据的合法性进行检查等。
方案
(1)的做法需要RDBMS的支持,目前只有Oracle采用该技术;方案
(2)是一种不完全的解决措施,举例来说明他的弱点,当客户端的输入为“…ccmdmcmdd…”时,在对敏感字符串“cmd”替换删除以后,剩下的字符正好是“…cmd…”;方案(3)的实质是在服务端处理完毕之后进行补救,攻击已经发生,只是阻止攻击者知道攻击的结果;方案(4)被多数的研究者认为是最根本的解决手段,在确认客户端的输入合法之前,服务端拒绝进行关键性的处理操作。
方案(4)与
(2)的区别在于,方案(4)一旦检测到敏感字符/字符串,针对数据库的操作即行中止,而方案
(2)是对有问题的客户端输入做出补救,不中止程序后续操作。
方案
(2)虽然在一定程度上有效,但有“治标不治本”的嫌疑,新的攻击方式正在被不断发现,只要允许服务端程序使用这些提交信息,就总有受到攻击的可能。
因此,本文中针对SQL注入攻击的检测/防御/备案模型即基于提交信息的合法性检查,在客户端和服务端进行两级检查,只要任一级检查没有通过,提交的信息就不会进入query语句,不会构成攻击。
在客户端和服务端进行合法性检查的函数基本相同。
客户端检查的主要作用是减少网络流量,降低服务器负荷,将一般误操作、低等级攻击与高等级攻击行为区分开来。
技术上,客户端的检查是有可能被有经验的攻击者绕开的,在这种情形下,提交的数据被直接发往服务端,通过在服务器端设定二级检查就显得十分必要。
由于正常提交到服务端的数据已经在客户端检查过,因此,服务端检查到的提交异常基本可以认定为恶意攻击行为所致,中止提交信息的处理,进行攻击备案,并对客户端给出出错/警告提示。
对应模型简图如图1所示。
3.3检测
对提交信息的检查,主要包括数据类型检查、数据长度检查和敏感字符过滤。
前两项可利用函数直接办到,敏感字符过滤则需要应用开发方做相应开发。
经过总结,对
语句时必须用到的,因此可以针对这些敏感字符,设定过滤函数,在把这些上传的参数结合到查询语句之前对他们进行过滤。
下面的2个函数即过滤模块的主要代码:
3.4跟踪
提交非法字符的人,都有可能是SQL注入攻击者。
但考虑到用户在正常使用中的误操作也有提交非法字符/字符串的可能,因此客户端的一级检查无论对用户误操作,还是一般性攻击,所做出处理措施只是中止信息提交,给出友好的出错提示。
在经过一级检查以后提交到服务器端的信息中仍然包括非法字符/字符串的,惟一的可能是攻击者绕开了客户端的一级检查。
对于这种危险的信号,服务器端将从收到的提交信息数据包中提取攻击源的IP地址,存入数据库备查,同时中止针对数据库的操作.
3.5SQL攻击的种类与防御手段
3.5.1SQL注入攻击的种类:
1.没有正确过滤转义字符
在用户的输入没有为转义字符过滤时,就会发生这种形式的注入式攻击,
它会被传递给一个SQL语句。
这样就会导致应用程序的终端用户对数据库上的语句实施操纵。
比方说,下面的这行代码就会演示这种漏洞:
statement:
="SELECT*FROMusersWHEREname='"+userName+"';"
这种代码的设计目的是将一个特定的用户从其用户表中取出,但是,如果用户名被一个恶意的用户用一种特定的方式伪造,这个语句所执行的操作可能就不仅仅是代码的作者所期望的那样了。
例如,将用户名变量(即username)设置为:
a'or't'='t,此时原始语句发生了变化:
SELECT*FROMusersWHEREname='a'OR't'='t';
如果这种代码被用于一个认证过程,那么这个例子就能够强迫选择一个合法的用户名,因为赋值't'='t永远是正确的。
在一些SQL服务器上,如在SQL Server中,任何一个SQL命令都可以通过这种方法被注入,包括执行多个语句。
下面语句中的username的值将会导致删除“users”表,又可以从“data”表中选择所有的数据(实际上就是透露了每一个用户的信息)。
a';DROPTABLEusers;SELECT*FROMdataWHEREnameLIKE'%
这就将最终的SQL语句变成下面这个样子:
SELECT*FROMusersWHEREname='a';DROPTABLEusers;SELECT*FROMDATAWHEREnameLIKE'%';
其它的SQL执行不会将执行同样查询中的多个命令作为一项安全措施。
这会防止攻击者注入完全独立的查询,不过却不会阻止攻击者修改查询。
2.Incorrecttypehandling
如果一个用户提供的字段并非一个强类型,或者没有实施类型强制,就会发生这种形式的攻击。
当在一个SQL语句中使用一个数字字段时,如果程序员没有检查用户输入的合法性(是否为数字型)就会发生这种攻击。
例如:
statement:
="SELECT*FROMdataWHEREid="+a_variable+";"
从这个语句可以看出,作者希望a_variable是一个与“id”字段有关的数字。
不过,如果终端用户选择一个字符串,就绕过了对转义字符的需要。
例如,将a_variable设置为:
1;DROPTABLEusers,它会将“users”表从数据库中删除,SQL语句变成:
SELECT*FROMDATAWHEREid=1;DROPTABLEusers;
3.数据库服务器中的漏洞
有时,数据库服务器软件中也存在着漏洞,如MYSQL服务器中mysql_real_escape_string()函数漏洞。
这种漏洞允许一个攻击者根据错误的统一字符编码执行一次成功的SQL注入式攻击。
4.盲目SQL注入式攻击
当一个Web应用程序易于遭受攻击而其结果对攻击者却不见时,就会发生所谓的盲目SQL注入式攻击。
有漏洞的网页可能并不会显示数据,而是根据注入到合法语句中的逻辑语句的结果显示不同的内容。
这种攻击相当耗时,因为必须为每一个获得的字节而精心构造一个新的语句。
但是一旦漏洞的位置和目标信息的位置被确立以后,一种称为Absinthe的工具就可以使这种攻击自动化。
5.条件响应
注意,有一种SQL注入迫使数据库在一个普通的应用程序屏幕上计算一个逻辑语句的值:
SELECTbooktitleFROMbooklistWHEREbookId='OOk14cd'AND1=1
这会导致一个标准的面面,而语句
SELECTbooktitleFROMbooklistWHEREbookId='OOk14cd'AND1=2在页面易于受到SQL注入式攻击时,它有可能给出一个不同的结果。
如此这般的一次注入将会证明盲目的SQL注入是可能的,它会使攻击者根据另外一个表中的某字段内容设计可以评判真伪的语句。
6.条件性差错
如果WHERE语句为真,这种类型的盲目SQL注入会迫使数据库评判一个
引起错误的语句,从而导致一个SQL错误。
例如:
SELECT1/0FROMusersWHEREusername='Ralph'。
显然,如果用户Ralph存在的话,被零除将导致错误。
7.时间延误
时间延误是一种盲目的SQL注入,根据所注入的逻辑,它可以导致SQL引擎执行一个长队列或者是一个时间延误语句。
攻击者可以衡量页面加载的时间,从而决定所注入的语句是否为真。
以上仅是对SQL攻击的粗略分类。
但从技术上讲,如今的SQL注入攻击者们在如何找出有漏洞的网站方面更加聪明,也更加全面了。
出现了一些新型的SQL攻击手段。
黑客们可以使用各种工具来加速漏洞的利用过程。
我们不妨看看theAsproxTrojan这种木马,它主要通过一个发布邮件的僵尸网络来传播,其整个工作过程可以这样描述:
首先,通过受到控制的主机发送的垃圾邮件将此木马安装到电脑上,然后,受到此木马感染的电脑会下载一段二进制代码,在其启动时,它会使用搜索引擎搜索用微软的ASP技术建立表单的、有漏洞的网站。
搜索的结果就成为SQL注入攻击的靶子清单。
接着,这个木马会向这些站点发动SQL注入式攻击,使有些网站受到控制、破坏。
访问这些受到控制和破坏的网站的用户将会受到欺骗,从另外一个站点下载一段恶意的JavaScript代码。
最后,这段代码将用户指引到第三个站点,这里有更多的恶意软件,如窃取口令的木马。
以前,我们经常警告或建议Web应用程序的程序员们对其代码进行测试并打补丁,虽然SQL注入漏洞被发现和利用的机率并不太高。
但近来攻击者们越来越多地发现并恶意地利用这些漏洞。
因此,在部署其软件之前,开发人员应当更加主动地测试其代码,并在新的漏洞出现后立即对代码打补丁。
3.5.2防御和检查SQL注入的手段
1.使用参数化的过滤性语句
要防御SQL注入,用户的输入就绝对不能直接被嵌入到SQL语句中。
相反,
用户的输入必须进行过滤,或者使用参数化的语句。
参数化的语句使用参数将用户输入嵌入到语句中。
在多数情况中,SQL语句就得以修正。
然后,用户输入就被限于一个参数。
下面是一个使用Java和JDBCAPI例子:
PreparedStatementprep=conn.prepareStatement("SELECT*FROMUSERSWHEREPASSWORD=?
");
prep.setString(1,pwd);
总体上讲,有两种方法可以保证应用程序不易受到SQL注入的攻击,一是使用代码复查,二是强迫使用参数化语句的。
强迫使用参数化的语句意味着嵌入用户输入的SQL语句在运行时将被拒绝。
不过,目前支持这种特性的并不多。
如H2数据库引擎就支持。
2.还要避免使用解释程序,因为这正是黑客们借以执行非法命令的手段。
3.防范SQL注入,还要避免出现一些详细的错误消息,因为黑客们可以利用这些消息。
要使用一种标准的输入确认机制来验证所有的输入数据的长度、类型、语句、企业规则等。
4.使用专业的漏洞扫描工具。
但防御SQL注入攻击也是不够的。
攻击者们目前正在自动搜索攻击目标并实施攻击。
其技术甚至可以轻易地被应用于其它的Web架构中的漏洞。
企业应当投资于一些专业的漏洞扫描工具,如大名鼎鼎的Acunetix的Web漏洞扫描程序等。
一个完善的漏洞扫描程序不同于网络扫描程序,它专门查找网站上的SQL注入式漏洞。
最新的漏洞扫描程序可以查找最新发现的漏洞
4总结与体会
互联网给人们带来方便的同时,一些负面的东西也就应运而生。
由于SQL注入攻击针对的是应用开发过程中的编程不严密,因而对于绝大多数防火墙来说,这种攻击是“合法”的。
问题的解决只有依赖于完善编程。
专门针对SQL注入攻击的工具较少,Wpoison对于用asp,php进行的开发有一定帮助。
SQL注入式漏洞存在着高危安全隐患,并且有着极强的隐蔽性,对于系统的设计中,应该加强对这方面的设计力度,让注入者无可乘之机。
参考文献:
[1]罗玉斌,李静媛昆明大学学报(综合版)《系统安全漏洞和修复》2004年
[2]李文锋,林天锋.《计算机与网络》SQL注入攻击2004年24期
[3]王清,赵双.《0Day安全(第二版)》2011年6月
[4]沧海浮萍,杂志《黑客X档案》.2011年
[5]2011-2012年中国信息安全产业发展研究年度总报告2012年5月
摘要
随着互联网技术的飞速发张,负面的软件瑕疵也是越演越烈,人们通常将那些可能引发安全问题的软件瑕疵称为“安全漏洞’,这一称呼是相当形象的,他们所导致的后果可能非常严重,比如系统被非法入侵、数据丢失等。
其实,定义一个让多方都能够认同的安全漏洞并不是一件简单的事,因为并不是所有的安全问题都可以归结到安全漏洞的层面,很多安全问题的产生是由于用户的不规范操作或者历史因素所造成的。
举个例子,在Windows2000/XP的管理共享功能中,由于安装者将管理员密码设定为空或弱密码,而导致他人通过管理共享入侵系统,就不能被划定为安全漏洞范畴,用户操作的不规范才是问题产生的主要因素。
另外,FTP使用明文传递密码也不能称之为安全漏洞,因为这是FTP协议制定时惯用的做法。
总的来说,那些与用户操作无关,且非历史因素造成的软件安全问题,才能够被定义为安全漏洞。
不可否认的是,经过这么多年的发展,、软件开发体系仍然不够成熟。
现在软件开发有了很多的方法可以做需求定义、模块交互、代码重用、测试等。
问题是:
这些方法对计算机有什么用处?
计算机有CPu、BIOS、存储设备、显示卡、网卡、主板等硬件设备,有操作系统、驱动、防病毒软件、个人防火墙、其他各种各样的第三方应用程序。
您的计算机上能列举出数百种不同组织提供的硬件和软件,他们都共存于一台计算机上,因此,每台计算机都是一个特殊的平台。
而许多应用程序必须运行在这些平台上。
焦点便在此:
不同的用户群使用不同的风格、方法、工具生成了这些代码,而当您把这些不同的软件放到一起工作时∥因为有这极大的变数,变化结果不可预测。
于是产生了Bug。
当软件变得日益复杂时,代码中错误的数量会随着增加,软件中潜在的Bug将随之增多,,软件团队修正漏河时,他们基于的环境相对用户的千千万万复杂环境来说,又太单纯了,不可能把用户的环境都模拟测试一遍,漏洞也无法避免。
关键字:
安全漏洞、安全防范、攻击种类