版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
包头师范学院本科毕业论文包头师范学院包头师范学院本科毕业论文题目:题目:SQL注入攻击研究学号:0914490044学生姓名:何洋学院:信息科学与技术学院专业:计算机科学与技术班级:09本指导教师:史胜利二〇一三年五月摘要SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQLInjection,即SQL注入。SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以市面的防火墙都不会对SQL注入发出警报,如果管理员没查看ⅡS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。目前有近70%的攻击行为是基于WEB应用,而据CVE的2006年度统计数据显示,SQL注入攻击漏洞呈逐年上升的状态,2006年更是达到了惊人的1078个,而这些还仅限于通用应用程序的漏洞,不包括更为庞大的专业web应用程序所存在的漏洞。.关键词:SQL注入攻击;数据库;SQL语句AbstractSQLinjectionattackisoneofthecommonlyusedmeansofhackingattacksagainstthedatabase.WiththedevelopmentoftheB/Smodeapplicationdevelopment,usethismodetowritetheapplicationprogrammerisalsomoreandmore.Butbecausetheprogrammer'slevelandexperiencealsoisuneven,aconsiderablepartoftheprogrammerinwritingcode,nottojudgethelegitimacyoftheuserinputdata,maketheapplicationexistencesafehiddentrouble.Usercansubmitadatabasequerycode,onthebasisoftheresultoftheprogramtoreturntoobtaincertainhewantstoknow,thisistheSQLInjection,namely,SQLInjection.SQLinjectionfromnormalWWWportaccess,andthesurfacelookslikeagenericWebpageaccessmakesnodifference,sothemarketofthefirewallwillnotalerttoSQLinjection,iftheadministratordoesn'tseeⅡShabitoflog,invasionmaybealongtimenotfound.However,SQLinjectiontechniqueisquiteflexible,atthetimeofinjectionwillencounteralotofunexpectedsituation,constructingtheSQLstatementsforclever,therebysuccessfullyobtaindesireddata.Therearenearly70%oftheapplicationsisaweb-basedattackbehavior,andaccordingtothestatisticsshowthat2006CVESQLinjectionvulnerabilityisrisingyearbyyear,hasrisenanastonishing1078,2006,whichislimitedtogeneralapplicationvulnerabilities,notincludinglargerprofessionalexistingWEBapplicationvulnerabilities.Keywords:SQLinjectionattacks;Database;TheSQLstatementTOC\o"1-3"\h\u112471引言 587751.1课题背景 562131.2课题研究意义 531201.3国内外研究现状 5194391.4课题研究内容 788672SQL语言及SQL注入环境分析 8254402.1SQL语言简介 8323962.2SQL注入攻击网络背景 8207563SQL注入攻击的实现 10309193.3SQL注入原理 11167623.4SQL攻击流程 1238173.4.1SQL注入常用函数 15151533.5SQL注入实践 1658993.5.1ASP网页简介 16179453.5.2注入环境搭建 177813.5.3手工注入示例 18307293.5.4工具注入示例 22140734SQL注入攻击分类 26317935SQL注入攻击防御 30213495.1编程过程的防范 3047075.1.1SQL注入攻击检测/防御/跟踪模型 3271795.2数据库配置防范 35117435.2.1使用安全的账号和密码策略 3591965.2.2使用Windows身份验证模式 36223645.2.3管理扩展存储过程 36296215.3SQL注入攻击的防治 3621593结论 3917485参考文献 4026113致谢 411引言1.1课题背景在计算机技术高速发展的今天,越来越让人们头疼的是面临越来越“变态”和复杂的威胁网站技术,他们利用Internet执行各种恶意活动,如身份窃取、私密信息窃取、带宽资源占用等。它们潜入之后,还会扩散并不断更新自己。这些活动常常利用用户的好奇心,在用户不知道或未允许的情况下潜入用户的PC,不知不觉中,帐户里的资金就被转移了,公司讯息也被传送出去,危害十分严重。2006年8月16日,第一个Web威胁样本出现,截止到2006年10月25日,已经产生了第150个变种,并且,还在不断地演化下去。1.2课题研究意义SQL注入攻击存在于大多数访问了数据库且带有参数的动态网页中。SQL注入攻击相当隐秘,表面上看与正常的Web访问没有区别,不易被发现,但是SQL注入攻击潜在的发生概率相对于其他Web攻击要高很多,危害面也更广。其主要危害包括:获取系统控制权、未经授权状况下造作数据库的数据、而已篡改网页内容、私自添加系统账号或数据库使用者账号等。现在流行的数据库管理系统都有一些工具和功能组件,可以直接与操作系统及网络进行连接。当攻击者通过SQL注入攻击一个数据库系统,其危害就不只局限于存储在数据库中的数据,攻击者还可以设法获得对DBMS(数据库管理系统)所在的主机进行交互式访问,使其危害从数据库向操作系统、甚至整个网络蔓延。因此,我们不仅应当将SQL注入攻击看做是一个对存储在数据库上数据的威胁,而应当看作是对整个网络的威胁。1.3国内外研究现状国内对SQL注入攻击研究主要包括SQL注入攻击的原理和SQL注入攻击的关键技术。国内对SQL注入的检测与防范主要集中于以下几个方面:提出了各种各样的防范模型,如在客户端和服务器进行检测的SQL注入攻击检测/防御/备案模型在服务端正式处理之前对提交数据进行合法性检查。屏蔽出错信息,这样攻击者就不能从错误信息中获得关于数据库的信息。对Web服务器进行安全设置,如去掉Web服务器上默认的一些危险命令。不用字符串连接建立SQL查询,用存储过程编写代码减少攻击。对包含敏感信息的数据加密,如在数据库中对密码加密存储等。国内对于SQL注入漏洞检测的研究还很少,大多数还是停留在攻击工具的层面上,很少将注入工具用于网站安全检测。国外学者对SQL注入检测与防范研究领域一般分为两大类。(1)漏洞识别(漏洞检测):这类防范主要研究识别应用程序中能导致SQL注入攻击的漏洞的位置。(2)攻击防御:这类方法可以进一步分为编码机制和防御机制。编码机制是一个很好实践的防范方法。SQL注入攻击产生的根本原因在于没有足够的验证机制,因为从编码方面防范攻击有很好的理论基础。编码机制有四种方法:第一,对输入类型检测。如果输入类型是数字型,那么限制其为数字型,这样就可以避免很多攻击,但该类检测机制存在很大局限性。第二,对输入内容编码。因为攻击者可以使用变换后的字符作为输入,而数据库将其转换之后作为SQL符号,可以在应用程序中对这些变化后的字符进行编码,而在数据库中将其还原为正常字符。第三,正模式匹配。通常可以写一段程序用于检测输入是否有不合法字符。第四,识别输入源。防御机制包括:(1)黑盒测试法(2)静态代码检测器(3)结合静态和动态的分析方法(4)新查询开发范例(5)入侵检测系统(6)代理过滤(7)指令集随机化方法(8)动态检测方法等。1.4课题研究内容本课题介绍了SQL的背景、危害,研究了SQL注入的基本原理、注入的基本方法和SQL注入攻击的类型以及一些相关的防御措施。SQL注入的方法主要从手工注入方面进行实现,并从编程、数据库配置防范两个方面来阐述如何防御SQL注入攻击,最后对SQL的防治提出一些看法和见解。2SQL语言及SQL注入环境分析2.1SQL语言简介结构化查询语言(StructuredQueryLanguage)最早是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEMR开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言得到了广泛的应用。如今无论是像Oracle、Sybase、DB2、Informix、SQLServer这些大型的数据库管理系统,还是像VisualFoxpro、PowerBuilder这些PC上常用的数据库开发系统,都支持SQL语言作为查询语言。结构化查询语言SQL是一种介于关系代数与关系演算之间的语言,其功能包括查询、操作、定义和控制四个方面,是一个通用的功能极强的关系数据库标准语言。在SQL语言中不需要告诉SQL如何访问数据库,只要告诉SQL需要数据库做什么。2.2SQL注入攻击网络背景网站威胁的目标定位有多个维度,是个人还是公司,还是某种行业,都有其考虑,甚至国家、地区、性别、种族、宗教等也成为发动攻击的原因或动机。攻击还会采用多种形态,甚至是复合形态,比如病毒、蠕虫、特洛伊、间谍软件、僵尸、网络钓鱼电子邮件、漏洞利用、下载程序、社会工程、rootkit、黑客,结果都可以导致用户信息受到危害,或者导致用户所需的服务被拒绝和劫持。从其来源说Web威胁还可以分为内部攻击和外部攻击两类。前者主要来自信任网络,可能是用户执行了未授权访问或是无意中定制了恶意攻击;后者主要是由于网络漏洞被利用或者用户受到恶意程序制定者的专一攻击。2.3SQL注入概述SQL注入是一种将恶意的SQL代码插入或添加到应用(用户)的输入参数的攻击,攻击者探测出开发者编程过程中的漏洞,利用这些漏洞,巧妙的构造SQL语句,对数据库系统的内容进行直接检索或修改。凡是构造SQL语句的步骤均存在被潜在攻击的风险,因为SQL的多样性和构造时使用的方法均提供了丰富的编码手段。SQL注入的主要方式是将代码插入到参数中,这些参数会被置入到SQL命令中加以执行。不太直接的攻击方式是将何以代码插入到字符串中,之后再将这些字符串保存到数据库的数据表或将其当作元数据。将存储的字符串置入动态SQL命令中,恶意代码将会被执行。如果未对动态构造的SQL语句所使用的参数进行正确性审查,那么攻击者就很可能会修改后台SQL语句的构造。如果攻击者能够修改SQL语句,那么该语句将与应用的用户拥有相同的运行权限。当SQL服务器执行与操作系统交互的命令时,该进程将与执行命令的组件拥有相同的权限。3SQL注入攻击的实现SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以市面的防火墙都不会对SQL注入发出警报,如果管理员没查看ⅡS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。3.1引起SQL注入攻击的可能在应用程序中若有下列状况,则可能应用程序正暴露在SQLInjection的高风险情况下:1.在应用程序中使用字符串联结方式组合SQL指令。2.在应用程序链接数据库时使用权限过大的帐户(例如很多开发人员都喜欢用sa(自带的最高权限的系统管理员帐户)连接MicrosoftSQLServer数据库)。3.在数据库中开放了不必要但权力过大的功能(例如在MicrosoftSQLServer数据库中的xp_cmdshell延伸预存程序或是OLEAutomation预存程序等)4.太过于信任用户所输入的数据,未限制输入的字符数,以及未对用户输入的数据做潜在指令的检查。3.2SQL注入攻击可能造成的伤害1.数据表中的数据外泄,例如个人机密数据,帐户数据,密码等。2.数据结构被黑客探知,得以做进一步攻击(例如SELECT*FROMsys.tables)。3.数据库服务器被攻击,系统管理员帐户被窜改(例如ALTERLOGINsaWITHPASSWORD='xxxxxx')。4.取得系统较高权限后,有可能得以在网页加入恶意链接以及XSS。5.经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统(例如xp_cmdshell"netstopiisadmin"可停止服务器的IIS服务)。6.破坏硬盘数据,瘫痪全系统(例如xp_cmdshell"FORMATC:")。3.3SQL注入原理SQL注射能使攻击者绕过认证机制,完全控制远程服务器上的数据库。SQL是结构化查询语言的简称,它是访问数据库的事实标准。目前,大多数Web应用都使用SQL数据库来存放应用程序的数据。几乎所有的Web应用在后台都使用某种SQL数据库。跟大多数语言一样,SQL语法允许数据库命令和用户数据混杂在一起的。如果开发人员不细心的话,用户数据就有可能被解释成命令,这样的话,远程用户就不仅能向Web应用输入数据,而且还可以在数据库上执行任意命令了。 作用原理:(1)SQL命令可查询、插入、更新、删除等,命令的串接。而以分号字符为不同命令的区别。(原本的作用是用于SubQuery或作为查询、插入、更新、删除……等的条件式)(2)SQL命令对于传入的字符串参数是用单引号字符所包起来。但连续2个单引号字符,在SQL数据库中,则视为字符串中的一个单引号字符。(3)SQL命令中,可以注入注解。连续2个减号字符--后的文字为注解,或“/*”与“*/”所包起来的文字为注解。(4)因此,如果在组合SQL的命令字符串时,未针对单引号字符作取代处理的话,将导致该字符变量在填入命令字符串时,被恶意窜改原本的SQL语法的作用。3.4SQL攻击流程总体思路攻击者访问有SQL注入漏洞的网站,寻找注入点。攻击者构造注入语句,注入语句和程序中的SQL语句结合生成新的SQL语句。新的SQL语句被提交到数据库中进行处理。图3.1SQL攻击思路数据库执行了新的SQL语句,引发SQL注入攻击上面的内容只是SQL注入攻击总体思路,具体的攻击过程一般有以下几步构成:1.SQL注入漏洞的判断一般来说,SQL注入一般存在于形如:HTTP://xxx.xxx.xxx/abc.asp?id=XX等带有参数的ASP动态网页中,有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。如果ASP程序员没有安全意识,不进行必要的字符过滤,存在SQL注入的可能性就非常大。2.分析数据库服务器类型一般来说,ACCESS与SQL-SERVER是最常用的数据库服务器,尽管它们都支持T-SQL标准,但还有不同之处,而且不同的数据库有不同的攻击方法,必须要区别对待。3.可执行情况若当前连接数据的帐号具有SA权限,且master.dbo.xp_cmdshell扩展存储过程(调用此存储过程可以直接使用操作系统的shell)能够正确执行,则整个计算机可以通过以下几种方法完全控制:(1)HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb...er>0abc.asp执行异常但可以得到当前连接数据库的用户名(若显示dbo则代表SA)。(2)HTTP://xxx.xxx.xxx/abc.asp?p=YY...me()>0abc.asp执行异常但可以得到当前连接的数据库名。(3)HTTP://xxx.xxx.xxx/abc.asp?p=YY;execmaster..xp_cmdshell“netuseraaabbb/add”--(master是SQL-SERVER的主数据库;名中的分号表示SQL-SERVER执行完分号前的语句名,继续执行其后面的语句;“—”号是注解,表示其后面的所有内容仅为注释,系统并不执行)可以直接增加操作系统帐户aaa,密码为bbb。(4)HTTP://xxx.xxx.xxx/abc.asp?p=YY;execmaster..xp_cmdshell“netlocalgroupadministratorsaaa/add”--把刚刚增加的帐户aaa加到administrators组中。(5)HTTP://xxx.xxx.xxx/abc.asp?p=YY;backuupdatabase数据库名todisk='c:\inetpub\wwwroot\save.db'则把得到的数据内容全部备份到WEB目录下,再用HTTP把此文件下载(当然首选要知道WEB虚拟目录)。(6)通过复制CMD创建UNICODE漏洞4.发现WEB虚拟目录只有找到WEB虚拟目录,才能确定放置ASP木马的位置,进而得到USER权限。有两种方法比较有效。一是根据经验猜解,一般来说,WEB虚拟目录是:c:\inetpub\wwwroot;D:\inetpub\wwwroot;E:\inetpub\wwwroot等,而可执行虚拟目录是:c:\inetpub\scripts;D:\inetpub\scripts;E:\inetpub\scripts等。二是遍历系统的目录结构,分析结果并发现WEB虚拟目录。5.上传ASP木马所谓ASP木马,就是一段有特殊功能的ASP代码,并放入WEB虚拟目录的Scripts下,远程客户通过IE就可执行它,进而得到系统的USER权限,实现对系统的初步控制。上传ASP木马一般有两种比较有效的方法。6.得到系统的管理员权限ASP木马只有USER权限,要想获取对系统的完全控制,还要有系统的管理员权限。提升权限的方法有很多种:(1)上传木马,修改开机自动运行的.ini文件;(2)复制CMD.exe到scripts,人为制造UNICODE漏洞;(3)下载SAM文件,破解并获取OS的所有用户名密码;(4)利用xp_regread扩展存储过程修改注册表;(5)利用其他存储过程去改变服务器;等等,视系统的具体情况而定,可以采取不同的方法。上述攻击过程如图3.2所示:图3.2SQL注入攻击过程3.4.1SQL注入常用函数Access:asc(字符)SQLServer:unicode(字符)作用:返回某字符的ASCII码Access:chr(数字)SQLServer:nchar(数字)作用:与asc相反,根据ASCII码返回字符Access:mid(字符串,N,L)SQLServer:substring(字符串,N,L)作用:返回字符串从N个字符起长度为L的子字符串,即N到N+L之间的字符串Access:abc(数字)SQLServer:abc(数字)作用:返回数字的绝对值(在猜解汉字的时候会用到)Access:AbetweenBAndCSQLServer:AbetweenBAndC作用:判断A是否界于B与C之间3。3.5SQL注入实践通过制作一个网站来实践SQL注入3.5.1ASP网页简介ASP是一种服务器端脚本编写环境,可以用来创建和运行动态网页或Web应用程序。ASP网页可以包含HTML标记、普通文本、脚本命令以及COM组件等。利用ASP可以向网页中添加交互式内容(如在线表单),也可以创建使用HTML网页作为用户界面的web应用程序。如果发现URL地址中含有asp结尾的文件的话,如/article.asp?Id=12。那这个网站就是一个ASP构建的网站。Windows操作系统上提供的IIS服务器就是构建ASP环境的最好服务器,安装好IIS后,就要安装后台数据库与服务器进行数据交互。在ASP环境下最常见的组合是ASP+ACCESS和ASP+SQLServer,在本文中测试环境为ASP+SQLServer。ASP.NET网页可以为网站创建动态内容,通过使用静态HTML页(.htm或.html文件),服务器读取文件并将该文件原样发送到浏览器,以此来满足Web请求。相比之下,当用户请求ASP.NET网页(.aspx文件)时,该网页则作为程序在Web服务器上运行。该页运行时,可以执行网站要求的任何任务,包括计算值、读写数据库信息或者调用其他程序。该页动态地生成标记(HTML或另一种标记语言中的元素),并将该标记作为动态输出发送到浏览器。3.5.2注入环境搭建首先测试中运用的环境是SQLServer2005、VS2005及IIS,然后列举数据库中的表,最后用截图的方式详细解析注入的过程。整个过程的大概流程是:1.首先安装IIS,SQLServer以及VS;2.将ASP网页与数据库连接;3.根据SQL注入原理判断能否进行SQL注入;4.判断数据库类型及注入方法;5.具体事例进行注入演示。上面第一步IIS安装完成之后,需要测试一下IIS服务器是否成功。测试的方法只要打开浏览器,在地址栏中输入“http://localhost”或者“http://”,就可以知道结果。管理员信息表如图3.3所示:图3.3管理员信息表Guest表里包含三个字段:name,psw,email,如图3.4所示:图3.4用户信息表3.5.3手工注入示例手工注入流程如下图(图3.5)所示:图3.5手工注入流程测试时使用盲注入方法:注入网址:http://localhost:1132/Website1/default.asxp?guest=1图3.6正常显示网页判断是否可以注入,测试语句:http://localhost:1132/Website1/default.asxp?Guest=1and1=1恒真,返回页面正常,如图3.7图3.7加句1=1的页面http://localhost:1132/Website1/default.asxp?Guest=1and1=2恒假,返回错误页面,如图3.8图3.8加语句1=2的显示页面猜解用户名及密码构造SQL注入语句,猜解管理员名及密码。猜测表名:http://localhost:1132/Website1/default.asxp?guest=1and(selectcount(*)fromadmin)>0如图3.9图3.8猜解表名当输入注入语句偶页面返回正常,说明存在admin表运行:http://localhost:1132/Website1/default.asxp?guest=1and(selectcount(*)fromadminwhereleft(name,1)=a)=1猜解管理员名,如图3.10。图3.10猜解管理员名当输入注入语句后,页面正常返回,表示管理员名第一个字母是a,以此类推可以猜测出管理员名称和密码。3.5.4工具注入示例工具注入主要有以下几个步骤:填写网址、选取数据库类型、获取数据库的基本信息、获取表名、获取字段值。其中选取数据库类型不是必选的步骤,只不过如果用户知道目标网站的数据库类型的话,将会加快SQL注入攻击的试探实践,提高攻击效率,增加SQL注入攻击的成功率。工具注入流程如图(图3.11)所示:图3.11工具注入流程在HDSI3.0注射地址中输入URL地址,开始扫描如图3.12所示:图3.12开始扫描下面进一步猜解表名:如图3.13图3.13猜解表名对guest进行猜解:如图3.14图3.14guest表的猜解从以上截图可以看到name,psw,都在。再进行进一步的解析,如图3.15:图3.15用户名及密码显示如上图所示,用工具注入可以很简单的猜解出用户名与密码达到与手工注入同样的目的,而且更体现了工具注入的有点:速度快、操作简单、傻瓜化等。4SQL注入攻击分类1.没有正确过滤转义字符在用户的输入没有为转义字符过滤时,就会发生这种形式的注入式攻击,它会被传递给一个SQL语句。这样就会导致应用程序的终端用户对数据库上的语句实施操纵。例如,下面的这行代码就会演示这种漏洞:statement:="SELECT*FROMusersWHEREname=‘"+userName+"';"这种代码的设计目的是将一个特定的用户从其用户表中取出,但是,如果用户名被一个恶意的用户用一种特定的方式伪造,这个语句所执行的操作可能就不仅仅是代码的作者所期望的那样了。例如,将用户名变量(即username)设置为:a‘or’t‘=’t,此时原始语句发生了变化:SELECT*FROMusersWHEREname=‘a’OR‘t’=‘t’;如果这种代码被用于一个认证过程,那么这个例子就能够强迫选择一个合法的用户名,因为赋值‘t’=‘t’永远是正确的。在一些SQL服务器上,如在SQLServer中,任何一个SQL命令都可以通过这种方法被注入,包括执行多个语句。下面语句中的username的值将会导致删除“users”表,又可以从“data”表中选择所有的数据(实际上就是透露了每一个用户的信息)。a‘;DROPTABLEusers;SELECT*FROMdataWHEREnameLIKE'%这就将最终的SQL语句变成下面这个样子:SELECT*FROMusersWHEREname=‘a';DROPTABLEusers;SELECT*FROMDATAWHEREnameLIKE‘%';其它的SQL执行不会将执行同样查询中的多个命令作为一项安全措施。这会防止攻击者注入完全独立的查询,不过却不会阻止攻击者修改查询。2.Incorrecttypehandling(类型不正确的处理)如果一个用户提供的字段并非一个强类型,或者没有实施类型强制,就会发生这种形式的攻击。当在一个SQL语句中使用一个数字字段时,如果程序员没有检查用户输入的合法性(是否为数字型)就会发生这种攻击。例如:statement:="SELECT*FROMdataWHEREid="+a_variable+";"从这个语句可以看出,程序员希望a_variable是一个与“id”字段有关的数字。不过,如果终端用户选择一个字符串,就绕过了对转义字符的需要。例如,将a_variable设置为:1;DROPTABLEusers,它会将“users”表从数据库中删除,SQL语句变成:SELECT*FROMDATAWHEREid=1;DROPTABLEusers;3.数据库服务器中的漏洞有时,数据库服务器软件中也存在着漏洞,如MYSQL服务器中mysql_real_escape_string()函数漏洞。这种漏洞允许一个攻击者根据错误的统一字符编码执行一次成功的SQL注入式攻击。4.盲目SQL注入式攻击当一个Web应用程序易于遭受攻击而其结果对攻击者却不见时,就会发生所谓的盲目SQL注入式攻击。有漏洞的网页可能并不会显示数据,而是根据注入到合法语句中的逻辑语句的结果显示不同的内容。这种攻击相当耗时,因为必须为每一个获得的字节而精心构造一个新的语句。但是一旦漏洞的位置和目标信息的位置被确立以后,一种称为Absinthe的工具就可以使这种攻击自动化。5.条件响应注意,有一种SQL注入迫使数据库在一个普通的应用程序屏幕上计算一个逻辑语句的值:SELECTbooktitleFROMbooklistWHEREbookId=‘OOk14cd'AND1=1这会导致一个标准的面面,而语句SELECTbooktitleFROMbooklistWHEREbookId=‘OOk14cd'AND1=2在页面易于受到SQL注入式攻击时,它有可能给出一个不同的结果。如此这般的一次注入将会证明盲目的SQL注入是可能的,它会使攻击者根据另外一个表中的某字段内容设计可以评判真伪的语句。6.条件性差错如果WHERE语句为真,这种类型的盲目SQL注入会迫使数据库评判一个引起错误的语句,从而导致一个SQL错误。例如:SELECT1/0FROMusersWHEREusername=‘Ralph'。显然,如果用户Ralph存在的话,被零除将导致错误。时间延误时间延误是一种盲目的SQL注入,根据所注入的逻辑,它可以导致SQL引擎执行一个长队列或者是一个时间延误语句。攻击者可以衡量页面加载的时间,从而决定所注入的语句是否为真。以上仅是对SQL攻击的粗略分类。但从技术上讲,如今的SQL注入攻击者们在如何找出有漏洞的网站方面更加聪明,也更加全面了。出现了一些新型的SQL攻击手段。黑客们可以使用各种工具来加速漏洞的利用过程。例如theAsproxTrojan这种木马,它主要通过一个发布邮件的僵尸网络来传播,其整个工作过程可以这样描述:首先,通过受到控制的主机发送的垃圾邮件将此木马安装到电脑上,然后,受到此木马感染的电脑会下载一段二进制代码,在其启动时,它会使用搜索引擎搜索用微软的ASP技术建立表单的、有漏洞的网站。搜索的结果就成为SQL注入攻击的靶子清单。接着,这个木马会向这些站点发动SQL注入式攻击,使有些网站受到控制、破坏。访问这些受到控制和破坏的网站的用户将会受到欺骗,从另外一个站点下载一段恶意的JavaScript代码。最后,这段代码将用户指引到第三个站点,这里有更多的恶意软件,如窃取口令的木马。5SQL注入攻击防御对于一般性用户误操作和低等级恶意攻击,客户端的检查将自动做出反应;考虑到客户端检查有可能被有经验的攻击者绕开,特在服务器端设定二级检查。在文中还提出了对高等级恶意攻击的自动备案技术,并给出了相应代码。互联网上的安全问题越来越严重,入侵检测(IDS)也因而显得尤为必要。MSSQLServer作为数据库市场的主要产品之一,研究针对他的SQL攻击处理方案,建立一个通用的SQL注入攻击防御、检测、备案模型,对于加强安全建设具有积极的意义。5.1编程过程的防范编码过程的防范就是在编写的程序中堵住漏洞,加强安全防范。编程防范原则是少特权、多检验。针对SQL攻击的防御,前人做过大量的工作,提出的解决方案包括:(1)封装客户端提交信息。(2)替换或删除敏感字符/字符串。(3)屏蔽出错信息。(4)在服务端正式处理之前对提交数据的合法性进行检查等。方案(1)的做法需要RDBMS的支持,目前只有Oracle采用该技术;方案(2)是一种不完全的解决措施,举例来说明他的弱点,当客户端的输入为“…ccmdmcmdd…”时,在对敏感字符串“cmd”替换删除以后,剩下的字符正好是“…cmd…”;方案(3)的实质是在服务端处理完毕之后进行补救,攻击已经发生,只是阻止攻击者知道攻击的结果;方案(4)被多数的研究者认为是最根本的解决手段,在确认客户端的输入合法之前,服务端拒绝进行关键性的处理操作。方案(4)与(2)的区别在于,方案(4)一旦检测到敏感字符/字符串,针对数据库的操作即行中止,而方案(2)是对有问题的客户端输入做出补救,不中止程序后续操作。方案(2)虽然在一定程度上有效,但有“治标不治本”的嫌疑,新的攻击方式正在被不断发现,只要允许服务端程序使用这些提交信息,就总有受到攻击的可能。因此,本文中针对SQL注入攻击的检测/防御/备案模型即基于提交信息的合法性检查,在客户端和服务端进行两级检查,只要任一级检查没有通过,提交的信息就不会进入query语句,不会构成攻击。在客户端和服务端进行合法性检查的函数基本相同。客户端检查的主要作用是减少网络流量,降低服务器负荷,将一般误操作、低等级攻击与高等级攻击行为区分开来。技术上,客户端的检查是有可能被有经验的攻击者绕开的,在这种情形下,提交的数据被直接发往服务端,通过在服务器端设定二级检查就显得十分必要。由于正常提交到服务端的数据已经在客户端检查过,因此,服务端检查到的提交异常基本可以认定为恶意攻击行为所致,中止提交信息的处理,进行攻击备案,并对客户端给出出错/警告提示。对应模型简图如图所示。图4.1检测/防御/跟踪模型5.1.1SQL注入攻击检测/防御/跟踪模型对提交信息的检查,主要包括数据类型检查、数据长度检查和敏感字符过滤。前两项可利用函数直接办到,敏感字符过滤则需要应用开发方做相应开发。经过总结,对语句时必须用到的,因此可以针对这些敏感字符,设定过滤函数,在把这些上传的参数结合到查询语句之前对他们进行过滤。下面的2个函数即过滤模块的主要代码:因此我们先要了解SQL注入攻击敏感的字符/关键词:"exec","xp-","sp-","declare","Union","cmd","+","//","..",":","'","——","%","0x",而他们又不是在一般构造query。下面的2个函数即过滤模块的主要代码:例1:FunctionMyfilter(str)DimstrFilter,arrFilter,blnFlag,istrFilter="exec,xp-,sp-,declare,cmd,Union,//,..,0x,',——,:"blnFlag=FlasearrFilter=Split(strFilter,".")Fori=0ToUBound(arrFilter)IfInstr(UCase(str),Ucase(arrFilter(i)))>0ThenblnFlag=TureExitForEndIfNextMyfilter=blnFlagEndfunction例2:Functioncheck()DimUname,UPwdUname=Trim(document,Thisform,Username,value)UPwd=Trim(document,Thisform,UserPwd,value)IfMyfilter(Uname)orMyfilter(UPwd)thenAlert("提交的用户名或密码中含有非法字符!")ExitfunctionelseDocument,Thisform,submitendifendfunction提交非法字符的人,都有可能是SQL注入攻击者。但考虑到用户在正常使用中的误操作也有提交非法字符/字符串的可能,因此客户端的一级检查无论对用户误操作,还是一般性攻击,所做出处理措施只是中止信息提交,给出友好的出错提示。在经过一级检查以后提交到服务器端的信息中仍然包括非法字符/字符串的,惟一的可能是攻击者绕开了客户端的一级检查。对于这种危险的信号,服务器端将从收到的提交信息数据包中提取攻击源的IP地址,存入数据库备查,同时中止针对数据库的操作.客户端给出出错或警告提示。代码如下:<%DimUsername,UserPwdUsername=Trim(Request("UserPwd"))IfMyfilter(Username)orMyfilter(UserPwd)thenDimuserip,userip1,userip2Dimconn,rs,query,strAdd,strUpdateUserip1=Request,ServerVariables("HTTP_X_FORWARDED_FOR")Userip2=Request,ServerVariables("REMOTE_ADDR")Ifuserip1=""thenUserip=userip2ElseUserip=userip1EndifQuery="Select*fromIP_Attackwhereip='''&userip"'"strAdd="InsertintoIP_Attack(IP,FirstAttack,LastAttack)Values('"&userip&"','"&now()&"')"Setconn=Server,CreateObject("Adodb.Connection")Set=Server.CreateObject("Adodb,Recordset")Conn,open"dsn=myDSN"Rs,openquery,Conn,1,2adCmdTableIfRS,RecordCount<=0thenConn,executestrAddElsestrUpdate="UpdateIP_AttcakSetTimes='"&RS,Fields("Times")+1&"',LastAttcak='"&now()&"'whereip='"&userip&"'"Conn,executestrUpdateEndifRe,closeConn.closeSetrs=nothingSetconn=nothingResponse,Redirect"Err.asp"Else……Endif%>由于SQL注入攻击针对的是应用开发过程中的编程不严密,因而对于绝大多数防火墙来说,这种攻击是“合法”的。问题的解决只有依赖于完善编程。专门针对SQL注入攻击的工具较少,Wpoison对于用asp,php进行的开发有一定帮助。本文中的DDL模型作为一个整体解决方案,对代码稍加变动也可用于SQLServer以外的关系数据库。5.2数据库配置防范数据库管理系统常常提供一些安全方面的配置项,如果将这些配置项配置准确,可以大幅度调高防御攻击的能力,下面就以SQLServer为例,看看如何进行安全配置。5.2.1使用安全的账号和密码策略SQLServer具有一个超级用户账号,其用户名称是:SA,该用户名不能被修改也不能被删除,所以,我们必须对这个账号进行最强的保护。不在数据库应用中直接使用SA账号,新建一个(而且只建一个)与SA一样权限的超级用户来管理数据库,其他用户根据实际需要分配仅仅能够满足应用要求的权限,不要给与多余的权限,所有用户(特别是超级用户)都要使用复杂的密码,同事养成定期修改密码的好习惯。5.2.2使用Windows身份验证模式SQLServer的认证模式有Windows身份认证和混合身份认证两种。应该使用Windows身份验证模式,因为它通过限制对MicrosoftWindows用户和域用户账户的连接,保护SQLServer免受大部分Internet的工具的侵害,而且,服务器也可以从Windows安全增强机制中获益。在客户端Windows身份验证模式不需要存储密码,存储密码是使用标准SQLServer登录的应用程序的主要漏洞之一。5.2.3管理扩展存储过程存储过程是SQLServer提供给用户的扩展功能,提示很多存储过程在多数应用中根本用不到,而有些系统的存储过程很用以被黑客用来攻击或破坏系统,所以需要删除不必要的存储过程,比如:xp_cmdshell存储过程就需要禁用,因为xp_cmdshell存储过程可以让系统管理员以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出,是一个功能非常强大的扩展存储过程,一般的黑客攻击SQLServer时,首先采用的方法是执行master扩展存储过程xp_cmdshell命令来破坏数据库。一般情况下,xp_cmdshell对管理员来说也不是必须的,xp_cmdshell的禁用不会对SQLServer造成任何影响。为了数据库安全起见,最好禁用xp_cmdshell。5.3SQL注入攻击的防治既然SQL注入式攻击的危害这么大,那么该如何来防治呢?下面这些建议或许对我们以后防治SQL注入式攻击有一定的帮助。普通用户与系统管理员用户的权限要有严格的区分。
如果一个普通用户在使用查询语句中嵌入另一个DropTable语句,那么是否允许执行呢?由于Drop语句关系到数据库的基本对象,故要操作这个语句用户必须有相关的权限。在权限设计中,对于终端用户,即应用软件的使用者,没有必要给他们数据库对象的建立、删除等权限。那么即使在他们使用SQL语句中带有嵌入式的恶意代码,由于其用户权限的限制,这些代码也将无法被执行。故应用程序在设计的时候,最好把系统管理员的用户与普通用户区分开来。如此可以最大限度的减少注入式攻击对数据库带来的危害。
2、强迫使用参数化语句。
如果在编写SQL语句的时候,用户输入的变量不是直接嵌入到SQL语句。而是通过参数来传递这个变量的话,那么就可以有效的防治SQL注入式攻击。也就是说,用户的输入绝对不能够直接被嵌入到SQL语句中。与此相反,用户的输入的内容必须进行过滤,或者使用参数化的语句来传递用户输入的变量。参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。采用这种措施,可以杜绝大部分的SQL注入式攻击。不过可惜的是,现在支持参数化语句的数据库引擎并不多。不过数据库工程师在开发产品的时候要尽量采用参数化语句。
3、加强对用户输入的验证。
总体来说,防治SQL注入式攻击可以采用两种方法,一是加强对用户输入内容的检查与验证;二是强迫使用参数化语句来传递用户输入的内容。在SQLServer数据库中,有比较多的用户输入内容验证工具,可以帮助管理员来对付SQL注入式攻击。测试字符串变量的内容,只接受所需的值。拒绝包含二进制数据、转义序列和注释字符的输入内容。这有助于防止脚本注入,防止某些缓冲区溢出攻击。测试用户输入内容的大小和数据类型,强制执行适当的限制与转换。这即有助于防止有意造成的缓冲区溢出,对于防治注入式攻击有比较明显的效果。
如可以使用存储过程来验证用户的输入。利用存储过程可以实现对用户输入变量的过滤,如拒绝一些特殊的符号。如以上那个恶意代码中,只要存储过程把那个分号过滤掉,那么这个恶意代码也就没有用武之地了。在执行SQL语句之前,可以通过数据库的存储过程,来拒绝接纳一些特殊的符号。在不影响数据库应用的前提下,应该让数据库拒绝包含以下字符的输入。如分号分隔符,它是SQL注入式攻击的主要帮凶。如注释分隔符。注释只有在数据设计的时候用的到。一般用户的查询语句中没有必要注释的内容,故可以直接把他拒绝掉,通常情况下这么做不会发生意外损失。把以上这些特殊符号拒绝掉,那么即使在SQL语句中嵌入了恶意代码,他们也将毫无作为。
故始终通过测试类型、长度、格式和范围来验证用户输入,过滤用户输入的内容。这是防止SQL注入式攻击的常见并且行之有效的措施。
4、多多使用SQLServer数据库自带的安全参数。
为了减少注入式攻击对于SQLServer数据库的不良影响,在SQLServer数据库专门设计了相对安全的SQL参数。在数据库设计过程中,工程师要尽量采用这些参数来杜绝恶意的SQL注入式攻击。
如在SQLServer数据库中提供了Parameters集合。这个集合提供了类型检查和长度验证的功能。如果管理员采用了Parameters这个集合的话,则用户输入的内容将被视为字符值而不是可执行代
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全国信息安全培训课件
- 全员安全隐患排查培训课件
- 人工智能软件教程
- 人工智能与机器人融合
- 企业职业规划文案模板
- 低价引流策略话术
- 光纤熔接技能培训课件
- 北京数学教师面试讲稿
- 农业公司考试题目及答案
- 联通转聘考试题及答案
- 招聘及面试技巧培训
- 贵州兴义电力发展有限公司2026年校园招聘考试题库附答案
- 2025年水果连锁门店代理合同协议
- 朱棣课件教学课件
- 农业推广计划课件
- 苏教版四年级数学上册期末考试卷(附答案)
- 2025云南省人民检察院招聘22人笔试考试备考试题及答案解析
- 民用建筑玻璃幕墙玻璃幕墙施工方案
- 交城县惠丰生物科技有限公司年产10000吨N,N-二甲基苯胺项目环境影响报告书
- 夏目漱石:梦十夜【中日对照】
- 南昌工程学院水电站课程设计
评论
0/150
提交评论