0 引 言
ASP. NET 是微软公司的一项 Web 应用开发技术,因其具有跨平台性、易于部署、简单易学等诸多优点,被广泛应用在 Web 开发中。目前的 ASP. NET应用程序主要以数据处理为中心,应用的数据访问技术以 ADO. NET 为主。但是使用 ADO. NET 进行数据访问时需要编写大量包含参数的 SQL 语句,恶意用户有可能利用这些参数通过注入攻击的方式破坏数据库的安全性。这种利用 SQL 注入漏洞进行攻击的方法也成为 Web 应用程序最为严重的安全风险之一,如何最大程度降低注入风险,从根本上防范注入攻击,成为开发人员亟待解决的问题。本文首先分析 SQL 注入攻击原理和流程,然后针对 ASP.NET 应用程序的数据访问技术,提出一种三层注入防范模型。
1 SQL 注入攻击概述
SQL 注入攻击指的是恶意用户将特定的 SQL 命令插入到表单输入框或页面请求的查询字符串中,猜测可能形成符合语法的 SQL 语句,从而达到欺骗服务器执行特定 SQL 命令并破坏数据库安全性的目的。
1. 1 SQL 注入流程
在 ASP. NET 应用程序开发过程中经常使用 Ac-cess 或 SQLServer 管理数据库,因为这 2 种数据库管理系统中系统变量和系统表有所不同,所以进行 SQL注入攻击时会首先判断应用程序访问数据库的种类。
可以将 SQL 注入攻击的基本流程分为3 个环节:
( 1) 检测应用是否存在 SQL 注入点。可以在输入参数值中添加“‘”,然后根据浏览器返回信息进行判断;
( 2) 判断数据库管理系统类型。若存在 SQL 注入点,可以利用 2 种数据库管理系统中系统变量和系统表的区别判断具体类型;
( 3) 进行攻击。判断出数据库管理系统类型后,获取操作权限并破坏数据库安全性和完整性。
1. 2 注入攻击常见方式
SQL 注入攻击的根本途径是通过用户不断地恶意输入完成的,而在 ASP. NET 应用程序运行过程中能够接收用户输入的方法主要有 3 种: ( 1) 表单输入元素获取输入值; ( 2) URL 参数重写; ( 3) 修改Cookies 文件内容。
针对 SQLServer 数据库管理系统而言,攻击者可以采用的具体攻击方式如表 1 所示。
2 防范模型
通过分析可知,ASP. NET 应用程序中存在的SQL 注入攻击主要是利用带有特征输入字符串和无明显特征的攻击字符串进行的。为了更好保护数据库安全性,降低 SQL 注入攻击风险,本文提出从 3 个层次构建注入攻击防范模型。
2. 1 三层防范模型
三层防范模型中的第一层主要过滤带有明显特征的输入字符串,通过过滤函数的应用拒绝已知的恶意用户输入; 第二层对用户输入进行参数化,通过使用绑定变量方式解决和避免一般的 SQL 注入问题;第三层是结合实际应用拒绝无明显特征的攻击字符串,通过对 SQL 语句中的关键词进行转义实现。三层模型结构如图 1 所示。
2. 2 SQL 过滤
SQL 过滤是注入攻击防范模型的第一层,主要过滤页面表单中可编辑文本框的输入值和 URL 中的查询参数,若包含带攻击特征的字符则将特征字符去掉后向下执行。在 SQLServer 2005 中自定义过滤函数StringFilter,将 用 户 输 入 中 的 特 征 字 符 过 滤 掉。
StringFilter 函数的声明语句如下:
StringFilter( @ input_str varchar( MAX) ,@ from_str var-char( MAX) ,@ to_str varchar( MAX) )
参数@ input_str 表示需要进行过滤的字符串,@from_str 表示特征字符组成的集合,@ to_str 表示特征字符过滤的结果,函数返回值是将@ from_str 中的每个字符替换为@ to_str 中的相应字符之后的字符串。
过滤函数 StringFilter 的设计算法如下:
( 1) 判断 3 个参数是否为空值,若有空值则函数返回空值; 若都不为空,执行( 2) ;
( 2) 定义变量@ result 表示@ input_str,变量@from_len 表示@ from_str 的长度,若@ from_len 大于0,获取最后一个即将替换的字符; 若@ from_len 等于0,函数返回@ result;
( 3) 如果当前字符在@ from_str 中有重复值,@from_len 自减 1,执行( 2) ; 若没有重复值则执行( 4) ;
( 4) 如果@ from_len 大于@ to_str 的长度,则从@result 中删除在@ from_str 中而不在 @ to _str 中的字符,执行( 6) ; 否则,执行( 5) ;
( 5) 将@ result 中与@ from_str 中相同的字符替换为@ to_str 中相应字符;( 6) 将@ from_len 自减 1,执行( 2) 。
2. 3 参数化语句
经过 SQL 参数过滤后,常见的特征字符被替换,但是未被指定为特征字符的合法 SQL 标示符将绕过过滤。考虑到 SQL 注入攻击大部分是由于在程序中采用动态字符串或动态 SQL 引起的,所以注入攻击防范模型的第二层是采用绑定变量的方式将用户提交的数据进行参数化处理。
假设存在关系 Table,Table 中包含 2 个字符串类型的属性 ColA 和 ColB。从页面传递 2 个字符串 strA和 strB 进行查询操作。动态 SQL 语句的定义如下:
string sql = " select* from Table where ColA = '" + strA + " '
and ColB = '" + strB + " '" ;
改用参数化语句则按下面语句:
stringsql = " select * from Table where ColA = @ str1 andColB = @ str2" ;
SqlParameter param1 = new SqlParameter( " @ str1" ,strA) ;
SqlParameter param2 = new SqlParameter( " @ str2" ,strB) ;
2. 4 关键词转义
参数化语句能够一定程度提高数据库访问的安全性,但也有可能会向数据库传递潜在的不安全参数,例如传入一个更新语句等。为了进一步对注入攻击进行防范,在防范模型的第三层采用关键词转义方法,应用转义后的 SQL 关键字创建查询语句,执行前进行反向转义。恶意用户注入 SQL 语句时不知道转义规则将会使注入内容发生语法错误,从而达到防范目的。
为了简化转义规则设计,需要结合 ASP. NET 应用的具体实现功能确定需要转义的关键词集合。下面自定义关键词转义类 KeyWordTranslate,基本结构如下:
public class KeyWordTranslate
{
public static string Translate ( string keyword)
{ / /定义转义规则,返回转以后结果}
public static string Reverse( string transword)
{ / /定义反向转义规则,返回关键词}
public static string[]AllReverse( )
{ / /构建转义后 SQL 关键词的数组,用以判断指定单词
是否是转以后的关键词}
public static string[]AllKeyWord( )
{ / /构建 SQL 关键词数组,用以判断指定单词是否是关
键词}
}
用 KeyWordTranslate 类转义关键词后定义 SQL
语句如下所示:
String sql = " "
+ KeyWordTranslate. Translate( " select" )
+ " * "
+ KeyWordTranslate. ranslate( " from" )
+ " Table"
+ KeyWordTranslate. Translate( " where" )
+ " ColA = @ str1"
+ KeyWordTranslate. Translate( ( " and" )
+ " ColB = @ str2" ;
当执行 SQL 语句时,按以下步骤进行反向转义:
( 1) 将 SQL 以空格和“; ”为分隔符构造字符串数组;
( 2) 判断字符串数组中是否有关键词,若有则认为是注入攻击,拒绝执行,算法结束; 否则执行( 3) ;
( 3) 如果 i( 初值 0) 小于字符串数组长度,判断字符串数组中第 i 个元素是否包含在 KeyWordTrans-late. AllReverse ( ) 中,若包含则执行 KeyWordTrans-late. Reverse( ) 函数得到关键词,执行( 4) ; 若 i 等于字符串数组长度,算法结束,sql_new( 初值为“”) 即为反向转义的结果;
( 4) 将判断后的结果连接到新的字符串 sql_new;( 5) i 自加 1,执行( 3)。
3 实验结果
为验证防范模型的有效性,设计 ASP. NET 应用程序实现简单的用户登录功能,数据库中用户表为users。登录界面设计了用户名和密码 2 个文本框接收用户输入,用户名 Admin,密码 Admin 是一个合法用户。在应用三层防范模型情况下,用户名和密码框录入不同测试用例值得到结论如表 2 所示。
4 结束语
通过对 ASP. NET 应用程序中 SQL 注入攻击流程和攻击方式的分析,针对注入攻击的根本途径,本文提出并设计一种三层防范模型。这种防范模型从过滤用户输入开始,配合参数化查询语句,同时转义SQL 关键词,以 3 种不同角度逐步增强应用程序的安全防范能力。实验结果表明,经过三层防范后的数据库安全性更高。
参考文献:
[1] 周益宏,陈建勋. 浅析基于 ASP. NET 的网站 SQL 注入攻击及防范措施[J]. 计算机安全,2010( 6) : 93-95.
[2] 王云,郭外萍,陈承欢. Web 项目中的 SQL 注入问题研究与防范方法[J]. 计算机工程与设计,2010,31( 5) :976-978.
[3] Patel N,Mohammed F,Soni S. SQL injection attacks: tech-niques and protection mechanisms[J]. Internationl Journal onComupter Science and Engineering,2011,3( 1) : 199-203.
[4] 刘合叶. 多功能 SQL 注入检测系统的实现及攻击防范方法研究[D]. 北京: 北京交通大学,2009.
[5] Su Zhengdong,Wassermann G. The essence of commandinjection attacks in Web application[C]/ / Proc. of AnnualSymposium on Principles of Programming Languages.2006: 372-382.
[6] 周琰. SQL 注入检测方法的研究与实现[D]. 西安: 西北大学,2011.
[7] Stuttard D,Pinto M. The Web Application Hacker’s Hand-book: Discovering and Exploiting Security Flaws[M]. 北京:人民邮电出版社,2009.
[8] 石聪聪,张涛,余勇,等. 一种新的 SQL 注入防护方法的研究与实现[J]. 计算机科学,2012,39( 6A) : 60-64.
[9] 丁允超,范小花. SQL 注入攻击原理及其防范措施[J]. 重庆科技学院学报: 自然科学版,2012,14( 5) :136-139.
[10] 马凯,蔡皖东,姚烨. Web 2. 0 环境下 SQL 注入漏洞注入点提取方法[J]. 计算机技术与发展,2013,23( 3) :121-124,128.
[11] 王伟平,李吕,段桂华. 基于正则表示的 SQL 注入过滤模块设计[J]. 计算机工程,2013,37( 5) : 158-160.
[12] 竺霞芳. 双层防御 SQL 注入攻击的方法[D]. 武汉: 华中科技大学,2011.