sql注入攻击应用现状及防御.docx
- 文档编号:10215577
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:17
- 大小:93.35KB
sql注入攻击应用现状及防御.docx
《sql注入攻击应用现状及防御.docx》由会员分享,可在线阅读,更多相关《sql注入攻击应用现状及防御.docx(17页珍藏版)》请在冰点文库上搜索。
sql注入攻击应用现状及防御
论文编码:
WZ201511
摘要
随着计算机网络的发展,Web应用程序得到极为广泛的应用,其自身的安全也面临越来越多的威胁,结构化查询语言(SQL)注入攻击也是目前Web应用程序面临的主要安全威胁之一,因此对SQL注入攻击应用现状与防御对策对于理解和加强Web应用程序的安全具有十分重要的意义。
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。
随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。
但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。
用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQLInjection,即SQL注入。
本文所论述的内容主要是对于在现存的群体结构中,对于SQL诸如攻击的应用现状的一些了解,以及对于减小SQL注入攻击所造成的危害,降低WEB系统的安全威胁的一些防御对策,对于提高web程序质量具有重要的意义。
关键词:
注入攻击应用现状防御对策网络管理
ABSTRACT
Title:
SQLinjectionattackanddefense
Withthedevelopmentofcomputernetworks,webapplicationsextremelywiderangeofapplications,itssecurityisalsofacingincreasingthreatsandStructuredQueryLanguage(SQL)injectionattacksisfacingwebapplicationsecuritythreatsSQLinjectionattackanddefenseisofgreatsignificancefortheunderstandingandenhancethesecurityofwebapplications.
SQLinjectionattacksareoneofthecommonmeansofhackerattacksonthedatabase.WiththedevelopmentoftheB/Smodeapplicationdevelopment,moreandmoreprogrammerstowriteapplicationsthatusethismodel.However,duetotheunevenlevelandexperienceoftheprogrammers,alargepartoftheprogrammerwhenwritingcode,notthelegitimacyoftheuserinputdatatojudge,tomaketheapplicationasecurityrisk.Userscansubmitadatabasequerycode,accordingtotheproceduretoreturntheresults,getsomedatahewouldliketoknow,ThisisknownasSQLInjection,namelySQLinjection.
ExpoundsthemaincontentofthisarticleisfortheexistingpopulationstructureofSQL,suchasthepresentsituationoftheapplicationofattackforsomeoftheunderstanding,aswellasreduceSQLinjectionattackscausedharm,somepreventionmeasurestoreduceWEBsystemsecuritythreat,hasthevitalsignificancetoimprovethequalityofWEBapplication.
Keywords:
Injectionattacks,Applicationstatus,Defensecountermeasure,Networkmanagement
前言
随着当今世界网络技术与信息技术高速发展,Web应用程序具有界面统一,使用简单,易于维护,扩展性好,共享度高等优先。
Web应用程序已经被应用到生活中的各个角落。
但Web应用建立在广域网上,对安全的控制能力较弱。
且开发人员的水平和经验参差不齐,相当一部分的程序员在编写代码时没有对用户的输入数据或者页面中所携带的信息进行必要的合法性判断。
攻击者利用这个机会提交一段数据库查询代码,根据程序返回的结果,就可以获得一些数据库信息。
现在通用的数据库管理系统都有一些工具和功能组件,可以直接与操作系统及网络进行连接这无疑给我们提供了很多便利。
但是当攻击者通过SQL注入攻击一个数据库系统,去危害就不只局限于存储在数据库中数据,攻击者还可以设法获得对DBMS所有的主机进行交互式访问,使其危害从数据库向操作系统、甚至整个网络蔓延。
因此,我不仅应当将SQL注入攻击看作是一个对存储在数据库上数据的威胁,而应当看作是对整个网络的威胁。
基于SQL注入攻击的应用现状存在的一些漏洞进行简单分析,同时将提出一些防御对策,以便web应用程序在使用简单,易于维护的同时,提高其安全性与可扩张性。
一、网络攻击技术
(一)网络攻击概念
网络攻击所属现代词,指的是利用网络存在的漏洞和安全缺陷对网络系统的硬件、软件及其系统中的数据进行的攻击。
(二)网络攻击趋势
1、自动化程度和攻击速度提高。
随着分布式攻击工具的出现,攻击者可以管理和协调分布在许多Internet系统上的大量已部署的攻击工具。
目前,分布式攻击工具能够更有效地发动拒绝服务攻击,扫描潜在的受害者,危害存在安全隐患的系统。
2、攻击工具越来越复杂。
攻击工具越来越普遍地被开发为可在多种操作系统平台上执行。
许多常见攻击工具使用IRC或HTTP等协议,从入侵者那里向受攻击的计算机发送数据或命令,使得人们将攻击特性与正常、合法的网络传输流区别开变得越来越困难。
3、发现安全漏洞越来越快。
4、越来越高的防火墙渗透率。
防火墙是人们用来防范入侵者的主要保护措施。
但是越来越多的攻击技术可以绕过防火墙,例如,IPP(Internet打印协议)和WebDAV(基于Web的分布式创作与翻译)都可以被攻击者利用来绕过防火墙。
5、越来越不对称的威胁。
由于攻击技术的进步,一个攻击者可以比较容易地利用分布式系统,对一个受害者发动破坏性的攻击。
随着部署自动化程度和攻击工具管理技巧的提高,威胁的将继续增加。
6、对基础设施将形成越来越大的威胁。
用户越来越多地依赖Internet完成日常业务,基础设施攻击引起人们越来越大的担心。
基础设施面临分布式拒绝服务攻击、蠕虫病毒、对Internet域名系统(DNS)的攻击和对路由器攻击或利用路由器的攻击。
(三)攻击的位置
1、远程攻击:
指外部攻击者通过各种手段,从该子网以外的地方向该子网或者该子网内的系统发动攻击。
2、本地攻击:
指本单位的内部人员,通过所在的局域网,向本单位的其他系统发动攻击,在本级上进行非法越权访问。
3、伪远程攻击:
指内部人员为了掩盖攻击者的身份,从本地获取目标的一些必要信息后,攻击过程从外部远程发起,造成外部入侵的现象。
(四)攻击者常用的攻击工具
1、DOS攻击工具:
如WinNuke通过发送OOB漏洞导致系统蓝屏;Bonk通过发送大量伪造的UDP数据包导致系统重启;TearDrop通过发送重叠的IP碎片导致系统的TCP/IP栈崩溃;WinArp通过发特别数据包在对方机器上产生大量的窗口;Land通过发送大量伪造源IP的基于SYN的TCP请求导致系统重启动;FluShot通过发送特定IP包导致系统凝固。
2、木马程式:
如BO2000(BackOrifice)、“冰河”、NetSpy、Glacier、KeyboardGhost等。
(五)攻击的层次
从浅入深的分为以下几个层次:
1、简单拒绝服务。
2、本地用户获得非授权读权限。
3、本地用户获得非授权写权限。
4、远程用户获得非授权账号信息。
5、远程用户获得特权文件的读权限。
6、远程用户获得特权文件的写权限。
7、远程用户拥有了系统管理员权限。
(六)网络攻击步骤
第一步:
隐藏自已的位置。
第二步:
寻找目标主机并分析目标主机。
第三步:
获取帐号和密码,登录主机。
第四步:
获得控制权。
第五步:
窃取网络资源和特权。
二、SQL注入攻击概述
(一)SQL注入攻击概念
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。
随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。
但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。
用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQLInjection,即SQL注入。
(二)注入简介
SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问防止SQL注入攻击没什么区别,所以市面的防火墙都不会对SQL注入发出警报,如果管理员没查看ⅡS日志的习惯,可能被入侵很长时间都不会发觉。
但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。
(二)攻击背景
在计算机技术高速发展的今天,越来越让人们头疼的是面临越来越“变态”和复杂的威胁网站技术,他们利用Internet执行各种恶意活动,如身份窃取、私密信息窃取、带宽资源占用等。
它们潜入之后,还会扩散并不断更新自己。
这些活动常常利用用户的好奇心,在用户不知道或未允许的情况下潜入用户的PC,不知不觉中,帐户里的资金就被转移了,公司讯息也被传送出去,危害十分严重。
2006年8月16日,第一个Web威胁样本出现,截止到2006年10月25日,已经产生了第150个变种,并且,还在不断地演化下去。
三、SQL注入的技术分析
本章从SQL注入攻击与web环境的环境依赖关系,介绍了数据库的基本知识和常见操作SQL数据库的SQL语言,web工作原理。
Web程序的通信方式,为理解SQL注入的生成过程提供一些背景知识。
从Web应用层的代码介绍引发SQL注入的因素以及那些开发实践和行为会引发SQL注入,从而达到SQL注入的实现。
(一)web工作原理
1、什么是Web应用
WorldWideWeb简称为Web。
Web是一个由文档组成的超大规模集合,其中通过链接相互联系。
这些文档是由Web服务器提供,可以通过浏览器访问。
Web是一组软件和协议的集合。
Web应用时一种是用Web浏览器并通过Internet或内部往来访问的程序,Web应用程序通常需要Web浏览器,Web服务器,是基于客户机/服务器的配置而运行的,既B/S结构。
其常见的web应用架如下图3-1所示:
图3-1常见Web应用架构
WEB应用程序的三层结构分别为:
1.表示层(PresentationTier)
表示层为用户接口部分,是用户与系统之间交互信息的界面。
2.中间层(MiddleTier)
也称业务逻辑层,由WEB服务器和应用程序服务器组成。
功能层是应用的主体,也是整个分层模型中最为重要的一层。
3.数据层(DataTier)
数据层是整个分层体系的最底层,它主要用来实现与数据库的交互,即完成查询、插入、删除和修改数据库中数据的功能。
2、WEB系统通信方式
大部分的Web应用都是使用HTTP协议,少部分Web应用特别使用HTPS协议。
但我们是讨论Web环境下SQL注入攻击,所以只讨论HTTP协议。
即超文本协议,HTTP包含两个阶段:
请求阶段和响3应阶段。
浏览器和Web服务器之间的每一次HTTP通信都包含两个部分:
头部和主体。
头部包含了与通信的有关消息,主体包含了通信的数据,当然前提是存在这样的数据。
(二)SQL语言
1、什么是SQL语言
结构化查询语言(StructuredQueryLanguage)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
2、SQL语言的应用
结构化查询语言SQL(STRUCTUREDQUERYLANGUAGE)是最重要的关系数据库操作语言,并且它的影响已经超出数据库领域,得到其他领域的重视和采用,如人工智能领域的数据检索,第四代软件开发工具中嵌入SQL的语言等。
3、SQL语言的语句结构
结构化查询语言包含6个部分:
1.数据查询语言(DQL:
DataQueryLanguage):
2.数据操作语言(DML:
DataManipulationLanguage):
3.事务处理语言(TPL):
4.数据控制语言(DCL):
5.数据定义语言(DDL):
6.指针控制语言(CCL):
4、SQL语言的特点
1.一体化:
SQL集数据定义DDL、数据操纵DML和数据控制DCL于一体,可以完成数据库中的全部工作。
2.使用方式灵活:
它具有两种使用方式,即可以直接以命令方式交互使用;也可以嵌入使用,嵌入到C、C++、FORTRAN、COBOL、JAVA等主语言中使用。
3.非过程化:
只提操作要求,不必描述操作步骤,也不需要导航。
使用时只需要告诉计算机"做什么",而不需要告诉它"怎么做"。
4.语言简洁,语法简单,好学好用:
在ANSI标准中,只包含了94个英文单词,核心功能只用6个动词,语法接近英语口语。
(三)SQL注入的实现
结构化查询语言(SQL)是一种用来和数据库交互的文本语言,SQLInjection就是利用某些数据库的外部接口把用户数据插入到实际的数据库操作语言当中,从而达到入侵数据库乃至操作系统的目的。
它的产生主要是由于程序对用户输入的数据没有进行细致的过滤,导致非法数据的导入查询。
本章从使用浏览器与WEB应用进行交互和一般的攻击步骤这一视角来讨论发现SQL注入问题。
1、SQL注入流程
针对SQL注入的普遍存在性,各种SQL注入攻击方法的实质是基本统一的,所以SQL注入攻击的流程有很大的相似性,其攻击者采取的一般步骤如下:
判断Web应用系统、发现注入点、扫描注入点、特殊注入点的判断、判断数据库类型、判断数据库中的表的结构、判断数据库中字段的结果、构造注入语句进行注入、寻找管理员后台地址登录,并获得Web应用系统完全管理权限。
以上是一般的攻击步骤,攻击中者一旦成功攻击还会进一步的获取最大目标。
比如、通过后台获得WebShell、获得整个服务器的文件目录、下载整个数据库内容、修改服务器注册表、利用数据库功能导入木马并远程控制服务器、创建服务器管理员权限账户。
在以下的章节中我们会围绕这个过程来展开SQL注入攻击的技术研究。
2、寻找SQL注入
SQL注入可以出现在任何从系统或用户接收的数据输入的前端应用中,我们很难访问到应用的源代码,因此需要进行黑盒测试,理解服务器的响应时需要非常细心。
寻找SQL注入漏洞存在三个关键点:
识别Web应用接收的数据输入、修改输入值以包含危险的字符串、检测服务器返回的异常。
识别SQL注入漏洞有一种简单的规则:
通过发送意外数据来触发异常。
该规则包括如下含义:
识别WEB应用上所有的数据输入、了解那种类型的请求会触发异常、检测服务器响应中的异常。
包含数据库错误或HTTP错误代码的服务器响应通常能降低识别SQL注入漏洞的难度。
但SQL盲注是一种即使应用不返回明显错误也能利用漏洞的技术。
3、确认SQL注入及SQL语句构造方式
要想确认一个SQL注入漏洞并进一步加以利用,需要构造一条注入SQL代码的请求以便应用创建一条语法正确的SQL语句,之后由数据库服务器执行该语句其不返回任何错误。
在创建正确的语句是,可以终止它并注释剩下的查询。
对于这种情况,通常可以毫无约束地连接任意SQL代码(假设后台数据接支持执行多条语句)进而提供执行攻击的能力。
想要构造有效的SQL语句,首先要理解数据库包含的不同类型,他们具有不同的表示方式,通常有数字型和字符串型。
数值型不需要使用单引号来表示,字符串要有单引号表示。
其示例如下:
数值型:
SELECT*FROMproductsWHEREvalue>200
SELECT*FROMproductsWHEREactive=1
字符串型:
SELECT*FROMproductsWHEREname='Bike'
SELECT*FROMproductsWHEREpublished_date>'01/01/2009'
SELECT*FROMproductsWHEREpublished_time>'01/01/200906:
30:
00'
四、SQL注入攻击技术防御
SQL注入攻击技术特性的核心表达式可以理解成一种通过在脚本系统与用户交互中,利用存在的漏洞而进行的攻击方式,单就SQL注入攻击来说,如果妄图从核心的角度防御这样的攻击,绝对不是简单从脚本层面来严防死守就能做到彻底的防御,必须以安全是一个整体的逻辑推断方式,从各个方面进行考虑,并力求根据最新的注入攻击技术进行分析和防范。
从存在的实际情况来看,包括Web服务器管理员、数据库服务器管理员、数据库设计员、代码程序员在内的所有工作人员都是防御体系的关键。
我们从Web应用程序的开发、部署、管理、维护多个方面进行审查,是程序SQL注入了漏洞最小化。
我们从代码层和平台层两个方面来阐述SQL注入攻击的防御。
(一)代码层防御
本节主要站在Web数据库管设计员和编写代码的角度来研究SQL注入攻击防御的。
1.使用参数化语句
前面讲过动态字符串构造是引发SQL注入漏洞的原因之一。
作为一种更加安全的动态字符串构造方法,大多数现代编程语言和数据库访问API可以使用占位符或绑定变量来向SQL查询提供参数(而非直接对用户输入进行操作),这些通常称为参数化语句内容是更安全的方法,可以使用它们来避免或解决很多在应用中经常见到的SQL注入问题,并可以在大多数常见的情形中使用它们来替代现有的动态查询。
不过,值得注意的是,参数化语句是与一种向数据库提供潜在的非安全参数(通常作为查询或存储过程调用)的方法。
虽然它们不会修改传递给数据库的内容,但如果正在调用的数据库功能在存储过程或函数中使用了动态SQL,则任然可能出现SQL注入。
下面是一段使用动态SQL的登陆页面中易受攻击的伪代码示例。
我们接下来介绍如何在java中参数化这段代码。
Username=request("username");
Password=request("password");
Sql="SELECT*FROMusersWHEREusername='"+Username+"'ANDpassword='"+Password+"'";
Result=Db.Execute(Sql);
If(Result)/*successfullogin*/
下面的例子展示了如何使用带命名参数的Hibernate来参数化该伪代码:
Stringsql="SELECT*FROMusersWHEREusername=:
usernameAND"+
"password=:
password";
QuerylookupUser=session.createQuery(sql);
//AddparameterstoSQLquery
lookupUser.setString("username",username);//addusername
lookupUser.setString("password",password);//addpassword
Listrs=lookupUser.list();
2.输出编码
处理验证应用受到的输入以外,通常还需要对在应用的不同的模块或部分间传递的内容进行编码。
在SQL注入语境中,将其发送给数据库的内容进行编码或“引用”是必要的操作,这样可以保证内容被正确地处理。
如有必要对包含字符串中的单引号进行编码,可以使用两个单引号替换单个单引号的方法来实现编码的目的,从而有效阻止恶意用户在特定的查询中利用SQL注入,可以使用与下面类似的代码在java中实现该目的:
Sql=sql.replace(“‘“,“‘‘“);
(二)规范化
输入验证和输出编码面临的困难是:
确保将正在评估或转换的数据库解释成最终使用该输入的用户所需要的格式。
避开输入验证和输出编码的常用技术是:
在将输入发送给应用之前对其进行编码,之后再对其进行解码和解释以符合攻击者的目标。
基于这些原因,通常最容易实现的一种方法是拒绝所有不符合规范化格式的输入。
例如可以拒绝应用接收的所有HTML和URL编码的输入。
如果无法拒绝包含编码格式的输入,则需要寻找解码方法或者使用其他方法来保证接收到的数据的安全。
这可能包含几个会潜在重复多次的解码步骤。
尽可能使用白名单输入验证并拒绝非规范格式的输入。
可以使用Java中的Normalizer类将输入标准化:
normalized=Normalizer.normalize(input,Normalizer.Form.NFKC);。
(三)通过设计来避免SQL注入
1.使用存储过程。
2.使用抽象层。
3.处理敏感数据。
4.避免明显的对象名和创建数据库。
(四)确保数据库安全
数据库是Web应用架构的一个重要组成部分,对于确保数据库安全对于防御SQL注入是至关重要的。
1.分离数据库服务器和Web页面发布服务器。
2.隔离数据库服务器:
是指将网络安全中的最小化安全法则应用到数据库服务器的网络连接上,一般做法是,使用防火墙或不能联网的IP地址来阻止任何用户到数据库服务器的因特网访问。
3.为数据库服务器增加访问控制:
当管理员从网络中隔离出来数据库服务器之后,需要在数据库服务器上配置可信任的IP接入和访问。
以控制那些机器能够与数据库服务器通信。
4.数据库服务器本身的最小化安全:
从数据库服务器上移除所有示例脚本和应用程序,即让数据库服务器除了提供数据交互的功能以外,不能提供任何其他常规的服务器功能。
5.删除或修改默认高权数据库连接账户:
管理员应该与程序开发者协同工作,在能实现应用系统的脚本功能的前提下,将数据库中默认的管理账户、高权账户删除或修改。
6.严格监控或者删除数据库高权用户:
管理员应该与应用程序开发者协同,以代码和服务器相结合的方式,为每个应用程序的数据库连接账户使用一个专用的低特权账户。
7.建立数据库表的安全访问机制:
不要允许用户或应用程序直接访问数据库表。
如果应用程序一定要使用对数据库拥有有限访问的应用程序角色,或者某应用程序需要读取数据库表,应将数据库的访问限制为只读。
8.限制存储过程的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- sql 注入 攻击 应用 现状 防御
![提示](https://static.bingdoc.com/images/bang_tan.gif)