SQL注入攻击漏洞研究与防范措施论文_第1页
SQL注入攻击漏洞研究与防范措施论文_第2页
SQL注入攻击漏洞研究与防范措施论文_第3页
SQL注入攻击漏洞研究与防范措施论文_第4页
SQL注入攻击漏洞研究与防范措施论文_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

第1期题目PAGE28第5期辽宁省电子信息产品监督检验院年度论文2009年1月-PAGE7-SQL注入攻击漏洞研究与防范措施StructuredQueryLanguageInjectionLeakStudyAndDefenseMeasure姜志坤摘要:在当今的数字世界中,人们发现在维持公开的Internet连接的同时,保护网络和计算机系统的安全变得越来越困难。病毒、木马、后门、蠕虫等攻击层出不穷,虚假网站的钓鱼行为也让警惕性不高的公众深受其害。为了减轻信息泄露及系统被攻击带来的风险,企业和机构开始对自己的系统进行渗透测试,找出其中存在的漏洞和薄弱环节。本文通过对目前最流行的SQL注入攻击漏洞的攻击方法做了逐一的分析,并提出了检测和防范的措施。关键字:SQL注入攻击脚本攻击网络安全攻击防范模型有害代码SQL注入(SQLInjection)攻击是目前网上最流行最热门的黑客脚本攻击方法之一,那什么是SQL注入式攻击呢?它是指黑客利用一些Web应用程序(论坛、留言本、文章发布系统)中某些疏于防范的用户可以提交或修改的数据的页面,精心构造SQL语句,把特殊的SQL指令语句插入到系统实际SQL语句中并执行它,以获得用户名、密码等敏感信息,从而达到获取主机控制权限的攻击方法。1.SQL注入攻击原理1.1SQL注入攻击实现原理结构化查询语言(SQL)是一种用来和数据库交互的文本语言,SQLInjection就是利用某些数据库的外部接口把用户数据插入到实际的数据库操作语言当中,从而达到入侵数据库乃至操作系统的目的。它的产生主要是由于程序对用户输入的数据没有进行细致的过滤,导致非法数据的导入查询。SQL注入攻击主要是通过构建特殊的输入,这些输入往往是SQL语法中的一些组合,这些输入将作为参数传入Web应用程序,通过执行SQL语句而执行入侵者想要的操作,下面以登录验证中的模块为例,说明SQL注入攻击的实现方法。在Web应用程序的登录验证程序中,一般有用户名(username)和密码(password)两个参数,程序会通过用户所提交输入的用户名和密码来执行授权操作。其原理是通过查找user表中的用户名(username)和密码(password)的结果来进行授权访问,典型的SQL查询语句为:Select*fromuserswhereusername=′admin′andpassword=′smith′如果分别给username和password赋值“admin'or1=1--”和“aaa”。那么,SQL脚本解释器中的上述语句就会变为:select*fromuserswhereusername=′admin′or1=1--andpassword=′aaa′该语句中进行了两个判断,只要一个条件成立,则就会执行成功,而1=1在逻辑判断上是恒成立的,后面的“--”表示注释,即后面所有的语句为注释语句。同理通过在输入参数中构建SQL语法还可以删除数据库中的表,查询、插入和更新数据库中的数据等危险操作:(1)droptableauthors—如果存在authors表则删除。(2)unionselectsum(username)fromusers—从users表中查询出username的个数。(3)insertintousersvalues(666,′attacker′,′foobar′,0xffff)—在user表中插入值。(4)unionselect@@version,1,1,1--查询数据库的版本。(5)execmaster.xp_cmdshell′dir′通过xp_cmdshell来执行dir命令。1.2SQL注入攻击分析SQL注入可以说是一种漏洞,也可以说是一种攻击。当程序中的变量处理不当,对用户提交的数据过滤不足,都可能产生这个漏洞。它的攻击原理就是利用用户提交或可修改的数据,把想要的SQL语句插入到系统实际SQL语句中,轻则获得敏感的信息,重则控制服务器。例如Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,要求用户输入一个名称和密码。攻击者在用户名字和密码输入框中输入1'or'1'='1之类的内容。该内容提交给服务器之后,服务器运行上面的代码构造出查询用户的SQL命令,但由于攻击者输入的内容非常特殊,所以最后得到的SQL命令变成:“select*fromuserswhereusername=''or'1'='1'andpassword=''or'1'='1'”。服务器执行查询或存储过程,将用户输入的身份信息和服务器中保存的身份信息进行对比,由于SQL命令实际上已被注入式攻击修改,已经不能真正验证用户身份,所以系统会错误地授权给攻击者。SQL注入是通过目标服务器的80端口进行的,这和普通的Web页面访问没什么两样,所以一般的防火墙不会对这种攻击发出警告或拦截。这种攻击可能引起的危害取决于该网站的软件环境和配置。当Web服务器以操作员的身份访问数据库时,利用SQL注入攻击就可能删除所有表格,创建新表格。而当管理员以超级用户的身份访问数据库时,利用SQL注入攻击就可能控制整个SQL服务器,在某些配置下攻击者甚至可以自行创建用户账号以完全操作数据库所在的服务器。SQL注入的方法很多,而且在攻击时会碰到各种各样的SQL语句,所以一般攻击者需要丰富的经验和耐心,才能绕过一些检测和处理提交构造的SQL语句,从而获得想要的有用信息。这个过程需要花费很多的时间,如果仅以这种手动方式进行SQL注入攻击的话,许多存在SQL注入漏洞的ASP网站会安全很多了,不是漏洞不存在了,而是利用这个漏洞入侵的成本太高了。但现在攻击者可用一些现成的黑客工具来辅助SQL注入攻击,加快入侵的速度。由于SQL注入攻击利用的是SQL语法,使得这种攻击具有广泛性。理论上说,对于所有基于SQL语言标准的数据库软件都是有效的,包括MSSQLServer,Oracle,DB2,Sybase,MySQL等。当然,各种软件有自身的特点,最终的攻击代码可能不尽相同。1.3SQL注入攻击过程(1)绕过身份认证机制一个登录界面,需要输入用户名和密码,然后Post到另一个页面,进行身份认证,因此攻击者只需在用户名和密码的输入框中都输入"’or’1’=’1"的内容,那么攻击者就可以不经过任何认证而直接进入下一个页面,并拥有和正常登录用户一样的全部特权。原因是什么呢?我们比较一下正常用户登录和攻击者登录时的两种SQL语句:1)正常用户(用户名为grace,密码为1111):SQL="select3fromadminwhereusername=’grace’andpassword=’1111’2)攻击者(用户名和密码都为"’or’1’=’1"):SQL="select3fromadminwhereusername=’’or’1’=’1’andpassword=’’or’1’=’1’可以看到由and连接的两个条件都被一个永远成立的’1’=’1’所代替,执行的结果为真,因此服务器也会认为条件成立,于是把login标志设为true,让攻击者以合法身份登录进入下一个页面。(2)对数据库系统进行读取、插入、修改等操作如一个商品查询页面findproduct.asp?id=1,程序设计者原本设计意图是显示id为1的商品信息,而攻击者利用程序中没有对id的内容进行检查之机,插入自己的代码。从findproduct.asp中摘录两句最关键的语句:SQL="select3fromproductwhereproductid=’"&request("id")&"’"rs.openSQL,conn,0,3可以看到,id没有进行任何的处理,直接构成SQL语句并执行,而攻击者在知道该系统的数据库中表及表中字段名称的情况下(目前网上免费的论坛系统或是商业网站代码非常多),利用SQL语句特性(分号是将两句SQL语句分开的符号),直接向数据库中添加记录:findproduct.asp?id=1;Insertinto"admin"(’username’,’password’,’type’)values(’hacker’,’pass123456’,’管理员’),然后攻击者就可以直接用刚才建立的帐户进行登录了。通过这样的方法,攻击者还可以对系统做任何的事情,包括增加、修改、删除记录。(3)执行系统命令如果Web主机使用MSSQL数据库系统,而list.asp中存在注入点,那么攻击者就可以用到xp_cmdshell这个扩展存储过程,xp_cmdshell是一个非常有用的扩展存储过程,用于执行系统命令,比如dir,net等,攻击者可以根据程序的不同,提交不同的语句:http://www.XXX.comölist.asp?id=1;?exec?master.dbo.xp_cmdshell?’dir’http://www.XXX.comölist.asp?id=1;?exec?master.xp_cmdshell?’dir’或者可以插入下面的语句netuserhacker/addnetlocalgroupadministratorshacker/add来向Web主机系统中加入一个非法的管理员帐号,不过这样的做法必须同时满足几个条件,首先ASP使用的SQLSERVER帐号必须是管理员,其次请求的提交变量在整个SQL语句的最后,否则构造出来的SQL语句在语法上是错误的,也就不可能执行成功。2.SQL注入攻击的检测方式及方法2.1检测方式SQL注入攻击检测分为入侵前的检测和入侵后的检测。入侵前的检测,可以通过手工方式,也可以使用SQL注入工具软件。检测的目的是为预防SQL注入攻击,而对于SQL注入攻击后的检测,主要是针对日志的检测,SQL注入攻击成功后,会在IIS日志和数据库中留下“痕迹”。2.2检测方法(1)输入验证检查动态的SQL语句是一个进行数据库查询的强大的工具,但把它和用户输入混合在一起就使SQL注入成为了可能。将动态的SQL语句替换成预编译的SQL或者存储过程对大多数应用程序是可行的。预编译的SQL或者存储过程可以将用户的输入作为参数而不是SQL命令来接收,这样就限制了入侵者的行动。当然,它不适用于存储过程中利用用户输入来生成SQL命令的情况。在这种情况下,用户输入的SQL命令仍可能得到执行,数据库仍然有受SQL注入攻击的危险。如果一个输入框只可能包括数字,那么要通过验证确保用户输入的都是数字。如果可以接受字母,那就要检查是不是存在不可接受的字符。确保应用程序要检查以下字符:分号、等号、破折号、括号以及SQL关键字。(2)数据检查使用HDSI、NBSI和Domain等SQL注入攻击软件工具进行SQL注入攻击后,都会在数据库中生成一些临时表。通过查看数据库中最近新建的表的结构和内容,可以判断是否曾经发生过SQL注入攻击。(3)日志检查在Web服务器中如果启用了日志记录,则IIS日志会记录访问者的IP地址,访问文件等信息,SQL注入攻击往往会大量访问某一个页面文件(存在SQL注入点的动态网页),日志文件会急剧增加,通过查看日志文件的大小以及日志文件中的内容,也可以判断是否发生过SQL注入攻击。(4)其他SQL注入攻击成功后,入侵者往往会添加用户、开放3389远程终端服务以及安装木马后门等,可以通过查看系统管理员账号、远程终端服务器开启情况、系统最近日期产生的一些文件等信息来判断是否发生过入侵。3.SQL注入攻击防范模型及措施3.1防范模型在前人提出的SQL注入攻击的检测/防御/备案模型基础上,本人进行了检测过程的优化,提出了一种SQL自动防范模型如图1所示,本模型中所有检测都在服务器端进行。首先对IP地址进行检测,如果该IP地址在SQL注入攻击库中,则禁止该用户的访问,并再次将相关信息添加到SQL注入攻击库中;如果用户是首次访问,则对提交字符进行检测,如果是非法字符,则检测是否达到规定的访问值,如果达到则禁止用户访问,同时发送邮件给系统管理员。本模型可以防止攻击者穷举攻击并可自由设置攻击次数的上限,一旦到达上限,系统将自动发送邮件给管理员,管理员收到邮件后可以进行相应的处理,如果条件允许,还可以增加短信发送,增强SQL注入攻击的自动防范能力。客户端提交信息客户端提交信息服务器检测Sql注入库中检测IP地址是否存在服务器端字符串检测检测字符串是否合法正确访问地址禁止访问服务器进行备案是否超过指定访问值发送Email是是是否否否图1本模型的最大特点是自动将攻击信息及时地传递给管理员,方便管理员及时做出响应。核心代码如下:substopit()response.write"存在禁止访问ip地址:"&rs("ip")response.endresponse.redirect"noright.asp"endsubdimattack_browser,attack_ip,attack_hostattack_browser=Request.ServerVariables("Http_User_Agent")attack_ip=Request.ServerVariables("ReMote_Addr")attack_host=Request.ServerVariables("Remote_Host")setrs1=server.createobject("adodb.recordset")'从访问禁止ip中查询是否存在访问者的IP地址,如果存在则禁止其访问SQL1="selectipfromprohibit_ipwhereip=′"&attack_ip&"′"rs1.openSQL1,conn,1,3ifnotrs1.eofthencallstopit()endifrs1.closesetrs1=nothing'从系统防范设置中查出email地址和运行的访问次数setrs2=server.createobject("adodb.recordset")SQL2="select*fromD_setup"rs2.openSQL2,conn,1,3ifnotrs2.eofthensession("email")=rs2("email")session("ok_count")=rs2("ok_count")endifrs2.closesetrs2=nothingurl=Request.ServerVariables("Query_String")callchk(url)'从Attack_count表中获取A_count的次数,如果A_count次数不小于默认的访问次数则禁止ifchk(url)thensetrs3=server.createobject("adodb.recordset")SQL3="selectA_countfromattack_count"rs3.openSQL3,conn,1,3ifnotrs3.eofthenifrs3("A_count")>=session("ok_count")then'插入攻击记录信息到attack_record表中t1_SQL1="insertintoAttack_record(ip,Attacktime,Host,Browser)value(′"&attack_ip&"′,now(),′"&attack_host&"′,′"&attack_browser&"′)"setrsdel=conn.execute(t1_SQL1)callstopit()ok=Jmail(session("email"),"SQL注入攻击告警!","攻击者IP地址:"&attack_ip)elsetemp_a_count=rs3("a_count")+1'插入攻击ip和a_count信息到Attack_count表中t1_SQL2="insertintoAttack_count(ip,A_count)value(′"&attack_ip&"′,′"&temp_a_count&"′)"setrsdel=conn.execute(t1_SQL2)endifendif3.2防范措施SQL注入攻击防范方法目前已经有很多,总结起来有以下方法:(1)在服务端正式处理之前对提交数据的合法性进行检查。如果一个输入框只可能包括数字,那么要通过验证确保用户输入的都是数字。如果可以接受字母,那就要检查是不是存在不可接受的字符。确保应用程序要检查以下字符:分号、等号、破折号、括号以及SQL关键字。另外限制表单或查询字符串输入的长度也是一个好方法。如果用户的登录名字最多只有10个字符,那么不要认可表单中输入的10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。(2)封装客户端提交信息;(3)替换或删除敏感字符/字符串。使用双引号替换掉所有用户输入的单引号,这个简单的预防措施将在很大程度上预防SQL注射攻击,单引号常常结束掉SQL语句,可能给予输入者不必要的权力。用双引号替换掉单引号可以使许多SQL注入攻击失败。如:“select*fromuserswhereusername=or1=1andpassword=or1=1”显然会得到与“select*fromuserswhereusername=''or'1'='1'andpassword=''or'1'='1'”不同的结果。(4)屏蔽出错信息。攻击者有时从客户端提交特殊的代码,根据IIS给出的出错提示信息来收集程序及服务器的信息,从而获取想得到的资料。如果把IIS设置成不管出什么样的ASP错误,只给出一种错误提示信息,那么攻击者就没办法入侵了。(5)不要用字串连接建立SQL查询,而使用SQL变量,因为变量不是可以执行的脚本。动态的SQL语句是一个进行数据库查询的强大的工具,但把它和用户输入混合在一起就使SQL注入成为了可能。将动态的SQL语句替换成预编译的SQL或者存储过程对大多数应用程序是可行的。预编译的SQL或者存储过程可以将用户的输入作为参数而不是SQL命令来接收,这样就限制了入侵者的行动。当然,它不适用于存储过程中利用用户输入来生成SQL命令的情况。在这种情况下,用户输入的SQL命

温馨提示

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

评论

0/150

提交评论