摘 要:摘要:SQL 注入一直是Web应用最大的安全威胁之一,本文介绍了SQL 注入的概念原理及各种常见的SQL 注入技术,分析了其注入的原理,根据其SQL 注入攻击的特点和实现过程,总结了一些常见的SQL 注入技术与防范的方法。
关键词:关键词:SQL 注入; 攻击 ;数据库
中图分类号:TP393.08 文献标识码:A 文章编号:
前言
随着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应用安全方面经久不衰的话题。
参考文献:
SQL注入技术与防御 (美)Justin Clarke 著 2010