浅谈对于SQL注入攻击方法及预防措施

作者:黄晓兵 彭健 更新时间:2010-09-06 09:43 点击:
【论文发表关健词】SQL注入;漏洞;攻击检测;安全防范
【职称论文摘要】
随着网络应用的日益广泛,网络安全意识的增强,人们对网络安全的重视程度越来越高。与此同时,网络攻击也不断变换目标和攻击方法。现在,针对Web应用系统的攻击已经成为网络安全攻防新焦点。而在Web应用系统的所有攻击中,SQL注入成为Web应用系统的严重安全隐患。本文对SQL注

Abstract:With the increasingly extensive application of the network,People attach more and more importance to network security.At the same time,changes take place the targets and methods of network attacks. At present,attacks aimed at Web applications have become a new focus of network security attack and defense.SQL injection has become a serious security risk among all the attacks against Web application.In this paper, SQL injection attacks were integrated in the overview,and put forward from various angles the corresponding method of attack detection and prevention.
  Keywords:SQL injection;Vulnerability;Attack detection;Safety precaution
  一、引言
  SQL注入(SQL Injection),就是入侵者利用程序员对用户输入数据的合法性检查不严或不检测的特点,故意从客户端提交特殊的代码,从而收集程序及服务器的信息,进而获取想得到的资料。
  正是由于SQL的广泛使用而导致了SQL注入的发生.在过去几年中,SQL注入已经成为攻击Web应用系统的主要手段之一,因此,研究SQL注入攻击对保障Web应用程序的信息安全具有重要意义。本文诣在给出一个比较系统全面的SQL注入攻击和预防措施。文章从SQL注入的概述及途径入手,接着给出了SQL注入相应的攻击方法和预防措施。
  二、SQL注入攻击概述
  (一)SQL注入技术定义
  在Web网站系统开发过程中由于程序员在编写Web应用程序时,没有对用户提交数据的合法性进行判断,导致恶意用户可以提交一段精心构造的数据库查询代码,根据网页返回的结果,获得某些想得知的信息并发起更进一步的攻击,直至获取管理员账号密码,进入系统窃取或者篡改文件、数据等,这就是所谓的SQL注入攻击。
  SQL注入(SQL Injection)技术在国外最早出现在1999年,我国在2002年以后开始大量出现,目前没有对SQL注入技术的标准定义,微软中国技术中心从两个方面进行了描述[1]:
  1.脚本注入式的攻击。
  2.恶意用户输入用来影响被执行的SQL脚本。Chris Anle将SQL注入[2]定义为:攻击者通过在查询操作中插入一系列的SQL语句到应用程序中来操作数据。
  (二)SQL注入攻击的途径
  用户通过自己的途径将输入提交给Web应用程序,这样SQL注入也就有了相应的攻击途径。恶意用户一般会通过客户端输入、server变量以及cookie三种基本[3]的方式进行畸形SQL语句查询的提交,从而达到进行SQL注入的最终目的。
  三、SQL注入攻击的种类
  (一)注释符攻击
  使用注释通常可以使攻击者绕过验证。SQL在查询中支持注释,如,--、#等。通过注入注释符,恶意用户或者攻击者可以毫不费力的截断SQL查询语句。例如,对于查询语句SELECT*FROM users WHERE usermame=uname and Password=psw,如果恶意用户输入参数uname的值为admin--,Password的值为空,那么查询语句变为SELECT*FROM users WHERE usermame=admin and Password=,也就SELECT*FROM users WHERE usermame=admin。这就使得恶意用户不用提供密码就可以通过验证。
  (二)转义字符类型的攻击
  Web应用程序开发时没有对用户的输入进行转义字符过滤时,就会发生这种形式的注入式攻击,它会被传递给一个SQL语句.这样就会导致恶意用户对数据库上的语句实施操纵。例如,下面的这行代码就会演示这种漏洞:
  Statement:="SELECT*FROM users WHERE name='"+userName+"';"
  此段代码的设计目的是将一个特定的用户从其用户表中取出,但是,如果用户名被一个恶意的用户用一种特定的方式伪造,这个语句所执行的操作可能就不仅仅是应用程序开发者所期望的那样例如,将用户名变量(即username)设置为:
  a′or′1′=1′,此时原始语句发生了变化:
  SELECT*FROM users WHERE name=′a′OR′1′=′1′;
  如果这种代码被用于一个认证过程,那么这个例子就能够强迫选择一个合法的用户名,因为赋值
  ′1′=′1永远是真。
  在一些特定的SQL服务器上,如在SQL Server中,任何一个SQL命令都可以通过这种方法被注入,包括执行多个语句。
  (三)Union查询攻击
  Union查询动机是绕过验证或者提取数据。攻击者在查询语句中注入Union SELECT语句,并且因为用户控制"SELECT语句"的内容,攻击者可以得到想要的信息。Union查询SQL注入测试。
  假设我们有如下的查询:
  SELEC Name,Psw,Tel FROM Users WHERE Id=$id然后我们设置id的值为:
  $id=1UNION ALL SELECT bank CardNumber,1,1 FROM BankCardTable
  那么整体的查询就变为:
  SELECT Name,Psw,Tel FROM Users WHERE Id=1 UNION ALL SELECT bankCardNumber,1,FROM BankCarTable
  显然这样就能得到所有银行卡用户的信息。
  (四)构造参数攻击
  如果一个恶意用户提供的字段并非一个强制类型,或者没有实施类型强制,就会发生这种形式的攻击。当在一个SQL语句中使用一个数字字段时,如果程序员没有检查用户输入的合法性(是否为数字型)就会发生这种攻击。例如:
Statement:="SELECT*FROM data WHERE id="+a_variable+";"
  从这个语句可以看出,作者希望a_variable是一个与"id"字段有关的数字。不过,如果终端用户选择一个字符串,就绕过了对转义字符的需要。
  四、防止SQL注入的预防措施
  (一)使用参数化的过滤性语句
  要有效的防止SQL注入,用户的输入就绝对不能直接被嵌入到SQL语句中。恰恰相反,用户的输入必须进行过滤,或者使用参数化的语句。参数化的语句使用参数而不是将用户输入嵌入到语句中。在多数情况中,SQL语句就得以修正。然后,用户输入就被限于一个参数。下面是一个使用Java和JDBC API例子:
  PreparedStatement prep=conn.Prepare Statement("SELECT*FROM USERS WHERE PASSWOR D=?");
  prep.setString(1,pwd);
  使用代码复查和强迫使用参数化语句,强迫使用参数化的语句意味着嵌入用户输入的SQL语句在运行时将被拒绝。这样可以保证应用程序不易受到SQL注入的攻击。 (责任编辑:nylw.net)转贴于八度论文发表网: http://www.8dulw.com(论文网__代写代发论文_论文发表_毕业论文_免费论文范文网_论文格式_广东论文网_广州论文网)

发表评论
本站模板均经测试成功,请放心下载,遇到任何问题或者需要购买付费论文请联系本站。
表情:
验证码:点击我更换图片