技术SQL注入攻击分析及防范论文.docx
- 文档编号:5670771
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:18
- 大小:44.99KB
技术SQL注入攻击分析及防范论文.docx
《技术SQL注入攻击分析及防范论文.docx》由会员分享,可在线阅读,更多相关《技术SQL注入攻击分析及防范论文.docx(18页珍藏版)》请在冰豆网上搜索。
技术SQL注入攻击分析及防范论文
【关键字】技术
编号:
毕业论文说明书
题目类型:
¨理论研究¨实验研究¨工程设计¨工程技术研究þ软件开发
0日
摘要
随着互联网技术的普及,Browser/Sever(以下简称为B/S)模型得到了广泛的应用。
在服务器端,由于信息量大,为了方便管理和使用,数据库技术被广泛运用在B/S模型中,但是数据库技术和Web技术共同使用在一个系统中时,必须要通过相应的接口。
接口技术不成熟,网站设计者代码书写不严谨就给站点造成了种种漏洞,SQL注入攻击也是利用Web与数据库之见接口上的漏洞来实现攻击的手段。
网络时代已经来临,越来越多的信息都是在通过网络来传递,这种快速和开放的模式越来越为人们适用。
但是与此同时,信息安全的重要性也越来越突出。
受经济利益驱使的一些不法举动也在网络中频频出现,各式各样的攻击手段层出不穷。
SQL注入攻击就是其中较为常见的一种,而且对网站造成的危害也不亚于其他的任何一种攻击。
虽然SQL注入攻击已经不是什么新的攻击手段,但是有很多站点依旧饱受SQL注入攻击的折磨,这说明,SQL注入攻击的防范意识还不够强,对于这方面的技术还不够成熟。
近几年来,SQL注入攻击在网络十分盛行,SQL注入攻击工具下载也比比皆是,其主要原因是,许多站点都存在着被注入的漏洞,网络安全问题亟待解决。
本文中,我将使用PHP动态Web技术MYSQL数据库技术作为研究的工具,深入分析SQL注入攻击的攻击步骤,讨论SQL注入攻击的根本原理,并且再从原理出发,分析存在SQL注入攻击的漏洞所在,并且总结现有的防范SQL注入攻击的方法,再根据SQL注入攻击的自身特点,总结一套避免SQL注入攻击的有效手段。
关键词:
SQL注入攻击;攻击;防范;过滤;正则表达式
Abstract
WiththepopularityofInternettechnology,theBrowser/Severmodel(B/Sforshort)hasbeenwidelyused.Totheserver,itishardtomanagethelargeamountofinformation,sothedatabasetechnologyhasbeenwidelyusedintheB/Smodelaswell,butwhenthedatabasetechnologyandWebtechnologyworksinonesystematthesametime,wemustputaninterfacebetweenthem.Iftheinterfaceisnotperfectorthewebsitedesignerisnotprofessionalenough,thesecurityholeswillappear.TheSQLinjectionisakindofattackbasedonthesesecurityholes.
Duringrecentyears,SQLinjectionattacksareverypopularinthenetwork,andtheSQLinjectionattacktoolscanbedownloadedeasily.Thisphenomenonistotallytheresultofthis:
manysiteshavesecurityholes,andnetworksecurityneedtobesortedoutimmediately.
Inthisarticle,IwillshowthecourseofSQLinjectionattacks,discusstheprincipleofSQLinjectionattacksandmakeasolutiontoprotectwebsitefromSQLinjectionbymyself.
Keywords:
SQLinjection,attacks,protect,filter,regularexpression
摘要i
Abstractii
目录iii
第一章绪论2
第二章什么是SQL注入攻击3
2.1SQL注入攻击原理3
2.2SQL注入攻击实例3
2.3SQL注入攻击的特点5
2.3.1攻击手段简单5
2.3.2隐蔽性强5
2.3.3变种极多6
2.3.4危害大6
2.4SQL注入攻击的危害与现状6
第三章SQL注入攻击步骤7
3.1注入可行性分析7
3.1.1分析站点地址6
3.1.2“1=1”和“1=2”测试6
3.2注入点分析7
3.3上传代码进行攻击7
3.3.1分析Web提供的数据库查询语句8
3.3.2猜测数据库中表名及字段名9
3.3.3上传攻击代码18
第四章SQL注入攻击的防范11
4.1处理输入字符串中的单引号11
4.2使用转义字符代替输入栏中的符号13
4.3尽可能使用数据类型匹配14
第五章使用正则表达式防范SQL注入攻击14
第六章具体的注入实例……………………………………...…………………………………………………………………..17
第七章总结23
致谢25
参考文献26
第一章绪论
现在,PHP和MYSQL技术构成的B/S模型成为了网站建设常用的架构之一,有很多知名的大型网站都在使用这一套技术作为自己的技术基础,比如Yahoo!
、新浪等大型网站都是在使用这种架构[1]。
这种架构相对MicroSoft和JAVA的那一套技术有着一套得天独厚的优势,那就是这套架构是完全免费而且开源。
这样一套开源的系统,经过多年的磨练到了今天已经成为了一项相对成熟的技术。
越是受欢迎,越是被更多的人关注和研究,随之就会暴露出一些问题来。
在动态Web与SQL服务器中体现出的最突出的问题就是数据的安全性和保密性了。
Web用户拥有对数据库不同级别的访问权限,比如:
某网站的会员可以浏览该资源而游客就无权浏览,而且二者都没有对资源的修改权,网站的管理员则有对资源的修改权等等。
为了越权方位或者破坏数据库里面的信息,网络中的黑客就尝试使用各种手段攻击系统中的薄弱环节。
SQL注入攻击就是其中的一种。
SQL注入攻击是对进行攻击的常用手段之一。
随着模式应用开发的发展,使用这种模式编写应用程序的也越来越多。
但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。
用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQLInjection,即SQL注入。
SQL注入攻击可以攻击任何B/S模型,不单单是LAMP,Microsoft和JAVA为技术基础的系统也有可能受到这种方式的攻击。
同其他的对数据库的攻击手段一样,SQL注入攻击对数据库造成的损失可能是不可挽回的,小则泄露数据库中的机密资源,大则数据库全面崩溃,信息全部丢失。
不仅仅是数据库,攻击者还可以通过SQL注入攻击的手段上传木马,对使用者的信息安全也造成了一定得威胁。
面对这种破坏性极强的攻击手段,我们并不是毫无办法。
在下面我就将使用PHP+MYSQL作为基础,解析SQL注入攻击的攻击原理,并且将其实现,再根据攻击的原理解释现有的防范手段的理论根据。
第二章什么是SQL注入攻击
SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看数据库日志的习惯,可能被入侵很长时间都不会发觉。
但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。
能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据。
2.1SQL注入攻击原理
SQL注入攻击实际上是程序漏洞的直接后果。
这个漏洞产生的原因是程序中对用户提交的参数估计不足,过滤不足。
而攻击者就利用了这一点漏洞,把自己想要运行的SQL语句插入到传递给数据库端的代码中,实现自己的目的。
这个漏洞给了攻击者重构数据库查询语句的可能。
在数据库进行查询,基本上都是使用“Select[字段名]from[表名]where[查询条件]”形式的语句。
Web中使用数据库工作的原理就是让用户输入查询语句的一部分,这一部分一般都是查询条件。
例如:
"SELECT*FROMtable1wherecol1='".$_POST['$str']."'",这里可以看出是直接将Web中获得的值写入到SQL查询语句中,如果用户输入了name1,那么传递给数据库的查询语句就是:
"SELECT*FROMtable1wherecol1=‘name1’'",这样一条完整的查询语句就构成了。
SQL注入攻击的原理也是在以上Web中使用SQL的工作原理相同,只不过SQL注入攻击是一种恶意的重构代码的过程。
还是使用上面的例子,攻击者如果输入了“any’or1=1/*”,那么传递给数据库的查询语句就成了:
“Select*FROMtable1wherecol1=‘any’or1=1--’”,1=1的结果是true,那么不管col1=‘any’这个命题的真假,col1=‘any’or1=1的结果永远都是true,再加“--”注释掉了在它之后的所有的SQL语句,那么其实这句话可以理解成“Select*FORMtabl1where1”,而这句语句的结果是table1里面所有的数据。
这样SQL注入攻击就完成了。
可以看出,SQL注入攻击的原理十分简单,只是需要准确的分析出Web页面中已经给出的查询语句即可进行攻击。
2.2SQL注入攻击实例
下面,我用一个很简单的SQL注入攻击的例子来演示一次SQL注入攻击。
例子是以“PHP+MYSQL”为框架进行试验的。
图21:
某网站的入口
图2-1表示是某个网站的入口,想进入网站就需要用户输入相应的代号或者密钥。
如果输入的代号或者密钥正确,页面就会现实该代号或者密钥对应的那条记录。
例如输入:
“00001”,页面上现实的结果如图2-2所示。
图2-2:
“00001”对应的记录
以上是正常访问资源的途径,如果想要通过SQL注入的方式进行非法的访问,只需要在输入的内容上做文章。
例如输入:
“0'or1=1--”,页面上的结果将令人震惊。
如图2-3
图23:
被SQL注入攻击后的页面
服务器返回了数据库里面所有的记录,SQL注入攻击成功。
这说明该网站存在严重的安全漏洞,使得SQL注入攻击可以轻易的实现。
图2-4:
某网站的登录认证页面
再例如,某网站如图2-4所示,具有用户名,密码认证登陆页面,输入正确的用户名和密码就会接到“登陆成功”的页面然后访问有一定访问权限的资源,相反,如果登录失败了,就无权看到站点中的内容了。
与上个例子不同的是,这个站点不会将信息以表格的形式直接现实在页面上。
这样看似安全的站点其实也存在SQL注入攻击的漏洞。
使用SQL注入攻击,在用户名处输入“any”,在密码处输入“any'union
select*fromusersintooutfile'd:
/out.txt'--”这时,虽然页面上仍旧现实不能登陆,但是攻击者已经将数据库内所有的用户名和密码都导入到了自己的硬盘中,打开这个
文件,就可以看到如图2-5所示的内容。
图2-5
这样,攻击者就获得了所有可以登陆的用户名和密码,其中可能有管理员的用户名和密码,于是就达到了控制数据库的目的。
2.3SQL注入攻击的特点
2.3.1攻击手段简单
SQL注入攻击不借助其他的工具,仅仅通过Web漏洞就可以展开攻击,攻击的方式也是上传数据库查询语句,不关系到网站结构。
所以,现在网络上已经出现了很多SQL注入攻击工具,更是降低了攻击者的技术门槛,所以,这也是SQL注入攻击日益严重的原因之一。
2.3.2隐蔽性强
SQL注入利用的是正常的HTTP服务端口,表面上看来和正常的web访问没有区别,隐蔽性极强,不易被发现,一般的防火墙等安全产品也不会发出任何警报。
这时因为在SQL注入的过程中,攻击者使用的都是合法的数据库查询语句交给数据库引擎处理,只不过这些查询语句的结果是携带者私人信息的,具有保密性质的信息。
于是攻击者就达到了攻击的目的。
2.3.3变种极多
有经验的攻击者会手动调整攻击参数,致使攻击数据的变种是不可枚举的,这导致传统的特征匹配检测方法仅能识别相当少的攻击,难以防范。
就像在2.1章节中的例子一样,攻击者既可以直接从Web上得到信息,又可以通过导出的方式输出到文件。
2.3.4危害大
攻击者一旦攻击成功,可以控制整个WEB业务系统,对数据做任意的修改,直接威胁到网站的私人信息和保密信息,造成私人信息泄露和网站瘫痪等后果。
直接影响到使用者和网站建设者的经济利益。
2.4SQL注入攻击的危害与现状
攻击者可以通过SQL注入的手段,随意获取Web站点中数据库内的数据,篡改网页的内容,上传ASP/JSP/PHP木马,更有甚者,可以找到从Web进入数据库管理的入口,掌控后台数据库。
再通过这些方式,获取隐私信息,商业机密等等,这对被攻击者或者Web站点的普通用户来说,是相当大的损失。
据赛门铁克2006年3月的互联网安全威胁报告(第九期)显示,目前有近70%的攻击行为是基于WEB应用,而据CVE的2006年度统计数据显示,SQL注入攻击漏洞呈逐年上升的状态,2006年更是达到了惊人的1078个,而这些还仅限于通用应用程序的漏洞,不包括更为庞大的专业web应用程序所存在的漏洞[3]。
仅仅3年前就已经达到了如此惊人的数目。
这说明,做好SQL注入攻击的防范工作,是建设一个成功的Web站点的必要工作。
第三章SQL注入攻击步骤
3.1注入可行性分析
并非所有的Web站点都注入攻击的可能,所以注入攻击之前,要先分析站点是否有注入攻击的可能性。
3.1.1分析站点地址
如果URL只是对站点页面的访问,是不存在注入攻击的可能性的。
例如:
”.cn/162.shtml”此类站点,我们可以看出,URL指向的是个静态页面,与后台数据库服务器无关,所以这类站点是不存在被SQL注入攻击的可能的。
还有种站点,指向他的URL通常类于”.cn/index.php?
id=20”的形式,明显是要从Web中获得参数,然后通过后台数据库查询并返回结果,像这一类站点就潜伏着被SQL注入攻击的可能。
但是,并非使用了数据库技术的动态Web站点是以”.cn/index.php?
id=20”这种URL的样式体现,还有些动态页面,涉及到了用户认证,信息检索等需要搜索服务的动态页面,他们跳转的结果大多数都采用了数据库技术。
3.1.2“1=1”和“1=2”测试
从URL上来分析注入的可能性是很直观也很有效的办法,但是光是从URL上分析注入可能性是不能得到准确结论的,还有一种更准确的办法,就是“1=1”和“1=2”测试。
测试的过程如下:
首先,使用正常访问的手段访问站点。
输入URL:
.cn/index.php?
id=20得到一个页面,记录这个结果为标准结果。
输入URL:
.cn/index.php?
id=20and1=1。
与标准结果对比,如果结果相同说明这个站点有被SQL注入攻击的可能;如果站点返回了数据匹配一类错误,则说明该站点可以防范SQL注入攻击。
输入URL:
.cn/index.php?
id=20and1=2。
与标准结果对于,如果出现了没有记录集的提示,则说明这个站点有被SQL注入攻击的可能;如果站点返回了数据匹配一类错误,则说明该站点可以防范SQL注入攻击。
“1=1”和“1=2”测试不局限于带参数的URL中,像在第二章的两个例子,也可以先使用“1=1”和“1=2”对站点进行漏洞的测试。
3.2注入点分析
当确定了可以使用SQL注入的手段对站点进行攻击了以后,就要在Web站点中找到突破点,进行SQL注入攻击。
一般进行SQL注入攻击的突破口都是在用户自定义输入的地方。
比较常见的攻击方式都是在URL的参数后和输入栏中的内容做文章。
从这些地方入手,输入一些特殊语句,可以根据浏览器返回信息,判断数据库类型,从而构建数据库查询语句找到注入点。
这些返回信息可能伴随着数据库的返回信息一起表现到页面上来,通过返回信息,可以获得数据库中表名等底层信息。
注入点是网站的参数传递的薄弱环节,通常就是Web页面与数据库之间的接口。
3.3上传代码进行攻击
3.3.1分析Web提供的数据库查询语句
传递给数据库执行的代码必须是没有语法和语义错误的字符串,数据库才能返回搜索结果。
所以不管是正常使用Web站点功能还是使用SQL注入攻击都必须遵循上面的原则。
那么,如果攻击者想重构数据库查询语句,就必须先知道,Web提供给用户了哪些查询语句。
这里就是注入攻击的一个难点,攻击者准确必须分析出Web提供给用户的查询语句才可以重构数据库端可以执行的字符串,而且通常需要精确到每一个标点,稍有误差都会让代码不可执行,攻击失败。
拿第二章的第一个例子来说,输入“0'or1=1/*”就可以传递给数据库如下代码:
SELECT*FROMclass1wherenumber='0'or1=1--'
number='0'or1=1的值永远都是true,所以,执行的结果就是数据库中所有的记录。
同样,在第二个例子中传递给数据库如下代码:
SELECT*FROMuserswhereuser='any'andpassword='any'unionselect*fromusersintooutfile'd:
/out.txt'/*'
在这个例子里,攻击者使用union连接了自己的查询代码,并且将查询结果导出到文件。
3.3.2猜测数据库中表名及字段名
由于Web站点的设置原因,不一定会返回数据库底层信息。
在这种情况下想要攻击站点就要先猜测数据库中的表名和字段名,根据通常的命名规则和命名习惯进行猜测。
由于查询操作都是以表为搜索范围开展搜索的,所以知道数据库中的表名是注入攻击的必要条件。
SQL注入攻击技术已经成熟,也表现在攻击者在猜测数据库表名和字段名时总结出了一套有效的猜测方式。
有经验的攻击者通常可以使用更灵活的方式获取数据库的表名和字段名,比如灵活利用数据查询过程返回的错误或者采用跨站、旁注、COOKIES欺骗,嗅探等其他脚本入侵的方式获取。
3.3.3上传攻击代码
SQL注入攻击的过程实质上就是攻击者可以按照自己的意图,让Web站点的数据库可以执行自己提供的搜索语句,并且将结果按照自己的意愿输出。
所以其实上传的代码普遍都是数据库查询,更新,删除语句或者关于全线操作的语句,没有什么特别。
攻击者比较常用的SQL语句有:
UNION联合查询语句
UNION在SQL注入过程中发挥了重要的作用,因为它可以把两条毫无关系查询语句连接起来。
攻击者使用UNION,可以按自己的需要写出一条SQL语句给数据库执行。
SELECTINTOOUTFILE
SELECTINTOOUTFILE是导出查询结果到文件的语句。
并不是所有的查询结果都会反映在页面上,SELECTINTOOUTFILE语句就允许攻击者可以通过导出到文件的方式获取数据库中的资源。
AND和OR逻辑运算
逻辑运算频繁出现在SQL注入攻击的过程中,攻击者通过逻辑运算可以判断猜测是否正确。
在SQL注入的过程是一个一步一步推进的过程,几乎每一步都是利用AND和OR等逻辑运算来判断结果的。
BACKUPTO备份数据库
使用BAKCUPTO语句可以将数据库保存到本地磁盘作为副本。
除了列出的常用语句外,一些字符串处理函数,如:
CHAR(),SUBSTRING(),还有注释符的灵活使用也频繁出现在SQL注入攻击猜测的过程中。
猜测表名和字段名是注入攻击的一大难点,如果不了解站点常用的几种模版是猜对表名和字段名的,而且网站管理员对模版的小小的改动都会大幅度的增加猜测的工作量。
第四章SQL注入攻击的防范
从SQL注入的原理可以知道,防范SQL注入攻击,必须从程序方面着手。
使用程序检查用户提供的参数,通过有效地过滤可以大大降低被SQL注入的可能性。
其实防范SQL注入攻击的关键在于避免攻击者的恶意重构,所以防范的工作可以说是全部集中在了对用户输入的内容的筛选和过滤上,再细致地说就是从获取到的输入上进行删除,替换等操作。
在用户输入中,会碰到一些对数据库比较敏感的部分,比如:
单引号,注释符号,SQL语言中的保留字和函数名等,这些都是防范过程中得到“特殊关照”的对象,能够处理好这些内容就可以解决大部分的注入攻击问题。
4.1处理输入字符串中的单引号
在SQL语句中,单引号经常标志着一条语句的结束,但是单引号通常会赋予输入语句以不必要的权利,严重威胁到了站点的安全。
在SQL语句中,字符串必须要用’‘来表示。
如果某网站的数据都是以字符串的形式存储在数据库中的,那么搜索的SQL语句通常是:
Select*fromtablewhereid=’str’
把str看做用户输入的内容,那么程序给出的框架就是:
Select*fromtablewhereid=’’。
用户的输入就直接当做参数放在两个单引号之间。
如果有人想使用SQL注入攻击,就必须手动添加“’”结束站点给出的搜索语句才能实现重构。
这时,如果在Web端添加一段过滤用户输入的“’”的代码,攻击者的代码也将无法执行,或者,把所有的输入都作为一个参数来执行。
过滤“’”的方法有两种,第一是替换。
将输入里面的单引号替换成双引号,可以有效阻止恶意重构搜索语句。
例如:
攻击者通过输入,重构后的查询语句是:
“Select*fromtable1fromwherecol1=’user1’or1=1–‘”
如果把输入中的单引号替换成双引号的话,就变成了“Select*fromtable1fromwherecol1=’user1”or1=1–‘”,这样一来,注入攻击就失败了。
另外一种方法就是删除。
比如,在第二章例子1中的输入“0'or1=1”,程序过滤掉输入中的“,”,其实传递给数据的查询语句是Select*from‘0or1=1’。
因此查询的参数就变成了“0or1=1”。
这种方案的核心思想是使用替换的思想破坏被攻击者重构的SQL查询语句。
实现起来也很简单,在PHP中,只要使用str_replace()函数就能实现这个功能。
假如从用户得到的输入字符串被命名为$string。
只要对它进行如下处理:
str_replace(“’”,”””,$string);
然后再把用户的输入和页面提供的语句框架组合,交给数据库执行。
这种方案有一定的局限性,那就是:
参数必须是字符串。
而且虽然这个办法可以有效地避免SQL注入攻击,但是,这样的办法却也降低了数据库查询的灵活度。
如果数据库中有“’”作为一个有效的值的时候,就无法让数据库对“’”展开搜索了。
4.2使用转义字符代替输入栏中的符号
在PHP的配置文件中,有magic_quotes一系列属性。
这
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 技术 SQL 注入 攻击 分析 防范 论文
![提示](https://static.bdocx.com/images/bang_tan.gif)