SQL注入式攻击分析

2024-10-16

SQL注入式攻击分析(共7篇)

SQL注入式攻击分析 篇1

前言

随着Web应用越来越广泛, SQL注入成为对Web应用攻击的常用手段之一, 并且SQL注入攻击技术也层出不穷, 尤其是网络针对SQL注入漏洞的各种工具也推陈出新, 不断的向安全人员提出挑战, 如何降低SQL注入的风险, 从根本上实施SQL注入防御, 成了安全人员面临的首要问题。

1. SQL注入的原理

所谓SQL注入攻击就是通过构建特殊的输入, 这些输入往往是SQL语法中的一些组合, 这些输入将作为参数传入Web应用程序, 通过执行SQL语句而执行攻击者想要的操作, 它的产生主要是由于程序对用户输入的数据没有进行细致的过滤, 导致非法数据的导入查询。

2. 产生SQL注入原因

从技术上讲, SQL注入主要有代码层注入和平台层注入, 代码层是因为应用的程序员对输入的过滤不严格, 执行了非法的数据查询;平台层的注入则因为数据库平台的漏洞或数据库配置不安全等原因造成的。因此SQL注入的产生一般体现在:转义字符处理不当、类型处理不当、查询集处理不当、错误处理不当、多个提交处理不当和数据库配置不安全这几个方面。

3. SQL注入技术

对一些存在SQL注入漏洞的应用来说, 利用这些漏洞, 攻击者可以窃取用户数据, 提升权限等, 根据注入方式的不同, 注入技术主要有以下几种:

3.1 使用特殊的字符

不同的SQL数据库有很多不同的特殊变量和特殊字符, 利用一些过滤不严格或配置不安全的应用系统可以获取到一些有用的信息, 为进一步攻击提供了方向。比如使用注释、单引号、数据库的变量、存储过程等方式。

3.2 使用Union查询数据

可以使用Union连接两条或多条查询语句的结果。通过一个查询后面注入Union运算, 并添加另一个查询便可以读到用户访问过的任一张表, 得到攻击者想要的信息。

3.3 使用条件语句

该方法主要有三类:基于时间、基于错误、基于内容。这类方法主要是在正常访问后加上条件语句, 根据返回的信息判断被攻击的目标。

3.4 强制产生错误

其攻击动机是识别数据库的类型和版本等信息等。该类型的攻击其实是攻击的一个预备步骤, 用于为其他类型的攻击收集信息, 包括数据库的类型和结构。通过应用程序服务器返回的默认错误信息获得漏洞信息。

3.5 参数拆分与平衡技术

分解合法输入的操作称作拆分, 平衡则保证最终的查询中不会包含不平衡的单引号。这是一种SQL注入常用的技术。基本思想是收集合法的请求参数, 之后使用SQL关键字进行修改以保证与原数据不同, 但是当数据库解析时, 二者是等价的。

3.6 推断技术

可以识别可注入参数、提取数据或确定数据库模式。该种类型的攻击利用网站对用户的输入的返回信息, 推导数据库模式和可注入参数。该类型的攻击构造的查询执行后得到的答案有两种:真或假。基于推断的注入方法:盲注入和时间测定注入。对于盲注入方法有经典的“and l=l”和“and l=2”注入。而时间测定注入则是在注入语句中加入像“waitfor 100”这样的语句, 根据该查询结果出现的时间来判定是否能注入、注入是否成功以及推导数据值的范围。这些方法都是通过问一些相关但并非直接且能得到回应的问题, 从响应信息推出想要的信息, 进而进行攻击。

3.7 使用非主流通道技术

除了HTTP响应之外, 我们可以使用通道来获取数据。但是通道依赖于数据库支持的功能, 并不适合所有的数据库平台。SQL注入的非主流通道一般有:数据库连接、DNS、E-MAIL等, 其基本思想是先将SQL查询打包, 然后利用非主流通道将结果返回给攻击者。

3.8 避开输入过滤技术

在一般的编码或平台本身都有一些过滤手段来防范SQL注入, 针对这种情况也有很多的方法来绕过过滤。常见的实现该目标的技术有:使用大小写变种、使用SQL注释、使用URL编码、使用动态的查询、使用空字节、嵌套剥离后的表达式、利用截断等。通过这些技术, 输入经过构思的查询, 能绕过响应的过滤, 获取攻击者想要的查询结果。

3.9 利用存储过程

数据库厂商用一些标准存储过程来扩展数据库的功能并允许其与系统交互, 或者用户会自定义一些存储过程。通过其他类型攻击搜集到数据库的相关信息 (数据库类型) 后, 就可以构造执行存储过程的命令。与附带查询攻击相同, 该攻击可以实现特权扩张、拒绝服务以及执行远程命令。

4. SQL注入防范

了解了SQL注入的技术, 如何能修复SQL注入?如何进一步防范SQL注入的泛滥?本文主要从两个方面来防范SQL注入, 一是代码层的防范, 一是平台层的防范。通过一些合理的操作和配置来降低SQL注入的危险。

4.1 使用参数化语句

SQL注入的根本原因之一是将SQL查询创建成字符串然后发给数据库执行。使用参数化语句可以避免很多在应用中常见到的SQL注入问题。不过, 参数化语句是一种向数据库提供潜在的非安全参数 (通常作为查询或存储过程调用) 的方法。虽然它们不会修改传递给数据库的内容, 但是如果正在调用的数据库功能在存储过程或函数实现中使用了动态的SQL, 则也有可能出现SQL注入。

4.2 输入验证

输入验证是指测试应用接收到的输入以保证其符合应用中定义的标准过程。它可能简单到直接是一个参数类型的验证, 也可能复杂到使用正则表达式或者业务逻辑去验证输入。一般有两种不同类型的输入验证方法:白名单验证和黑名单验证。

4.3 编码输出

除了验证应用程序接收的输入外, 经常需要对程序各模块之间或者各部分之间传递的内容进行编码。在存在SQL注入的环境中, 为了保证传递给数据库的内容不会被错误处理, 则必须进行编码。不过这不是唯一需要进行编码的情形。

4.4 规范化

避开输入验证和编码输出的常用技术就是将输入发送给应用之前对其进行编码, 之后再对其进行解码和解释以符合攻击者的目标。比如单引号有很多种编码方式, 很难预测应用是否按那种方式来解释, 所有就可能绕过验证。由于这个原因, 将规范化作为输入验证方法的一部分。通常最容易的一种方法是拒绝所有不符合规范格式的输入。

4.5 通过设计来避免SQL注入危险

这种方式主要是通过提供许多较高级别的设计技术来避免或减轻SQL注入的危险。有很多独立的设计技术, 比如:使用存储过程以便在数据库层拥有较细的粒度许可技术, 使用数据访问抽象层来对整个应用施加安全的数据访问技术, 以及对敏感信息进行附加的控制等技术。

4.6 使用运行时保护

此技术主要用于检测、减轻或防止那些不需要重编译易受攻击的应用的源代码即可部署的SQL注入。主要是Web服务器和部署框架的软件或是针对Web或应用平台的用于修改和扩展特性的技术。当无法修改代码时, 这是一种有效的技术。常用防范方式是通过部署Web应用防火墙、入侵检测系统、数据库防火墙等进行保护。

4.7 确保数据库安全

使用一些额外的方式强化数据库安全。首先锁定应用数据, 采用最小权限登陆数据库, 撤销不必要的公共许可, 使用强大的加密技术来保护敏感数据并维护审查跟踪。其次锁定数据库, 对额外的系统对象锁定, 约束即席查询, 加强对验证周边严格控制, 最低权限操作系统账户并确保数据库打了最新补丁。

4.8 额外的部署

额外的部署主要包括最小化不必要的信息泄露、配置网络访问控制、独立部署Web应用服务器和数据库服务器、提高Web服务器冗余日志及使用最新漏洞扫描程序排查Web应用等。尤其是不必要的信息泄露, 是一些注入的前提, 因此这些隐藏需要隐藏错误的信息、使用空的默认Web站点、为DNS反向查询使用虚拟主机名称等措施必不可少。

5. 总结

本文总结了一些常见的SQL注入攻击的方式, 提出了一些防范SQL注入攻击的方法, 希望能对一些Web应用在防注入方面提供帮助, 但是新的注入方式层出不穷, SQL注入与防范一直会是Web应用安全方面经久不衰的话题。

参考文献

[1]游悠.SQL注入的一般方法及防御措施.中国科技信息, 2005年第18期:13.

[2]王云, 郭外萍, 陈承欢.Web项目中的SQL注入问题研究与防范方法[J].计算机工程与设计, 2010 (5) :976-978, 1016.

[3]张卓.SQL注入技术与防范措施研究.上海交通大学.上海交通大学.2007, 50-51

[4]SQL注入技术与防御 (美) Justin Clarke著2010

SQL注入式攻击分析 篇2

从实践应用角度出发,通过以下几个步骤,对ASP站点防SQL注入攻击的技术关键点进行分析。

1 概述

1.1 SQL注入原理

SQL作为一种解释型语言,在运行时是由一个运行时组件解释语言代码并执行其中包含的指令的语言。基于这种执行方式,产生了一系列叫做代码注入(code injection)的漏洞。攻击者通过程序员在Web程序开发时没有过滤掉的特殊字符、变量,精心设计SQL语句。提交数据代码给目标网站,达到破坏、窃取网站系统数据的目的。

1.2 构建注入环境

ASP作为曾经占据半壁江山的编程语言其环境构建亦十分简单,主要用到了IIS安装包,大部分XP系统不默认安装,需要单独另行安装。或者运用西部数码的建站助手,完全是傻瓜式的操作。Windows 2003系统或者Win7、Win10系统默认安装,只需要进行简单的配置即可构建ASP运行环境。

2 SQL漏洞

2.1 一个很小的漏洞

例如某系统的登录界面,如图1:

从登录界面可以轻易地知道该登录界面的SQL语句:

Select*from表名where user ID=’XX’and password=’

XX’and corporate=’’

做一个攻击漏洞假设,如果程序判断了前面2个输入框,没有对第3个输入框进行判断,那么在登录界面输入如下内容,如图2所示。

提交该数据给系统,则生成的SQL语句如下:

Select*from表名where user ID=’SQL inject’and password=’’and corporate=’’or 1=1--'

接下来分析该SQL语句,前3个单引号闭合,后面的1个单引号被“--”注释掉了,or表示或者关系,后面是永恒成立的“1=1”条件,通过逻辑分析该SQL语句永远成立,从而造成的结果就是无论前2个输入框中输入什么内容,都能成功登录系统。这就是匿名登录。

2.2 继续攻击

借助程序错误给出的异常信息,可以获取大量的有用信息。

在第3个文本框中输入:“‘or 1=(SELECT@@version)–”后,则生成的SQL语句如下:

Select*from表名where user ID=’SQL inject’and password=''or 1=(SELECT@@VERSION)--'

该SQL语句是错误的,可以经过系统执行该错误语句后,返回如下错误信息:

Conversion failed when converting the nvarchar value'Microsoft SQL Server 2000(SP4)-10.0.5500.0(X32)Sep21 2016 21:32:22 Copyright(c)1988-2000 Microsoft Corporation Developer Edition(32-bit)on Windows NT 2003<X32>'to data type int.

这就获得了服务器的操作系统和SQL Server版本信息,服务器的操作系统是Windows 2003,SQL版本是2000,安装了SP4的补丁。

2.3 继续遍历所有数据表

在第3个文本框中输入:“t'or 1=(SELECT top 1 name FROM master..sysdatabases where name not in(SELECT top 0name FROM master..sysdatabases))--”,点击登录,返回的信息如下:

Conversion failed when converting the nvarchar value'master'to data type int.

通过该错误提示,攻击者得到了数据库的名称,再一次改变上述语句中的的序号,攻击者就可以遍历所有的数据库名称。

接着,输入信息如下:“b'or 1=(SELECT top 1 name FROM master..sysobjects where xtype='U'and name not in(SE-LECT top 1 name FROM master..sysobjects where xtype='U'))--”

得到返回信息如下:

Conversion failed when converting the nvarchar value'tywktc_db'to data type int.

通过该提示,获得了第一个表,名字是:“tywktc_db”,一个改变序号,攻击者就可以得到该数据库的全部表名。

以“tywkrc_db”表为例,在第3个输入框中输入以下代码:

得到错误提示信息如下:

"Conversion failed when converting the nvarchar value'wk_name'to data type int.";

第一个字段名“wk_name”就出来了,依次改变序号,就能遍历得到所有的字段名。

2.4 最终目的

获取数据库中的数据是攻击的最终目的,当然也有一部分攻击者,以破坏、删除数据为目的。论述到这里已经知道通过SQL注入可以匿名登录、获取系统信息、遍历数据表等。SQL漏洞的危害触目惊心,如何获取数据库数据,为了防止不良影响,作者不在此阐述。

3 防攻击关键技术

3.1 控件

由以上的SQL注入攻击可以看出,所有的系统中用到的文本框、下拉框、文本区等控件的输入内容都要进行判断,基本程序完成后要再进行仔细的检查,一个都不能少,不仅仅是系统登录界面,包括系统注册界面、留言数据提交页面,尤其是验证码对应的文本输入框是漏洞高危区域。

3.2 正则表达式

经过实战总结,通过如下的正则表达式可以有效地过滤非法字符:

3.3 程序判断

对于有些特殊的数据和页面,不仅要通过控件和正则表达式判断、过滤字符的输入和提交,还要在程序中进行相应的判断。例如:判断当前用户的登录状态,核实该用户的登录信息,进一步判断当前提交数据的权限。

4 结语

SQL注入首先通过SQL代码嵌入到Web应用程序输入的参数中,然后再将这些参数与后台SQL命令进行拼接,最终在SQL数据库进行解析、执行实现攻击[2]。SQL注入漏洞仅仅是漏洞攻击的一种,随着国内各类型网站对SQL注入漏洞的防范措施不断加强,该类攻击造成危害也逐步在减少,百密一疏,安全永远不是绝对的,互联网的高速发展给人们带来便利的同时也潜伏着非常多的风险,目前国内网络安全领域人才缺口非常大。希望高校早日开设网络安全专业,为社会经济建设保驾护航。

参考文献

[1]钱丽.SQL注入攻击原理及其防范技术研究[J].哈尔滨师范大学自然科学学报,2014,30(6):65-68

SQL注入式攻击与防范 篇3

互联网技术的应用, 很大程度上改变了我们的工作和生活的方式, 我们可以随时在网上办公, 网上购物, 网上学习等, 它在提供给我们便利的同时, 也给我们带来了危机, 公司机密泄露, 银行卡里面的钱不翼而飞, 这些困扰我们的问题, 几乎每天都在发生, 网络安全成为不容忽视的问题。现以常被攻击的网站为例, 针对常见的SQL注入问题, 分析常见攻击类型, 给出解决办法。

1 SQL 注入攻击的原理

SQL注入攻击主要是针对数据库的一种攻击手段。根据具体情况, 分析并构造合理的SQL语句, 通过输入参数, 探测程序漏洞, 并利用这些漏洞, 对数据库进行破坏。凡是程序中构造SQL语句的步骤均存在风险, 如果没有对所使用的参数进行审核, 那就可能被攻击者利用, 通过修改SQL语句的构造, 达到获得权限、破坏数据的目的。一般通过正常的WWW端口访问, 而且表面看起来跟一般的Web页面访问没什么区别。这种攻击方式会绕过防火墙, 网络防护不会阻止其侵入的步伐, 不容易被发现, 只有通过查看IIS日志, 才会发现它的踪迹。

2 SQL 注入的危害

常用的数据库软件有SQL Server、Oracle、MyS QL、DB2等, 这些软件都是基于SQL语言标准的数据库软件, 由于SQL注入攻击都是通过构造SQL语句实施的破坏性行为, 所以所有上述的数据库软件都不可避免的存在被攻击的可能。而且其攻击的行为与所使用的开发语言无关, 理论上, 所有的开发语言都无法避免受攻击的可能。

SQL注入可以轻松通过普通防火墙的拦截, 因此其攻击一般都可以直接访问数据库进而可能获得数据库所在的服务器的访问权, 因此, 危害相当严重。通过对数据库的控制, 非法读取、篡改、添加、删除数据库中的数据, 修改网页上的内容, 盗取用户的各类敏感信息, 获取利益, 私自添加或删除账号达到长期控制的目的。有些网页上甚至被挂上木马, 给用户造成了很大的损失。

3 常见的攻击类型及防范

3.1 防止“错误信息提示”提供信息

SQL注入攻击主要是通过构造SQL语句实现的攻击, 错误信息的提示, 可以给攻击者提供很多有用的信息, 屏蔽错误信息提示虽然不会杜绝注入式攻击, 但是会很大程度上增大攻击的难度。 假定有这 样一个地 址 : : http ://www.xxx.com/Newsdetail.aspx?id=2 , 攻击者可以把其变为http://www.xxx.com/Newsdetail.aspx?id=2’, 服务器会返回出错信息, 如图1所示, 从里面我们可以获得很多的信息, 比如其使用的数据库是Access, 通过JET引擎连接的数据库, 数据里面有一个字段是id, 并且没有对客户端提交的数据进行合法性验证, 这为攻击者进一步攻击提供了帮助信息, 当然注入者还可以通过不同的测试来得到他们想要的信息, 上面只是其中一个例子, 所以我们要限制错误信息的输出, 从而保护我们的数据库数据, 这里我给出.NET限制错误信息的方法:

在Web.Config文件中设置

这就解决了信息泄露的弊端了。

3.2 合理使用数据库账号的权限

数据库为了保证数据的安全, 给我们提供了很多安全策略, 其中权限的设置就可以很好的防止非授权用户得到过大的权限后, 由于操作失误或账号丢失造成的严重后果。有一些SQL注入攻击中可能会包含创建、删除数据库对象的操作, 限制其使用权限, 实际上就可以达到阻止其执行的可能, 如此可以最大限度的减少注入式攻击对数据库带来的危害。

3.3 使用参数化的过滤性语句

很多初级编程者喜欢把用户输入的信息直接嵌入到SQL语句中, 如SELECT * FROM news WHERE newsid =xx, 其中xx是由URL的querystring参数指定的, 如果我们在地址栏上面输入SELECT * FROM news WHERE newsid= 1‘or‘1’=’1, 那么SQL语句就变为"SELECT * FROM newsWHERE newsid = 1 or 1=1, 我们知道1=1是恒成立的, 所以SQL语句就相当于SELECT * FROM news, 这样可以查看所有表里面的信息。如果我们依照其方法, 执行删除表操作的话, 那么就会实现表删除操作。因为有这样的漏洞, 我们要求用户的输入必须进行过滤, 并且使用参数化的语句。拒绝包含二进制数据、转义序列和注释字符的输入内容。测试用户输入内容的大小和数据类型, 强制执行适当的限制与转换, 限制用户输入的长度也可以减少注入时候贴入大量脚本的可能性, 这即有助于防止有意造成的缓冲区溢出, 对于防治注入式攻击有比较明显的效果。参数化命令是在SQL文本中使用占位符的命令。占位符表示需要动态替换的数据, 它们通过Command对象Parameters集合来传送。我们可以将问题SQL语句改写成Select* from news where newsid=@newsid, 如果参数变成11’OR‘1’=’1, 将得不到何记录, 参数化命令的语法随提供程序的不同略有差异。

3.4 使用专业工具扫描漏洞减少可注入点

攻击者经常会使用一些专业的漏洞扫描工具, 目的是找到SQL注入点。我们也可以这样做, 发现问题, 解决问题, 主动把防御动作做好, 这样就不会再给攻击者可乘之机了。

4 总结

SQL注入不但能够破坏数据库中数据, 还可能得到数据库服务器的管理权限, 一个数据库服务器上可能包括很多的数据库信息, 这又对其他的数据造成了威胁, 甚至会影响整个网络的使用安全。所以, 我们应该重视SQL注入安全问题, 把好网络安全防护的第一道门。

摘要:随着互联网的迅速壮大, web应用程序开发已经变成的一个发展的大趋势, 但是由于开发技术的不同以及开发人员的素质良莠不齐, 导致了程序的安全性频频遭到质疑, 经常会爆出网站被攻击的新闻。本文针对常见的SQL注入危害展开讨论, 介绍SQL注入的原理, 常见的SQL注入类型, 以及如何防范SQL注入, 并针对几种攻击类型, 给出解决的办法。

关键词:网站攻击,SQL注入

参考文献

[1]马小婷, 胡国平, 李舟军.SQL注入漏洞检测与防御技术研究[J].计算机安全.2010.

[2]张涛, 王行建.对SQL注入漏洞的研究与防范措施的探讨[J].计算机时代.2006.

SQL注入式攻击及相应对策 篇4

由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患和攻击漏洞。这些潜在的安全隐患一旦被黑客技术人员发现,就可能为其攻击的目标,达到破坏网站及窃取数据的目的。Web应用程序常见的安全问题就是SQL Injection漏洞,是一些不怀好意的黑客人员主要的攻击目标。

1 什么是SQL注入攻击

所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。数据处理过程如图1。

只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。如果ASP或其它动态网页编程人员没有安全意识,不进行必要的有针对性的处理,存在SQL注入的可能性就非常大。先看一个例子:

这段代码的本义是要求该页面输入正确的id和pwd,否则返回到原始的登录页面。但是这段代码有很明显的SQL注入漏洞,非常容易被攻击,在稍有SQL注入概念者面对这种身份认证代码形同虚设。

当用户正常请求该页面时按正常方式输入所需的网页参数帐号id和密码pwd(如id=0001,pwd=zyq0001),那么生成的strsql字符串为:

很明显,在这时该网页起到了身份认证的目的。但是,一些恶意的用户将会试图发现一种方法来扭曲该命令,从而导致该被扭曲命令绕过身份认证、删除数据,甚至做出更为危险的事情。如可以这样来输入id和pwd:

那么生成的strsql字符串为:

因为条件“'1'='1'”恒定成立,这样不id和密码是什么,总会得到所有记录,从页轻而易举地绕过了身份认证得到了所需的页面。

2 SQL注入攻击具体分析和相应对策

SQL注入式攻击是某些恶意用户利用对动态网页请求时所需的表单(form)参数或查询字符串(querystring)参数,来构造歪曲原始意图的SQL语句,以达到获取或破坏数据库中数据的目的。

为了有针对性的防范SQL注入攻击,需对SQL注入攻击的源头—表单参数或查询字符串参数的数据类型的不同进行具体的SQL注入攻击分析。数据处理对策如图2所示。

2.1 通过字符型动态网页参数构造攻击性的SQL语句

如前所述,当请求网页的参数为字符型并要形成SQL注入攻击效果,只需在输入字符串时在中间插入“'”(单引号),然后加入其它的SQL子句成分即可。还是以前面的SQL字符串表达式为例:

当输入的id的值为:

这时,构成SQL语句的实际上变成了一个多语句的SQL查询,查询的含义就变成了:首先返回Id为″0001″用户记录,然后删除所有记录,″--″符号在SQL查询中表示注释开头,这样其后的部分不再有效。

将这样的SQL查询提交给数据库管理系统,其危害性可想而知。但只要将其中的“'”(单引号)剔除掉,查询字符串就变成了:

其中的“'0001;delete*from usertable;--'”就成为了一个整体。即如果id字符参数没有被额外的单引号所分割,那么参数中任何一个字符即当成了要查询的id的一部分(包括其中的分号和其它的SQL命令字符),以上的威胁即可消除。所以,要防止在字符型参数中注入SQL语句,必须正确处理单引号的输入。

考虑到单引号也可能是要查询目标的条件,所以在处理单引号问题时,也不盲目简单地去掉,SQL查询中,单引号的作用是作为字符串的定界符,要想单引号作为正常字符串的一部分,应该用“''”(两个单引号)表示,所以在用字符型参数id构造SQL语句之间,可按如下方式处理id:id=replace(id,″'″,″''″)

那么重新用它构造上面的strSQL字符串,将得到:

其含义为查询“Id值为0001'';delete*from usertable--”、并且″PWD为空″的记录。其中的“''”代表该位置的一个“'”,再也没有了定界符的含义,也无法分割字符串。

这样即使其中包含有攻击性内容,但已失去了攻击能力。

2.2 通过数值型动态网页参数构造攻

击性的SQL语句

如果求要的参数是一个数值参数,那么在没有防范的情况下更容易造成注入式攻击,因在SQL查询中,如果查询条件为数值字段,则字段值不需要定界符,这就意味着,可真接在数值型参数后追加其它任何内容以组成攻击性极强SQL语句。

如下面的某动态网名为details.asp的asp代码欲通过名为id的QueryS-tring参数来得到数据表的记录:

若想得到id为10的记录,可以按URL为details.asp芽id=10来正常请求网页,则details.asp执行时,strSQL得到:

但如果URL为details.asp芽id=10or 1=1请求网页,则strSQL将得到:

这样,查询的结果将包含了所有的记录—全部内容一览无余。

可见,数值型参数比字符型参数更容易形成SQL注入式攻击。所以,可直接任意追加内容,构造各种令人意想不到的SQL攻击语句。

尽管通过数值型参数更容易形成SQL注入式攻击,但是也更容易检测并防止,只需在用参数值构造SQL语句前先检查参数值是否是数值型即可。如在asp中可用如下代码检测:

至此,可用一个统一的函数来防范上面两种类型的参数中可能包含的SQL注入式攻击,用asp代码表示为:

经测试,该函数可对付所有类似前面的常见SQL注入攻击方法的威胁。

3 减少潜在SQL注入攻击,提高系统安全保障的其它有利措施

通过以上对IIS+asp环境下SQL注入攻击产生原因的具体分析和采取的相应对策,可以最大限度地杜绝该环境下SQL注入式攻击带来的安全问题,其它的环境下也应作类似的处理。

但是,由于网络环境的复杂性,安全与漏洞、攻击与反攻击是网络安全领域永恒的话题,作为WEB开发人员,在开发系统时要随时保持安全意识,稍有懈怠,便可能给恶意用户可乘之机。不同的后台数据库、不同服务器及不同的网页,攻击的方式与效果是不一样的,为了避免其它潜在的SQL注入式攻击(如可能存在的二次SQL深度注入攻击等),除了要在代码逻辑中使用前述的对策外,还应注意和使用下面的防范措施,起到综合防治的目的。

3.1 关闭WEB服务器的错误提示信息

各种WEB服务器都具备开启/关闭由于脚本执行错误而返回的详细错误提示信息,开启该功能可以方便WEB开发人员调试应用程序,但也给了恶意用户利用该功能检测和发现SQL注入点的机会,甚至有时返回的一个错误信息正好是恶意用户所需要的信息。

3.2 严格控制对数据库执行查询的用户的数据访问权限

以SQL Server为例,不管是以SQL用户认证连接还是以Windows集成认证连接方式登录的用户,一定先要在数据库服务器中严格限制其权限,Web应用程序中所要求的权限可以开放,其它不相关的权限一律不予开放。这样,即使不幸遭恶意用户注入攻击,由于数据库用户的权限有限,从而可以尽量减小危害程度。

3.3 用存储过程及参数化查询来执行所有的查询

在查询中可添加Parameter对象给查询命令或存储过程,也可以有效防止攻击者利用单引号和连字符实施攻击。另外,使用了存储后,还可以将数据库访问权限限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。

3.4 区分网页参数集合的类型

对于网页中的参数一定要分清其类型或来源,如中表单参数还是QueryString参数,或是cookies参数,依次接不同方式获取,不要按统一方法获取,比如前面例子就有用request集合统一获取所有参数。做到分类处理以后,能够用表单传送的数据尽量不要用QueryString传送,这样做既可尽量避免通过URL暴露QueryString参数情况,从而减少通过QueryString参数途径来构造具有注入攻击目的SQL语句的机会。

3.5 限制参数的长度

限制表单或查询字符串输入的长度。若用户的登录名字最多只有10个字符,那么不要认可表单中输入的10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。

参考文献

[1]缪纶,叶茂,王冠华.SQL注入攻击及Web应用安全防范技术研究与实践[J].北京:水利技术监督,2009(1):48-50,65.

[2]游向锋.SQ L注入式攻击的分析与防范[J].北京:电脑编程技巧与维护,2009(1):83-85.

浅谈SQL注入攻击与防范 篇5

随着web应用程序的流行和普及,SQL注入攻击技术也随之出现,该种攻击技术被广为利用。根据网络统计,每年都有数万个网站遭受SQL注入式攻击,其中不乏知名网站。更有甚者,现在出现了新型的攻击方法。利用软件自动搜索web应用程序的SQL漏洞,自动生成注入脚本,进行攻击,造成web应用程序的破坏。

1 什么是“SQL注入”攻击

对于Web应用程序来说,很多都使用数据库来存储信息。SQL命令就是前端Web和后端数据库之间的接口,使得数据可以传递至Web应用程序。很多Web站点都会利用用户输入的参数动态地生成SQL查询要求,攻击者通过在URL、表单域,或者其他的输入域中输入自己的SQL命令,以此改变查询属性,骗过应用程序,从而可以对数据进行不受限的访问。

SQL注入漏洞成因在于Web应用程序对用户提交的数据未做充分检查过滤。用户提交的数据可能会在程序里被用来构造访问后台数据库的SQL指令,如果这些数据过滤不严格就有可能被插入恶意的SQL代码,从而非授权操作后台的数据库,导致从敏感信息泄露、破坏数据库内容和结构。利用SQL注入漏洞可以构成对Web服务器的直接攻击,还可能利用服务器攻击第三方浏览网站的其他用户。

2“SQL注入”攻击简单举例

我这里以大家常见的用户身份认证的简单Web应用程序为例进行讲解。假定这个应用程序提供一个登录页面,在这个界面里要求用户输入用户名和口令,然后通过HTTP请求发送用户名和口令,之后,Web应用程序检查用户传递过来的用户名和口令跟数据库中的用户名和口令是否匹配。这种情况下,我们假定数据库中存在一个名称为user_table的表,该表包括三个字段,分别为用户id(用以标识该用户)、用户名称username、用户密码userpassword。

web应用程序代码如下:

string username=reg.getParameter("userna me");

string password=reg.get Parameter("pass word");

string sql="select id from user_table where"+"username='"+stringusername+"'and”+“password='"+stringpassword+"'";

rs=stmt.execute Query(stringsql);

int id=-1;

while(rs.next())

{

Intid=rs.get Int("id");

}

开头两行代码从HTTP请求中取得用户输入,然后在下一行开始构造一个SQL查询。执行查询,然后在while()循环中得到结果,如果一个用户名和口令对匹配,就会返回正确的ID。否则,id的值仍然为-1,这意味着用户没有通过认证。表面上看,如果用户名和口令对匹配,那么该用户通过认证;否则,该用户不会通过认证——但是,事实果真如此吗?非也!读者也许已经注意到了,这里并没有对SQL命令进行设防,所以攻击者完全能够在用户名或者口令字段中注入SQL语句,从而改变SQL查询。为此,我们仔细研究一下上面的SQL查询字符串:

上述代码认为字符串username和password都是数据,不过,攻击者却可以随心所欲地输入任何字符。如果一位攻击者输入的用户名为’OR 1=1--,而口令为x,那么查询字符串将变成下面的样子:

该双划符号--告诉SQL解析器,右边的东西全部是注释,所以不必理会。这样,查询字符串相当于:

如今的SELECT语句跟以前的已经大相径庭了,因为现在只要用户名为长度为零的字符串''或1=1这两个条件中一个为真,就返回用户标识符ID——我们知道,1=1是恒为真的。所以这个语句将返回user_table中的所有ID。在此种情况下,攻击者在username字段放入的是SQL指令'OR1=1--而非数据。

3 一个防范“SQL注入”攻击简单程序

近段时间修改一个ASP程序(有SQL注入漏洞),于是利用instr函数,写出这个ASP函数,供大家参考。以下是函数片段:

Function sqlsaferequest(paraname)

Dim paravalue

Paravalue=Request(paraname)

If Is Numeric(Paravalue)=True then sqlsaferequest=paravalue

Exit Function

javascript'>alert('请求非法');

End function

使用sqlsaferequest函数替换Request。

4 小结

我们在本文中介绍了注入攻击的原理。然后通过一个简单的程序事例详细介绍了SQL注入攻击的过程,使我们对SQL注入攻击有了一个深入的认识。最后给出了一个防范SQL注入攻击的简单函数。要想有效防范SQL注入攻击,需要大家平时提高意识,多对web应用程序进行SQL攻击测试,及早发现漏洞,堵住漏洞。

摘要:本文从网络应用程序安全问题出发,详细介绍了SQL注入攻击的基本原理,给出了SQL注入攻击的一个简单举例,在此基础上写出了一个防范SQL注入攻击的实用程序,在实际应用中取得很好的效果。

关键词:网络安全,SQL注入,攻击,防范

参考文献

[1](美)克拉克著,黄晓磊,李化译.SQL注入攻击与防御[M].清华大学出版社.2010.

[2]孙建舒.SQL注入式攻击与防范.计算机与信息技术[J].2011.

部分加密防御SQL注入攻击 篇6

关键词:系统安全,SQL注入攻击,加密

引言

由于SQL注入攻击针对的是应用开发过程中的编程不严密, 因而对于绝大多数防火墙来说, 这种攻击是“合法”的。SQL注入的主要危害包括:未经授权状况下操作数据库中的数据;恶意篡改网页内容;私自添加系统帐号或者是数据库使用者帐号;网页挂木马等。

1、SQL注入攻击简介

1.1 SQL注入攻击概念

S Q L注入攻击源于英文“S Q L Injection Attack”。SQL注入攻击常见的是对这种攻击形式、特点的描述。由于SQL注入攻击利用的是SQL语法, 使得这种攻击具有广泛性。理论上说, 对于所有基于S QL语言标准的数据库软件都是有效的, 包括MS SQL Server, Oracle, DB2, Sybase, My SQL等。当然, 各种软件有自身的特点, 最终的攻击代码可能不尽相同。

1.2 SQL注入攻击的过程

S Q L注入是从正常的W W W端口访问, 所以目前市面的防火墙都不会对SQL注入发出警报, 只会在IIS日志中留下访问痕迹。一般来说, 攻击者在地址栏尝试输入参数和相应的值, 根据页面的错误提示, 获得有效的信息, 从而实现对数据库进行读取、插入、删除等操作, 或者执行系统的命令。

2、SQL攻击的防御

2.1 常见防御方案

针对SQL攻击的防御, 前人做过大量的工作, 提出的解决方案包括:封装客户端提交信息;替换或删除敏感字符/字符串;屏蔽出错信息;在服务端正式处理之前对提交数据的合法性进行检查等。

封装客户端提交信息的做法需要RDBMS的支持, 目前只有Oracle采用该技术;替换或删除敏感字符是一种不完全的解决措施, 举例来说明他的弱点, 当客户端的输入为“…sselecte selectl selecte selectc selectt…”时, 在对敏感字符串“select”替换删除以后, 剩下的字符正好是“…select…”;屏蔽出错信息的实质是在服务端处理完毕之后进行补救, 攻击已经发生, 只是阻止攻击者知道攻击的结果;数据合法性检查在确认客户端的输入合法之前, 服务端拒绝进行关键性的处理操作。新的攻击方式正在被不断发现, 只要允许服务端程序使用这些提交信息, 就总有受到攻击的可能

针对以上不足, 提出新的解决方案, 即对数据库中的数据进行部分加密, 考虑到数据的存储和运算速度, 采用加密速度快的对称加密, 在此以RC4为加密算法。

2.2 部分数据加密

SQL注入使用的是正常的SQL命令, 并且命令本身不分大小写, 只要能把这些命令屏蔽或转义, 就不能发生攻击, 因此可以采用部分加密的方式, 只加密数据的字符部分, 例如“使用dr OP删除表”中只对“d r O P”进行加密。

使用下面代码可以实现部分加密, 其中RC4 () 函数为实现RC4加密算法, 在此RC4加密过程中密钥长度选择为128位:

经过部分加密后, “使用dr OP删除表”被加密成了“使用82km删除表”, 这样即可不管敏感字符的大小写, 把其转义成其他字符。

3、结束语

由于SQL注入攻击针对的是应用开发过程中的编程不严密, 因而对于绝大多数防火墙来说, 这种攻击是“合法”的。问题的解决只有依赖于完善编程。专门针对SQL注入攻击的工具较少, 数据加密方案只是一种解决办法, 数据库中的数据在存入和取出也要做相应的加密和解密, 以上给出的代码在Windows 2000 Server+SQL Server 2000环境测试通过。

参考文献

[1]李晓吉, 张晓辉, 李祥胜.SQL Server2000管理及应用系统开发[M].北京:人民邮电出版社.2002.

[2]WILLIAM S.Crypotography and Network Security Principles and Practices (3rd Ed) [M].北京:电子工业出版社.2004.

SQL注入式攻击分析 篇7

在网络技术快速发展的今天, 网络攻击也日趋严重, 因此软件系统的安全性设计显得越来越重要, 已经称为一个不可忽视的问题。由于SQL注入式攻击的基础是SQL语法, 所以从理论上讲, 只要所用数据库管理系统是基于SQL语言的, 都有可能受到攻击, 因此在系统设计时必须认真考虑如何对SQL注入式攻击进行很好的防范, 否者系统运行时可能会出现严重的后果。

二、SQL注入式攻击原理

SQL注入式攻击 (SQL Injection Attack) 是一种基于SQL语句漏洞的攻击, 也就是说攻击者通过构造一个系统设计之外的输入, 把SQL命令插入到Web表单的输入域或页面请求的查询字符串, 欺骗服务器执行恶意的SQL命令。SQL注入式攻击具有攻击面广、结构简单、破坏性强等特点。

三、常见的SQL注入攻击方式以及防范策略

常见的SQL注入式攻击方式:

(1) 没有才去措施过滤转义字符, 如在文本框中输入"'或';1';=';1"之类的内容。

(2) 利用数据库服务器中的漏洞

(3) 攻击者利用时间延误衡量页面加载的时间, 从而决定所注入的语句是否为真

针对以上SQL注入式攻击, 常用的解决方式有:

(1) 替换单引号以及删除连字符

(2) 屏蔽系统出错信息

(3) 在正式处理数据之前对用户输入进行合法性检查, 同时限制输入数据的长度

(4) 使用存储过程代替SQL语句执行查询

四、利用LINQ技术防范SQL注入式攻击

LINQ (Language-Integrated Query, 语言集成查询) 是微软公司的一项新技术。它将查询功能直接引入到.NET Framework 3.5所支持的编程语言中, 查询操作可以通过编程语言自身来传达, 而不是以字符串嵌入到应用程序代码中。LINQ可以对任何类型的数据存储进行查询和更新, 无论是SQL Server数据库还是XML文档。在构建数据库驱动的应用程序时, LINQ能够使开发人员像管理C#中的对象那样管理相关数据, 称为“LINQ to SQL”。LINQ to SQL使得你将应用程序中的数据作为你所使用的编程语言中的本地对象, 简化相关数据管理和数据库连接的复杂性。事实上, 你可以通过LINQ显示和操作数据库的数据, 而无需你编写任何SQL语句。在运行时刻, LINQ to SQL将嵌入或“集成”到你的代码中的查询转换成SQL, 并在数据库系统上执行它们。LINQ to SQL以对象的形式将查询结果返回到应用程序中, 完全转移了你与数据库及SQL的交互形式。

在了解了LINQ的基本思想后, 我们通过一个实例来看一下如何运用LINQ to SQL防范SQL注入式攻击, 现在我们要在Gridview1网格控件中显示数据, 编写如下代码:

在使用了LINQ to SQL后, 在运行时生成并在服务器上执行的SQL语句如下所示:

通过以上语句可以看出, Where子句自动被加上了参数, 不允许将用户的输入内容执行命令, 因此, 传统的SQL注入式攻击是无法造成破坏的。不管用户将什么值作为输入提交给搜索页面, 这个查询是安全的, 它不允许用户的输入执行服务器上的命令。如果你输入了用来实施SQL注入式攻击的字符串, 结果并不会返回任何信息, 从而实现防御SQL注入式攻击的作用, 使攻击无法造成破坏。

五、总结

在进行系统开发时如果不注意安全设计, 会很容易被植入SQL注入式攻击, 但我们可以采用适当的方法修补这些语句漏洞。LINQ技术通过让系统开发人员直接与对象模型交互, 从而最大消除了来自数据库的SQL注入式攻击。

参考文献

[1]徐陋, 姚国祥.SQL注入攻击全面预防办法及其应用[J].微计算机信息, 2006, 22:10-12.

[2]陈恒涛, 张鹃, 毛新华.Web环境下的SQL注入式攻击与主动防御[J].河南科技学院学报 (自然科学版) , 2005, 12:80-83.

[3]张洪星.基于ASP.NET的SQL注入式攻击及防范解决方案[J].电脑知识与技术, 2006, (12) :76-89.

[4]张勇.Web环境下SQL注入攻击的检测与防御[J].现代电子技术, 2004, (15) :103-105.

上一篇:胆酸类成分下一篇:西部五省