随着当今世界网络技术与信息技术高速发展,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注入攻击是黑客对数据库进行攻击的常用手段之一。随着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应用
World Wide Web简称为Web。Web是一个由文档组成的超大规模集合,其中通过链接相互联系。这些文档是由Web服务器提供,可以通过浏览器访问。Web是一组软件和协议的集合。Web应用时一种是用Web浏览器并通过Internet或内部往来访问的程序,Web应用程序通常需要Web浏览器,Web服务器,是基于客户机/服务器的配置而运行的,既B/S结构。
WEB应用程序的三层结构分别为:
1.表示层(PresentationTier)
表示层为用户接口部分,是用户与系统之间交互信息的界面。
2.中间层(MiddleTier)
也称业务逻辑层,由WEB服务器和应用程序服务器组成。功能层是应用的主体,也是整个分层模型中最为重要的一层。
3.数据层(DataTier)
数据层是整个分层体系的最底层,它主要用来实现与数据库的交互,即完成查询、插入、删除和修改数据库中数据的功能。
2、WEB系统通信方式
大部分的Web应用都是使用HTTP协议,少部分Web应用特别使用HTPS协议。但我们是讨论Web环境下SQL注入攻击,所以只讨论HTTP协议。即超文本协议,HTTP包含两个阶段:请求阶段和响3应阶段。浏览器和Web服务器之间的每一次HTTP通信都包含两个部分:头部和主体。头部包含了与通信的有关消息,主体包含了通信的数据,当然前提是存在这样的数据。
(二)SQL语言
1、什么是SQL语言
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
2、SQL语言的应用
结构化查询语言SQL(STRUCTURED QUERY LANGUAGE)是最重要的关系数据库操作语言,并且它的影响已经超出数据库领域,得到其他领域的重视和采用,如人工智能领域的数据检索,第四代软件开发工具中嵌入SQL的语言等。
3、SQL语言的语句结构
结构化查询语言包含6个部分:
1.数据查询语言(DQL:Data Query Language):
2.数据操作语言(DML:DataManipulation Language):
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)是一种用来和数据库交互的文本语言,SQL Injection就是利用某些数据库的外部接口把用户数据插入到实际的数据库操作语言当中,从而达到入侵数据库乃至操作系统的目的。它的产生主要是由于程序对用户输入的数据没有进行细致的过滤,导致非法数据的导入查询。
本章从使用浏览器与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 * FROMproducts WHERE value > 200
SELECT * FROMproducts WHERE active = 1
字符串型:
SELECT * FROMproducts WHERE name = 'Bike'
SELECT * FROM productsWHERE published_date > '01/01/2009'
SELECT * FROM productsWHERE published_time > '01/01/2009 06:30:00'
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 * FROM users WHERE username='" + Username +"' AND password='" + Password + "'";
Result = Db.Execute(Sql);
If (Result) /* successful login */
下面的例子展示了如何使用带命名参数的Hibernate来参数化该伪代码:
String sql = "SELECT * FROM users WHERE username=:username AND"+
"password=:password";
Query lookupUser = session.createQuery(sql);
// Add parameters to SQL query
lookupUser.setString("username", username);// add username
lookupUser.setString("password", password);// add password
List rs = lookupUser.list();
2.输出编码
处理验证应用受到的输入以外,通常还需要对在应用的不同的模块或部分间传递的内容进行编码。在SQL注入语境中,将其发送给数据库的内容进行编码或“引用”是必要的操作,这样可以保证内容被正确地处理。如有必要对包含字符串中的单引号进行编码,可以使用两个单引号替换单个单引号的方法来实现编码的目的,从而有效阻止恶意用户在特定的查询中利用SQL注入,可以使用与下面类似的代码在java中实现该目的:
Sql=sql.replace(“ ‘ “, “ ‘ ‘ “);
输入验证和输出编码面临的困难是:确保将正在评估或转换的数据库解释成最终使用该输入的用户所需要的格式。避开输入验证和输出编码的常用技术是:在将输入发送给应用之前对其进行编码,之后再对其进行解码和解释以符合攻击者的目标。基于这些原因,通常最容易实现的一种方法是拒绝所有不符合规范化格式的输入。例如可以拒绝应用接收的所有HTML和URL编码的输入。如果无法拒绝包含编码格式的输入,则需要寻找解码方法或者使用其他方法来保证接收到的数据的安全。这可能包含几个会潜在重复多次的解码步骤。尽可能使用白名单输入验证并拒绝非规范格式的输入。可以使用Java中的Normalizer类将输入标准化:
normalized = Normalizer.normalize(input,Normalizer.Form.NFKC);。
1.使用存储过程。
2.使用抽象层。
3.处理敏感数据。
4.避免明显的对象名和创建数据库。
数据库是Web应用架构的一个重要组成部分,对于确保数据库安全对于防御SQL注入是至关重要的。
1.分离数据库服务器和Web页面发布服务器。
2.隔离数据库服务器:是指将网络安全中的最小化安全法则应用到数据库服务器的网络连接上,一般做法是,使用防火墙或不能联网的IP地址来阻止任何用户到数据库服务器的因特网访问。
3.为数据库服务器增加访问控制:当管理员从网络中隔离出来数据库服务器之后,需要在数据库服务器上配置可信任的IP接入和访问。以控制那些机器能够与数据库服务器通信。
4.数据库服务器本身的最小化安全:从数据库服务器上移除所有示例脚本和应用程序,即让数据库服务器除了提供数据交互的功能以外,不能提供任何其他常规的服务器功能。
5.删除或修改默认高权数据库连接账户:管理员应该与程序开发者协同工作,在能实现应用系统的脚本功能的前提下,将数据库中默认的管理账户、高权账户删除或修改。
6.严格监控或者删除数据库高权用户:管理员应该与应用程序开发者协同,以代码和服务器相结合的方式,为每个应用程序的数据库连接账户使用一个专用的低特权账户。
7.建立数据库表的安全访问机制:不要允许用户或应用程序直接访问数据库表。如果应用程序一定要使用对数据库拥有有限访问的应用程序角色,或者某应用程序需要读取数据库表,应将数据库的访问限制为只读。
8.限制存储过程的使用:对于不需的存储过程应该删除或者禁用,应该以用户创建的存储过程代替危险的存储过程。
随着互联网的快速发展,黑客队伍日益壮大,其网络攻击技术不断成熟,公安机关网络执法工作将面临严重的挑战。本文所讲的sql注入攻击为黑客常用的攻击手段,公安机关网络工作人员应当提前做好遏制网络攻击犯罪的宣传工作,并且要深层次了解sql注入攻击原理,以及熟练掌握各种防御手段。当接到被攻击者报案,予以立案后,公安机关网络执法者要立即查明案情,确定犯罪来源,运用先进的防御技术和侦察手段,遏制犯罪行为再次发生。
在众多案情中,被攻击者遭遇攻击的原因是没有提前做好sql注入攻击的预防工作,其主要原因是网络开发者没有遵循安全代码开发的要求,因此,要避免sql注入攻击,必须要提前做好预防工作。
1、过滤掉特殊字符。
2、分离数据库服务器与web服务器
3、web应用程序使用专门的数据库低权连接账户
从安全技术手段上来说,可以通过数据库防火墙实现对SQL注入攻击的防范,因为SQL注入攻击往往是通过应用程序来进攻,可以使用虚拟补丁技术实现对注入攻击的SQL特征识别,实现实时攻击阻断。如果互联网Web服务器遭到 SQL注入攻击,请遵循如下步骤:
1、关闭网站
2、检查 IIS日志,查找引起这次攻击的有漏洞的目标网页
3、联系该 Web服务器上 Web应用的开发者,检查并修改 ASP页面中存在 SQL注入攻击隐患的代码。
结语
随着信息技术的发展,信息系统广泛应用,Web编程的流行,编写Web应用的程序员越来越多。由安全问题此带来的信息也日益突出,这就需要我们不断提升自身信息安全防知识护和技能,做好预先的防范措施,这样才能减少我们在被攻击者的损失。
通过这次SQL注入攻击与防御的毕业设计。让我知道理论和实践相结合是相当重要的,我们在开发Web应用程序时应该重要考虑安全问题,为以后的不必要麻烦做好防御准备,本文从攻击者的各种攻击技术角度来讨论了SQL注入的成因、行为和攻击利用者的方式,并提出防御攻击的一般解决方案。
由于SQL注入攻击方法和手段变化多端,知识面广。本人第一次接触到安全领域的学习,能力水平有限,本论文中难以做到全面深入研究和概括,如有错误和不足之处,敬请各位批评指正,共同学习。