用户登录  |  用户注册
首 页毕业论文毕业设计下载定做交易过程截图支付宝在线支付
当前位置:完美毕业网毕业论文计算机毕业设计论文

SQL注入问题研究与防范方法

论文代写发表联系:点击这里给我发消息QQ212181988
一键分享拿折扣:

 摘要
目前许多基于B/S模式网络服务构架技术的应用程序在设计与开发时没有充分考虑到数据合法性校验问题,所以在其使用中存在着不少安全隐患。本文分析了SQL注入攻击的特点、原理,并对常用注入方法进行了总结。然后在主动式防范模型的基础上,提出了使用参数化查询、实施过滤和监视工具、精心编制错误消息、及时打补丁并强化数据和限制数据库的特权等几种思路和方法。
关键字:SQL注入,数据库安全,网络安全
0 引言
网络安全[1]是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断。随着全球信息技术日新月异的发展,网络信息安全[2]环境日趋复杂。“棱镜门”事件的持续发酵与影响,令更多不为人知的监控项目不断曝光,如何抵御网络威胁成为各国关注的首要议题之一。“没有网络安全就没有国家安全,没有信息化就没有现代化”已上升为国家战略。然而,不断变换攻击手段与方式的网络非法攻击活动,在时刻不停地寻找安全漏洞,伺机非法入侵。目前,针对Web应用程序和数据库的攻击和入侵已成为网络安全焦点。
据IT安全与控制公司(Sophos)发布的网络安全威胁报告研究显示,2008年,网站安全弱点特别是自动远程攻击如SQL注入攻击呈逐年上升的状态。另外,互联网犯罪举报中心(internet crime complaint center)近期发布的报告也显示,2008年,特别是与金融服务和在线零售业相关的网站受到的SQL注入攻击数量明显上升。根据网络安全公司WebCohort关于网络应用程序调查研究报告显示,有可能受到黑客攻击的网络应用程序不少于92%,其中,有60%就有可能遭受SQL注入攻击。随着IT产业的技术提升与规模扩大,基于B/S模式的网络服务构架技术的应用被普遍采用,使用Web脚本语言和后台数据库系统开发的网站占70%以上。这使得攻击者可以利用SQL语法攻击这类有安全漏洞的网站,通过在执行网站的数据库中植入恶意代码,从而掷出恶意指令感染网站数据库。并且,黑客们已经开发出自动化的工具,利用搜索引擎找出可能存在漏洞的网站,然后将代码植入其服务器中。网站安全弱点特别是SQL注入攻击将会成为恶意软件散播的主要渠道。
1 SQL注入
SQL注入攻击源于英文“SQL Injection Attack”,以下简称SIA。目前对SQL注入技术还没有标准的定义,常见的是对这种攻击形式、特点的描述。SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。SQL注入存在以下特性:
(1)广泛性。所有基于SQL语言标准的数据库软件都可能成为SIA的攻击目标。如果Web应用程序没有对输入的SQL语句做严格的规范都会形成安全隐患,均具有被SQL注入攻击的可能。
(2)隐蔽性。SQL注入利用的是正常的HTTP访问,攻击者可以借助合法用户身份通过网页对网站数据库进行访问与修改,因此目前大部分的防火墙[3]都不会对SQL注入发出警报,从而使得SQL注入攻击隐蔽性极强,不易被发现。
(3)门槛低。目前互联网上出现了许多SQL注入攻击工具,攻击者如果使用此类工具进行攻击,将在攻击效果大致相同的情况下大大降低对攻击者所需专业知识与技术的要求。
(4)变种多。有经验的攻击者能手动调整攻击参数,在注入攻击时能根据具体情况进行分析,构造巧妙的SQL语句,致使攻击数据的变种非常多,这导致传统的特征匹配检测方法仅能识别相当少的攻击,难以防范。
(5)危害大。由于Web编程语言本身的漏洞以及目前开发人员的安全意识较弱,大多数Web应用系统均具有被SIA攻击的可能。而攻击者一旦成功,就可以控制整个Web应用系统,给服务器和用户带来极大的损失。
2 SIA原理与实现
SQL注入攻击主要是以合法的身份为掩护通过构建畸形SQL语法组合,以常规输入方式将该组合作为参数传入系统后台,并结合系统自动执行该SQL语句来进行恶意操作。下面简要介绍SQL注入攻击的基本原理。
假设服务器中存在user表,其表内包含userId和password字段。则有:
(1)身份验证模块中常用的两个典型SQL语句:实现查询user表。
①Select * from user--返回记录内容
②Select count(*) from user--返回记录数
(2)在服务器应用程序的登录页面中,允许用户输入其用户名(userId)和密码(password)两个参数,然后进行身份验证。假设登录用户名为michael,密码为11111。则上述SQL语句将变为:
①Select * from users where userId='michael' and password='11111'
②Select count(*) from users where userId='michael' and password='11111'
正常情况下,假如第1条查询语句返回一条用户记录,则说明身份验证成功;反之,则说明登录验证失败。假如第2条查询语句返回记录数量等于1,则说明验证成功;返回值不等于1,则说明验证失败。
(3)如果分别为userId和password两个参数赋畸形值,则上述查询语句1就会变为:
①Select * from users where userId='michael' or 1=1— and password='abc'
语句1中有两个判断条件,只要其中一个为真,则身份验证就会成功,而1=1恒为真。
②Select count(*) from users where userId='michael' and 1=1 —and password='abc'
同理,该语句只要能保证数据库中有该用户名,则会验证成功。
综上所述,使用该方法还可以实现对数据库中的数据进行删除、插入和更新等危险操作。
3 SQL注入常用途径
攻击者通常有很多种方法来进行SQL注入,以下是几种常用途径。
1)强制产生错误
该类攻击的主要目的是对数据库类型、版本等信息进行识别。它的目的是收集数据库的类型、结构等信息为其他类型的攻击做准备,可谓是攻击的一个预备步骤。利用应用程序服务器返回的默认错误信息而取得漏洞信息。
2)采用非主流通道技术
除HTTP响应外,还可以通过通道获取数据。然而,并非所有数据库都支持通道,所以该方法仅仅适用于一部分数据库。SQL注入的非主流通道主要有E-mail、DNS以及数据库连接,基本思想为:先对SQL查询打包,然后借助非主流通道将信息反馈至攻击者。
3)使用特殊的字符
不同的数据库有许多不同的特殊字符和变量,通过某些有漏洞的配置或应用系统可以取得一些有用的信息,从而为下一步攻击提供方向。
4)使用条件语句
这种方法具体可分为基于内容、基于时间、基于错误三种不同的形式。一般在经过常规访问后加上条件语句,根据反馈来判断被攻击的目标。
5)利用存储过程
通过某些标准存储过程,数据库厂商对数据库的功能进行扩展的同时,系统也可与进行交互。部分存储过程可以让用户自行定义。通过其他类型的攻击收集到数据库的类型、结构等信息后,便能够建构执行存储过程的命令。这种攻击类型往往能达到远程命令执行、特权扩张、拒绝服务的目的。
6)避开输入过滤技术
虽然对于通常的编码都可利用某些过滤技术进行防范,然而由于此种情况下也有许多方法避开过滤,一般可达到此目的的技术手段包括SQL注释和动态查询的使用,利用截断,URL编码与空字节的使用,大小写变种的使用以及嵌套剥离后的表达式等等。借助于此些手段,输入构思后的查询可以避开输入过滤,从而攻击者能获得想要的查询结果。
7)推断技术
能够明确数据库模式、提取数据以及识别可注入参数。此种方式的攻击通过网站对用户输入的反馈信息,对可注入参数、数据库模式推断,这种攻击构造的查询执行后获得的答案只有真、假两种。基于推断的注入方式主要分为时间测定注入与盲注入两种。前者是在注入语句里加入语句诸如“waitfor 100”,按照此查询结果出现的时间对注入能否成功和数据值范围的推导进行判定;后者主要是“and l=l”、“and l=2”两种经典注入方法。这些方式均是对一些间接关联且能取得回应的问题进行提问,进而通过响应信息推断出想要信息,然后进行攻击。
3 SIA的防范方法
目前对于SQL注入的方法也有很多种。本节给出一些应对SQL注入的行之有效的建议和方法:
1)使用参数化查询
首先可以使用参数化查询来构建SQL查询,这样就可以将数据与代码区分开来。
参数化查询就是在SQL语句中有一个或多个嵌入参数的查询。与动态构造SQL字符串方法相比,该方法更加不易产生错误。下面给出一个使用Java和JDBC API的例子:
PreparedStatement prep = conn.prepareStatement("SELECT * FROM USERS WHERE USERNAME=? AND PASSWORD=?");
prep.setString(1, username);
prep.setString(2, password);
prep.executeQuery();
应当确保在查询数据库之前对输入进行净化。可以通过正则表达式来对用户提交的参数进行审核或者对这些参数的类型进行限制,保证传上来的参数跟我们需要的参数相符合。
2)实施过滤和监视工具
在Web应用程序和数据库这个水平上的过滤[4]和监视工具可有助于阻止攻击并检测攻击行为,从而减轻暴露在大规模的SQL注入式攻击中的风险。
在应用程序水平上,我们可以通过实施运行时的安全监视来对SQL注入攻击和生产系统中的漏洞进行防范。同样地,Web应用防火墙也有助于我们部署某些基于行为的规则集,可以在发生损害之前阻止攻击。
在数据库水平上,数据库活动监视可以从后台过滤攻击。对于目前所知道的注入攻击而言,应当部署好过滤器,以便向数据库管理员发出警告,此外还要有一些一般的过滤器来查找SQL注入攻击中的典型伎俩。
3)精心编制错误消息
黑客往往会利用你的错误消息来对付你。因此开发人员在开发的时候可以考虑当黑客故意发送非法请求来得到应用系统的反馈信息时应当返回什么样的错误信息。
我们应当配置Web服务器和数据库服务器,使其不输出错误或警告消息。因为攻击者可以利用“盲目SQL注入”等技术来了解你的数据库设计细节。
4)及时打补丁并强化数据
由于没有打补丁或者配置错误造成的与Web应用程序相关联的数据库遭受攻击,那么与SQL注入攻击相关的风险也会因之增加。
因此,我们需要及时给应用程序或者数据库打补丁,从而使用更新的数据来防御攻击。
此外,别忘了你的数据库是怎样配置的。你需要禁用不必要的服务和功能,目的是为了强化数据库及其赖以运行的操作系统。
5)限制数据库的特权
最后,我们需要更好地管理与Web应用程序相关的账户与后台数据库交互的方式[5]。许多问题之所以发生,其原因在于数据库管理员全面开放了一些账户,其目的是为了让开发人员更轻松地工作。但是,这些超级用户账户极易遭受攻击,并会极大地增加由SQL注入攻击及其它Web攻击给数据库所造成的风险。
一定要正确地管理所有的账户,使其仅能以最低的特权访问后台的数据库,当然前提是能够完成其工作。你一定要保障这些账户不会拥有对数据库作出更改的权利。
结束语
本文对SQL注入攻击的方法、原理以及常用注入途径进行了描述和总结,并对常用注入方法进行了总结。然后在主动式防范模型的基础上,提出了使用参数化查询、实施过滤和监视工具、精心编制错误消息、及时打补丁并强化数据和限制数据库的特权等几种思路和方法。本文对于越来越多的Web动态应用程序提供了较好的防范SQL注入式攻击的解决方案,具有一定的现实意义。
参考文献:
[1] 徳丸浩. Web应用安全权威指南[M]. 人民邮电出版社,2014.
[2] Scott D, Sh arp R. Abstracting Application Level Web Security.In: Proc 11th Intl World Wide Web Conf, May 2002. 396~ 407
[3] 包延芳.浅析网络防火墙技术[J].今日科苑, 2008(2):11-13.
[4] 陈栋. SQL注入的过滤方法探究[J].吉林广播电视大学学报,2014,10.
陈越,寇红召,费晓飞. 数据库安全[M]. 国防工业出版社,2011.

Tags:

作者:佚名
Copyright © 2007-2013 完美毕业网. All Rights Reserved .
页面执行时间:5,046.87500 毫秒
Powered by:完美毕业网 http://www.biye114.com