用于SQL注入检测的语句块摘要树模型

时间:2022-05-09 11:36:43

用于SQL注入检测的语句块摘要树模型

【 摘 要 】 SQL注入具有危害性大而实施简单的特点,目前已经成为危害网络信息安全的主要攻击方法之一。本文提出一个用于SQL注入检测的语句块摘要树模型,定义抽象SQL语句、语句块和反映应用系统功能的语句块摘要树,给出该树的生成算法和基于该树的SQL注入检测算法,将检测纳入到应用系统执行的SQL语句序列上下文中,提高了检测的准确性,降低了误报率。实验表明,基于语句块摘要树模型实现SQL注入检测的中间件对系统性能影响很小,说明了模型的有效性和可行性。

【 关键词 】 SQL注入;抽象SQL语句;语句块摘要树

Statement Block Digest Tree Model for SQL Injection Detection

Huang Bao-hua Ma Yan Xie Tong-yi

( College of Computer & Electronics & Information, Guangxi University GuangxiNanning 530004 )

【 Abstract 】 For its big harm and easiness of carrying out, SQL Injection is now a main attacking method hurting the network and information security. This paper proposes a statement block digest tree model for SQL injection detection. This model defines abstract SQL statement, SQL statement block and its digest tree in accordance with the function of application, and presents algorithms generating the tree and detecting SQL injection based on the tree. By putting detection on the context of executing SQL statement sequence of application, this model increases the veracity and decreases the mistake rate of detection. Experiments show that the SQL injection detection middleware implemented the model only makes little affect on the performance of system, and imply that the model is efficient and feasible.

【 Keywords 】 SQL Injection; Abstract SQL Statement; Statement Block Digest Tree

0 引言

动态Web具有交互性好和能够动态更新等优点,目前已经成为Web站点的主要实现方式。为实现良好的交互性和动态性,Web站点一般用数据库存储相关动态内容,并允许用户交互输入访问和检索条件。Web应用程序中如果对用户输入的内容不做精心处理就提交给DBMS(Database Management System),就可能使DBMS执行攻击者精心构造的恶意代码,遭受SQL注入攻击。

SQL注入攻击轻则导致数据库中敏感信息泄漏,重则可能导致DBMS服务器所在主机被控制,危害性很大。因此,SQL注入检测在信息安全中具有非常重要的意义,受到了业界的高度重视。

1 SQL注入及其检测概述

1.1 SQL注入原理

使用DBMS的动态Web应用系统架构如图1所示。用户通过浏览器(Browser)输入的内容经过Web服务器处理后成为SQL语句,然后提交给DBMS执行。

比如系统有一登录功能页面,主要代码如图2所示。设系统中有一用户,用户名:bob,口令:6XmrT1eq。正常情况下,bob可以在username和password框中输入自己的用户名和口令登入系统,即Web服务器生成SQL语句select * from login where username =‘bob’ and password = ‘6XmrT1eq’提交给DBMS执行并可以返回结果。

攻击者不知道系统中的用户名和密码,但他可以精心构造输入来达到攻击的目的。比如,他可以在username和password中分别输入abc和a’ or ‘a’=’a,这样就导致DBMS执行select * from login where username = ‘abc’ and password = ‘a’ or ‘a’=’a’。在该语句中,where部分永真,因此能返回结果,攻击者成功骗过了登录控制。

SQL注入攻击除了上述构造永真条件的方式外,还有内容猜测、环境探测、执行扩展存储过程等。目前针对SQL注入攻击的防范方法主要有两种,一种是对用户输入进行简单过滤,另一种则对提交给DBMS执行的SQL语句进行分析以实现SQL注入的检测。

1.2 基于简单文本过滤的反SQL注入

动态Web站点被SQL注入攻击的根本原因是其提供的交互输入功能被滥用,即原本设计用于向Web服务器传递简单文本的手段被用于发送攻击代码。解决这一问题的最直接办法就是对输入内容进行检查,过滤掉那些可能用于构造攻击代码的特殊符号和词语。

PHP中实现的MagicQuotes将单引号(')、双引号(")、反斜杠(\)和NULL字符进行转意,防止用户输入这些特殊字符用于构造恶意注入成分。CSSE在把语句发给数据库服务器执行前删除所有不安全的字符。为保证系统安全,可过滤掉输入的敏感词汇,如net user、/add、truncate、xp_cmdshell等。

这种过滤可以在Web应用系统的代码中编程进行,也可以通过专门的Web服务器访问或防火墙来实现。前者要求开发人员编程实现过滤,增加了开发工作量和难度,提高了维护成本;后者独立性较好,可选择专门产品来实现。

1.3 基于SQL语句分析的注入检测

简单的输入文本过滤显然限制了应用系统可以表达的功能,因此有一定的局限性。如果对即将执行的SQL语句进行分析,来识别可能的注入攻击就可以克服这种局限性。

正常用户输入用于构造SQL成分时应为终结符,因此可通过跟踪用户输入文本的非终结符来检测SQL注入攻击。SQL语法预分析策略对即将执行的SQL语句进行分析,如果发现其结构和预先定义为注入攻击的结构一致就识别为攻击语句。SDriver位于Web服务器和DBMS之间,截获Web服务器提交的SQL语句处理后和执行语句的程序踪迹堆栈一起计算签名用于识别正常和非法语句。利用数据库访问中动态SQL语句具有静态结构而不会被SQL注入的特性,可将静态SQL语句转换为动态语句。DDriver位于应用程序和其下的数据库管理系统之间,获得上层传来的SQL语句后,根据其预设的查询语句ID来判断SQL语句是否合法。CANNID动态挖掘编程者希望的在任何输入下的SQL语句结构,然后和实际执行的SQL语句结构比较来发现攻击。简单删除Web页面SQL查询的属性值,然后和预备先定义的查询比较也可以识别SQL注入。

1.4 现有检测技术的不足

基于简单文本过滤的方法将处理的目标限制在很小的范围,因此存在较大局限性,误检率很高;基于SQL语句分析的检测将分析处理的目标扩大到单条SQL语句,可以提高一些检测的准确性。如果将分析检测的范围进一步扩展,将应用系统连续执行的SQL语句序列作为检测目标,则可以进一步提高SQL注入检测的准确性。

2 语句块摘要树模型

应用系统包括多个功能,每个功能执行时,会向DBMS提交一序列SQL语句。对某一具体的功能的多次执行,一般情况下相应SQL语句只有一些数据上的变化而没有结构上的改变。数据上的变化源自程序逻辑、用户输入和选择的不同等。SQL语句中这些可变的数据可用不定值参数来代替。

定义1(抽象SQL语句):抽象SQL语句指常量被不定值参数代替的SQL语句,不定值参数用?表示。

定义2(SQL语句抽象化):SQL语句抽象化指将SQL语句中的常量替换为不定值参数的过程,用函数abstract(?)表示。

例1:SQL语句sql=select * from login where username = ‘bob’,则抽象SQL语句asql= abstract(sql) = select * from login where username = ?。

用?表示不定值参数符合数据库访问的许多工业标准,比如ODBC和JDBC中就用?表示延迟绑定参数,这和不定值参数含义一致。

定义3(语句块):语句块是由抽象SQL语句顺序组成的语句序列。

设顺序执行的SQL语句序列对应的抽象SQL语句为asql1到asqln,则语句块asqlb=asql(1,n)。

定义4(语句块摘要):语句块摘要是语句块中各抽象语句摘要的列表,用Digest(・)表示。Digest(asql(1,n))= (Hash(asql1), Hash(asql2),…,Hash(asqln))。

定理1:应用系统的功能可以用语句块的集合来表示,即App={asqlb1,asqlb2,…,asqlbm}。

这是因为从DBMS的角度来看,应用系统通过递交顺序执行的SQL语句序列来实现其功能。这些SQL语句经过抽象化后可得到抽象SQL语句序列,即语句块asqlb。因此应用系统功能func=asqlb= asql(1,n)。又因为应用系统是由各个功能组成,即App={func1,func2,…,funcm},因此App={asqlb1, asqlb2,…,asqlbm}。

定义5(语句块摘要树):语句块摘要树SBDT(Statement Block Digest Tree)是应用系统正常功能的语句块集合中各语句块摘要构成的树结构,该树的生成算法如图3所示。

3 基于SBDT的SQL注入检测

3.1 检测原理

SBDT描述了应用系统正常功能应执行的SQL语句序列的模式。生成了SBDT,也就建立了这种模式。将应用系统正在执行的SQL语句序列和该模式比较,如果不符合该模式就表示检测到SQL注入攻击。

3.2 检测算法

基于SBDT的SQL注入检测算法包括两个步骤:SBDT的建立和以此为基础的检测。

(1)SBDT建立

SBDT的建立可通过学习过程来完成,即在执行正常应用系统功能时,记录下相应SQL语句序列,然后按照图3所示SBDT生成算法生成。

(2)SQL注入检测

执行检测时,根据截获的SQL语句序列计算抽象语句块和语句块摘要待检,然后在SBDT中查找与待检摘要匹配的分支。如果查找失败则检测到SQL注入攻击。

3.3 算法准确性分析

相对于简单文本过滤和单条SQL语句检测,本算法将检测的目标扩展到SQL语句序列,能够处理上下文关系,检测的准确性有所改善。

例如图4所示代码,应用系统的目的是检查用户登录权限(语句1)、获取所有部门信息(语句2)和往操作系统增加用户Alice(语句3)。这是符合逻辑的,但采用简单文本过滤方法将导致语句3被误判,针对单条SQL语句的检测将导致语句2被误判。

在本算法中,图4所示代码块可以作为整体执行,但攻击者发出的单独的语句2或3将被检测为SQL注入。因此本算法既能检测到恶意注入,又不会对应用系统功能带来限制,检测的准确性较其它方法高。

4 实验研究

基于SBDT的SQL注入检测要实时截获SQL语句,解析后计算摘要并在树中查找匹配,因此有必要通过实验研究其可实现性并评估其对系统性能的影响。

4.1 实验环境

为截获SQL语句并进行检测,设计了一个位于应用系统和DBMS之间的中间件来实现,如图5中的SQLID4JDBC所示。SQLID4JDBC是一个JDBC Driver,实现了所有JDBC规范中的接口。在其实现的接口中,绝大多数操作可直接调用下层DBMS的JDBC Driver的相应功能。需要附加处理的接口包括java.sql包中的Statement、PreparedStatement和CallableStatement。在这些接口的涉及SQL语句的方法中可以截获并处理SQL语句。

为测试检测过程对系统性能的影响,专门开发了一个简单Web应用系统。该应用系统包括20个功能,每个功能执行的SQL语句数量不等,多的有50条,少的只有1条。

测试网络环境为1G交换以太网,Intel4核2.4G CPU/4GB Ram的PC服务器,运行Red Hat Linux Enterprise 5.0、Oracle 10g、Weblogic 9.2,采用JDBC连接数据库。

4.2 实验结果与分析

测试结果如表1所示。从表1中可以看出,增加SQL注入检测对系统的性能有一些影响,但仅在3%左右,说明基于语句块摘要树的SQL注入检测性能是可以接受的。

5 结束语

基于SBDT的SQL注入检测将检测目标扩展到SQL语句序列,考虑了SQL语句的上下文关系,克服了简单文本过滤和单条SQL语句检测的局限性,有效减少了误报率,检测结果更为准确。实验表明,该方法对系统性能影响很小,是有效和可行的。由于该方法要获得顺序执行的SQL序列,这在使用数据库连接共享的环境中存在一定困难,需要进一步研究。

参考文献

[1]. Stephen W. Boyd,Angelos D. Keromytis. SQLrand: Preventing SQL Injection Attacks [C]. //Applied Cryptography and Network Security. 2004 Lecture Notes in Computer Science.

[2]. Sin Yeung Lee, Wai Lup Low,Pei Yuen Wong. Learning Fingerprints for a Database Intrusion Detection System [C]. //Computer Security - Esoricsproceedings. 2002: Lecture Notes in Computer Science.

[3]. The PHP Group. What are Magic Quotes [OL]. 2012, Available from: www.省略/manual/en/security.magicquotes.what.php.

[4]. Tadeusz Pietraszek,Chris Vanden Berghe. Defending Against Injection Attacks Through Context-sensitive String Evaluation [C]. //Recent Advances in Intrusion Detection. 2006 Lecture Notes in Computer Science.

[5]. 周黄江. 基于OSGI的防SQL注入系统 [D]. 2010, 电子科技大学: 成都.

[6]. 王宇. Web应用防火墙的设计与实现 [D]. 2011, 上海交通大学: 上海.

[7]. Gary Wassermann,Zhendong Su. Sound and Precise Analysis of Web Applications for Injection Vulnerabilities. ACM Sigplan Notices [J], 2007 42(6): p. 32-41.

[8]. 周敬利,王晓锋,余胜生等. 一种新的反SQL注入策略的研究与实现. 计算机科学 [J], 2006. 33(11): p. 64-68.

[9]. Dimitris Mitropoulos,Diomidis Spinellis. SDriver: Location-specific Signatures Prevent SQL Injection Attacks. Computers & Security [J], 2009. 28: p. 121-129.

[10]. Stephen Thomas, Laurie Williams,Tao Xie. On Automated Prepared Statement Generation to Remove SQL Injection Vulnerabilities Information and Software Technology [J], 2009 51 (3): p. 589-598.

[11]. 杨小丽,袁丁. 防SQL注入攻击的数据库驱动设计与实现. 计算机工程与设计 [J], 2010. 31(12): p. 2691-2694.

[12]. Prithvi Bisht, P. Madhusudan,V. N. Venkatakrishnan. CANDID: Dynamic Candidate Evaluations for Automatic Prevention of SQL Injection Attacks ACM Transactions on Information and System Security [J], 2010 13(2): p. 1-38.

[13]. Inyong Lee, Soonki Jeong, Sangsoo Yeoc, et al. A Novel Method for SQL Injection Attack Detection Based on Removing SQL Query Attribute Values Mathematical and Computer Modelling [J], 2012. 55(1): p. 58-68.

基金项目:

国家自然科学基金(No.10876012);南宁市科学研究与技术开发计划(No.201003064G);广西大学科研基金(No.XBZ100102)。

作者简介:

黄保华(1973-), 男, 博士, 副教授;主要研究领域:信息安全、生物信息计算等。

马岩(1987-),男, 硕士研究生。

谢统义(1976-), 男, 硕士研究生。

上一篇:论网络技术应用下计算机软硬件资源共享的实现 下一篇:浅议对信息管理与信息系统专业的认识