孙 伟 陈 林
1(中山大学信息科学与技术学院 广州 510006)2(信息技术教育部重点实验室(中山大学) 广州 510006)3 (中山大学数据科学与计算机学院 广州 510006)(sunwei@mail.sysu.edu.cn)
基于抽象语法树的C#源代码SQL注入漏洞检测算法
孙 伟1,2陈 林3
1(中山大学信息科学与技术学院 广州 510006)2(信息技术教育部重点实验室(中山大学) 广州 510006)3(中山大学数据科学与计算机学院 广州 510006)(sunwei@mail.sysu.edu.cn)
SQL注入攻击是数据库安全的主要威胁.SQL注入攻击被列为OWASP(open Web application security project)2010年和2013年十大Web应用系统安全威胁之首.SQL注入攻击检测及防御是目前常见的研究热点,结合抽象语法树的数据传播分析及C#语言特性,提出基于规则及特征匹配的漏洞检测架构,实现了C#源代码的静态检测算法.测试结果表明该算法效果良好,简单实用,通过生成源代码的抽象语法树及追踪数据的传播途径,根据规则匹配进行检测,实现C#源代码的SQL注入漏洞检测,在开发阶段提高了代码的安全性;同时提出的漏洞检测框架可以进行拓展,实现对其他编程语言的SQL注入漏洞检测.
SQL注入;抽象语法树;数据流分析;规则匹配;静态分析
根据美国Verizon发布的《2015 数据泄露调查报告》[1]统计,2014年发生在全球61个国家的79 790起安全事件中,有2 122起数据泄露事件得到确认,从2010年到2014年的统计数据来看,全球数据库泄露事件呈现缓慢增长的趋势.在众多导致数据库泄露的漏洞中,利用SQL(structured query language)注入漏洞发动的攻击,是数据库安全的主要威胁.OWASP(open Web application security project) 在2010年和2013年都把SQL注入攻击列为十大Web应用系统安全威胁之首[2-3].根据安华金和数据库攻防实验室最新发布的《2015H1安华金和数据库漏洞威胁报告》[4]显示,80%以上的数据库泄露漏洞都属于SQL注入范畴.
SQL注入漏洞不仅数量多,而且危害性很大,一旦发生SQL注入攻击,常常给用户带来巨大的损失.据美国NTT集团对2013年全球发生的近30亿次攻击进行分析得出的《2014年全球威胁情报报告(GTIR)》[5]指出,一次“小规模”的SQL注入攻击造成的损失超过19.6万美元.因此研究SQL注入攻击的防御检测是一个迫切而有价值的研究.
SQL注入(SQL injection, SQLI)是一种代码注入技术,通过把恶意的SQL脚本插入到要执行的输入字段,用于攻击数据驱动的应用程序[6].SQL注入漏洞本质上就是Web应用程序开发者编程过程中的缺陷[7].因此对SQL注入漏洞的检测主要是对程序代码进行检测.常见的代码检测方法有静态代码检测和动态代码检测2种方法.静态代码检测就是不需要运行应用程序,在编译和执行之前就实施漏洞检测.动态代码检测则相反,需要运行应用程序,在应用程序执行的过程中实施漏洞检测.
在动态检测方法的研究中,文献[8]对包括开源和商业的11个黑盒扫描器进行了分析评价,其中Acunetix,AppScan,N-Stalker,w3af在对比分析中都是较为突出的代表.Huang 等人[9]提出一个名为WAVES的黑盒测试技术,利用一个网页蜘蛛爬虫(Web crawler)识别出所有可能被利用的SQL注入点,然后基于预先定义的模式和攻击技术模拟攻击,WAVES会观察应用系统的反应而作出判断,并通过机器学习的方法提高攻击技术.文献[10]提出一种基于三维的多相位检测方法(multiple phases detection approach, MDPA)的动态SQL注入漏洞测试用例的生成模型,提高了SQL注入检测的覆盖度、准确性及检测效率.
在静态检测的方法研究中,JDBC-Checker[11]通过对动态生成的SQL查询的类型正确性进行静态的检查,能够防御类型不匹配的攻击,其缺点是不能对更多即使符合语法规范及类型正确但依然是恶意的SQL语句进行检测.Java Static Tainting[12]是Livshits和Lam提出的一种用静态分析技术来检测软件中漏洞的方法,其核心是使用信息流的技术来检测被感染的输入是否已被用来构造一个SQL查询.其限制是只能检测已知的攻击模式,而且因使用了保守分析而影响了对未污染操作的支持,存在着较高的误报率.文献[13-15]先后相关地论述了使用二叉决策图(binary decision diagram)的基于克隆的上下文相关的指针分析技术,通过Datalog(a logic programming language)和PQL(program query language)的支持,实现了对Java基于用户自定义规则的静态代码的检测,该工具的优点是作为Eclipse的一个插件,能够在编码的阶段识别出漏洞,在漏洞风险发生之前就发出警告,降低了SQL注入攻击的风险,但该方法的缺陷是其准确率及误报率依赖于漏洞规范的定义,而且目前只能应用到Java语言.
以上都是来自国外的研究情况,在国内,文献[16]使用基于信任源的动态着色及SQL方言语法感知的方法,修改了PHP的词法分析器,利用不同数据库管理系统各自的SQL语法解析器对SQL语句进行语法分析,改进了传统的动态着色防御漏洞的方法,但该方法需要修改编程语言的内核,未必适用于其他编程语言.文献[17]提出一种基于程序分析技术的防御SQL注入的方法,通过标识污染源,跟踪污染数据流,并为包含污染数据的SQL脚本在程序注入点建立自动机模型,在程序运行时监控SQL脚本的自动机模型,如果无法满足合法查询的自动机模型,即为恶意SQL注入攻击.该方法最大的弱点是需要在源程序进行插装,更改了应用程序的源代码.文献[18]提出基于“污染值传播”理论的数据流分析的SQL漏洞发现方法,首先将源代码转换为顺序、分支或循环等控制流图,定义并求解程序中每一个变量在控制流图节点的污染格值,包括“污染”和“非污染”2个值,通过数据流分析技术跟踪这种污染格值的传播转换,把污染值转播分析结果作为漏洞判定的依据,最终污染格值为“污染”的参数被标识为漏洞,该方法能够在程序开发阶段发现SQL注入漏洞,适用于解释执行的脚本语言,未见对编译型的编程语言的支持.
在我国,广泛使用C#作为Web系统的设计语言,但对其研究较少,因此针对C#作为源代码的SQL注入攻击检测的研究具有较高的现实意义.本文针对C#的源代码提出一种基于抽象语法树的数据流分析的规则及特征匹配算法,在应用程序研发过程中对源代码进行静态检测和分析,为应用程序的安全评估提供信息,从而提高了Web应用的安全性.
SQL注入的过程是一个受到污染的注入源(source),经过一系列的数据传播路径,最后到达注入点(sink)触发注入的过程.因此,检测SQL注入的源代码重点是关注注入源的感染点代码以及注入点的代码,对应于C#编程语言,就是接收和读取用户输入、客户端或服务端信息的代码以及与数据库接口相关的代码.
在C#语言中,使用System.Web命名空间中的HttpRequest类读取客户端在Web请求期间的HTTP值,表1是C#代码与SQL注入相关的编码特征.
表1 与SQL注入相关的C#代码特征
表1主要描述了与SQL注入相关的C#代码特征,这些特征将作为匹配规则的依据,检测源代码中是否存在导致SQL注入的注入源以及注入点的代码,其中如果采用了参数化编程,在本文中会被认为这样的编码是安全的.
下面通过一个存在SQL注入漏洞的代码例子,分析其特点,为检测规则的定义提供理论依据.图1是一个Web应用的后台登录前端界面:
图1 Web应用后台登录界面
图1的登录界面由用户名、密码和验证码3个字段构成,其中用户名字段经常是SQL注入攻击的位置.当输入这3个字段的值按回车或者是点击登录按钮之后,其执行的代码如图2所示:
图2 执行的代码
上述代码通过用户名和密码验证是否存在该帐号,跟踪输入正常的用户名和密码的数据流,对应的SQL语句分析如图3所示:
图3 输入正常帐号信息的登录数据流分析
由图3可见,当在前端界面输入用户名admin进行登录时,传入代码的用户名数据是admin,对应的SQL查询语句为select*from CRM_User where Name=′admin′ and PassWord=′admin′.假如用户在用户名字段输入了诸如′or 1=1- -的恶意代码,跟踪处理的数据流,对应的SQL语句分析如图4所示:
图4 输入异常帐号信息的登录数据流分析
由图4可见,用户名字段传入代码的数据是′or 1=1 - -,对应的SQL查询语句为select*from CRM_User where Name=′′or 1=1 - -′ and PassWord=′admin′,结果绕过了用户名和密码的校验,把表CRM_User的所有用户信息查询出来.
从以上例子可见,源代码通过strUsername=Request.Form[″username″]获取用户的输入,这个代码就是SQL注入源,经过sqlstring=″select*from CRM_User where Name=′″+strUsername+″′ and PassWord=′″+strPassword+″′″语句与其他SQL命令和密码字段串联组装成新的字符串,这是注入源的传播路径,经过串联组装的SQL语句最后经过SqlCommand cmd=new SqlCommand(sqlstring, dbcon)把SQL脚本传送给后台数据库执行,最终触发了SQL注入,这个代码就是注入点.经过分析归纳,存在SQL注入点的代码具有如下特点:
1) 存在如表1所述的注入源特征的用户输入、客户端Cookie、服务端变量;
2) 从注入源获取的值直接与其他字符串串联拼接成SQL语句,或注入源的值以变量输入到一个函数,且函数的输出与其他字符串串联拼接成SQL语句;
3) 拼接的SQL语句经过表1的注入点特征代码交付到后台数据库执行.
符合以上3个特点的编码被认为是存在SQL注入漏洞的.
2.1 检测架构分析
本文基于静态分析的C#源代码SQL注入检测算法,是根据第1节描述的代码特点进行SQL注入漏洞判断的.假如从注入源到注入点的数据信息传播路径,一直都是直接的字符串拼接或者效果等于直接字符串拼接的赋值操作,那么认为这些代码是存在SQL注入漏洞的,反之,假如采用参数化、存储过程化或者对象化(诸如采用Nhibernate)编程对数据进行处理,那么这样的代码被认为是安全的.
本文检测算法的基本思路是利用抽象语法树技术对C#源代码分析,遍历抽象语法树,得到每一个用户输入的数据流分析结果,最终把用户输入的数据流分析结果与SQL注入校验规则比较匹配,得出SQL注入漏洞的检测结果.抽象语法树技术的引入目的是为了提高生成用户输入的数据流分析结果的效率.
本文通过建立一个开放和可扩展的架构,利用抽象语法树的数据流分析技术及规则匹配的算法,根据定义的规则与源代码作匹配,最终输出漏洞缺陷警告,实现对源代码静态分析的扫描.本文算法的核心基础是应用抽象语法树的特性,如图5所示.
由图5可见,架构主要由输入、处理引擎和输出3部分组成,其功能特点如下:
1) 处理引擎.由生成抽象语法树、分析数据传播路径、规则匹配检测、生成知识、记录漏洞等各个功能组件构成,具有良好的扩展性和稳定性.本文实现的漏洞检测工具重点实现了规则匹配检测、记录漏洞、漏洞缺陷报告生成3个功能组件.生成抽象语法树借助了开源软件Mono[19]的支持.
2) 输入.由代码和规则库组成.规则库将根据输出的知识库和漏洞缺陷警告等信息进行改进.
3) 输出.由知识库和漏洞缺陷警告组成.知识库的意义是生成有价值的知识,指导开发人员提高编程质量,同时也对规则库的完整性和准确性提供支持.本文漏洞检测工具实现了漏洞缺陷警告功能,知识库的提出为下一步研究提供了接口和思路.
图5 静态检测算法的架构
2.2 检测流程描述
基于抽象语法树的数据流分析的规则匹配算法从源代码开始,经过抽象语法树的生成、遍历抽象语法树生成数据流分析结果,循环调用检测算法,用规则库和数据流分析的数据比较匹配,当规则匹配时,记录相应漏洞信息,当检测算法循环体达到结束条件时,生成当前C#源代码文件的警告报告,其流程如图6所示:
图7 图2中代码的抽象语法树
图6 静态扫描的流程
图6描述了基于静态分析的C#源代码SQL注入检测的整个流程,其核心过程有3个:第1个是生成抽象语法树;第2个是遍历抽象语法树生成用户数据的数据传播路径,该数据传播路径可以用1棵二叉树表达;第3个是漏洞检测过程,该过程就是基于规则库,遍历用户数据的传播路径,即遍历用户数据流的二叉树,符合规则的标准,记录漏洞,最后生成漏洞报告.
2.3 关键算法描述
本文的静态扫描算法,重点是遍历和析取抽象语法树数据并进行漏洞检测的算法.
抽象语法树[20](abstract syntax tree, AST)也称为语法树(syntax tree),是采用计算机编程语言写成的源代码的抽象语法结构的树状表现形式,树上的每个节点都表示源代码中的一种结构.之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节.图7是图2中代码对应的抽象语法树.
为了便于理解,图7用矩形框起了语句string strUsername=Request.Form[″username″]的抽象语法树关键节点,对本文来说有意义的节点就是用户输入及其传播的节点.每一个用户输入的传播过程相当于一系列的赋值指令过程,每一个赋值指令语句由目的操作数、操作符和源操作数组成,对应到抽象语法树的节点,就是Body→Statement→Variable→Identifier→=→Expression→Identifier→Argument这样的一个节点联系过程,每个指令语句相当于一个Statement节点,每个Statement节点包含目的操作数、操作符和源操作数的子节点.通过遍历析取抽象语法树,得到每一个用户输入的数据传播过程信息,每一个用户输入的数据经由输入、传播,最终到达数据库执行,其传播过程可以表达成一个数据流树,以username的传播过程为例,其数据流树如图8所示.
图8 用户输入传播过程的数据流树
由图8可见,每一个用户输入的传播过程最终形成的数据结构是1棵数据流树,叶子是源操作数或目的操作数,非叶子节点是操作符.源代码经过抽象语法树的生成,遍历抽象语法树,最终生成每一个用户输入的数据流树,并存储到数据表中.
通过遍历析取抽象语法树获得用户输入的数据流树信息后,检测SQL注入漏洞的算法转变为以规则库遍历用户输入的数据流树.规则库定义了各种操作符及其安全性,其数据定义为(操作符,安全类型),操作符包括C#代码处理用户输入的各种函数,如表1所示的注入源、注入点及参数化编程的操作符以及各种字符串串接、赋值、转换、用户自定义函数等.安全类型包括安全、不安全、可能不安全,针对SQL注入漏洞而言,其安全类型定义如下:
1) 参数化、存储过程化和对象化编程的操作标记为安全;
2) 其他的直接赋值、转换操作标记为不安全;
3) 函数操作标记为可能不安全.
另外,作为注入源的用户,直接输入标记为不安全.SQL注入漏洞的检测规则为:
1) 不安全的数据经过安全的操作,输出为安全;
2) 不安全的数据经过不安全的操作,输出为不安全;
3) 不安全的数据经过可能不安全的操作,输出为不安全;
4) 安全的数据经过安全的操作,输出为安全;
5) 安全的数据经过不安全的操作,输出为安全;
6) 安全的数据经过可能不安全的操作,输出为安全.
依据这些规则,遍历用户输入的检测结果如图9所示.
在图9中,用户输入Request.Form[″username″]标记为不安全,经过一系列的操作,由源操作数和操作符的安全性一起决定目的操作数的安全性,然后标识每个操作输出的安全性,整个数据流分析结果表明该用户输入存在漏洞,不安全.
图9 遍历数据流树的检测结果
从以上对SQL注入及防御的研究可知,SQL注入其实质是一种验证型的漏洞,这对如何提高代码的安全性有着重要的现实意义.通过检测代码存在的SQL注入漏洞,是一种有效防御SQL注入的方法.
本文从源代码静态检测的角度,提出基于抽象语法树的数据流分析技术,针对C#源代码的静态检测方法,不仅有利于发现源代码的安全漏洞,给软件开发商带来切实的价值,把软件系统的安全风险提前揭示,而且能够给代码开发人员带来有益的启示,提高了开发人员编码的规范性和安全性.
本文提出的检测算法,其功能主要包括:
1) 生成抽象语法树.通过xx编译器把C#的源代码(*.cs)生成抽象语法树.
2) 析取抽象语法树数据.通过遍历抽象语法树,析取与用户输入相关的节点数据,每一个用户输入数据的传播过程都形成1棵数据流树.
3) 规则的定义.定义检测代码是否存在SQL注入漏洞的规则,用来判断用户输入数据从注入源到注入点的过程是否存在安全或不安全的操作.
4) 检测SQL注入漏洞.依据检测规则,遍历数据流树,检测代码的SQL注入漏洞并保存到数据表中.
5) 输出检测报告.查询检测结果,输出检测结果报告.
本文提供的算法暂时无法检测跨文件的数据传播,使得本文的静态代码检测算法存在一定的误判率.
3.1 分析及设计
根据SQL注入检测的问题,依据其功能要求,析取以下用例,如图10所示:
图10 SQL注入漏洞检测的用例
图10由5个用例组成,包括生成抽象语法树、析取抽象语法树数据、检测SQL注入漏洞、定义规则及输出检测结果.其中生成抽象语法树的用例功能,引用了开源软件Mono项目的Cecil控件,本文在其基础上实现了遍历抽象语法树,析取用户输入的数据流传播信息的功能.
下面通过活动图描述核心的2个用例:析取抽象语法树数据用例和检测SQL注入漏洞的用例,如图11和图12所示.
图11描述了析取语法树用例的活动过程:
1) 读取抽象语法树;
2) 遍历抽象语法树的每一个元素;
3) 判断抽象语法树的节点Token类型是否是赋值型的表达式,如果是,则判断同级节点的表达式是否包含用户输入变量,用户输入变量的判断来自检测规则的HTTP request的特征关键字,如果是用户输入,则析取该表达式的节点信息并记录到数据库,按照目的操作数、操作符和源操作数这样的指令模式记录;
4) 把获得的表达式的目的操作数作为输入,遍历抽象语法树的节点,追踪该目的操作数作为源操作数的表达式,如3)一样记录到数据库;
5) 递归检测每一个新的目的操作数,并记录到数据库,直到目的操作数在抽象语法树中不再作为源操作数存在;
6) 结束.
图11 析取抽象语法树数据的活动图
图12是检测SQL注入漏洞的用例活动图.该图描述了检测SQL注入漏洞用例的活动过程:
1) 获取所有待检测的文件名;
2) 循环遍历每一个文件;
3) 获取同一个文件所有的注入源,即用户输入;
4) 遍历每一个注入源的数据流树,用预先定义的规则,跟踪分析每一个用户输入的数据传播路径,从注入源的位置开始,到注入点的位置结束,得出该用户输入的安全属性;
5) 保存检测结果.
图12 检测SQL注入漏洞的活动图
根据以上的分析,检测算法的类设计如图13所示.
图13描述了检测算法各个类之间的关系,由图13可见,检测的边界类ScanView调用了检测规则的控制类RuleMaintemance和检测结果的控制类ScanResultOperation.
图13 SQL注入检测算法实现的VOPC(view of participating class)图
3.2 编码的技术架构
逻辑上,SQL注入检测算法的实现采用3层的架构,包括界面层、业务逻辑层和实体层,在编码实现中,其技术架构如图14所示.
图14 SQL注入检测算法的实现技术架构
图14描述了实际编码中的技术架构.用户界面定义面向用户操作的功能,也称表示层,通过调用逻辑层的接口,实现业务逻辑处理;逻辑层通过数据访问层访问数据库;Model负责定义数据实体的类,可以被表示层、逻辑层和数据访问层访问;在数据访问层,为了更便于编程及编码的简洁,数据库访问接口统一放在Library子层,该Library子层定义了数据库连接字符串及各种直接面向数据库的操作接口,数据处理组件只要引用Library,则可方便连接数据库及调用各种数据库执行指令.
3.3 算法典型代码
SQL注入漏洞的检测算法的典型代码如图15所示.图15的典型代码主要包含各种循环遍历的检测代码,包括循环遍历获取所有待检测文件、循环遍历每一个文件的所有用户输入,遍历每一个用户输入的数据传播路径的数据流树,最终确定每一个用户输入是否存在SQL注入漏洞,把检测的结果保存到结果表.
图15 SQL注入漏洞的检测算法代码
下面是本文实现的检测算法的功能界面截图,主要包括4个:
1) 规则定义界面如图16所示.
图16通过列表的形式显示规则,增加、修改规则之后,点击底下的保存按钮即可保存到数据库.
2) 语法树生成界面如图17所示.
图17顶部的代码是C#源代码,点击生成语法树按钮之后,底部的树型结构的内容即是源代码对应的抽象语法树.
图17 生成语法树界面
3) 析取语法树结果界面如图18所示.
图18呈现了析取抽象语法树之后,每一个用户输入的表达式,都以目的操作数、操作符和源操作数的形式保存到数据库,每一个用户输入的数据传播路径,都形成一个树型的数据流树.
4) 扫描检测结果界面如图19所示.
图19显示了点击开始检测按钮后的检测结果,包括检测的文件数、检测所耗时间以及检测发现的SQL注入漏洞个数,底部详细呈现了注入源、行号、SQL注入扫描结果、注入传播路径、文件名及扫描时间等数据信息.
图18 析取抽象语法树的结果
图19 SQL注入检测结果界面
实验的检测结果表明,本文提出的基于静态分析的C#源代码SQL注入检测算法是可行的,覆盖了标准的C#源代码的SQL注入源的所有类型,检测的结果经渗透测试是正确的.
本文提出的静态检测算法概述为通过抽象语法树的生成,析取抽象语法树的节点数据,形成用户输入的数据流树,然后基于预先定义的检测规则,从注入源到注入点遍历检测数据流树,追踪分析源操作数、操作符及目的操作数的安全性变化,最终得出用户输入是否存在SQL注入漏洞的安全性分析结果.但在未来的研究中需要进一步完善以下功能:
1) 改进生成源代码的抽象语法树的功能;
2) 改善遍历抽象语法树生成数据流分析树的功能;
3) 提高跨过程调用的检测准确率及实现跨文件调用的检测;
4) 完善规则库和知识库的建设,提高覆盖度及准确率.
[1]2015 data breach investigations report[R/OL]. New York: Verizon, 2015 [2015-10-19]. https://msisac.cisecurity.org/resources/reports/documents/rp_data-breach-investigation-report-2015_en_xg.pdf
[2]Creative Commons Attributution Share-alike. The top10 most critical Web application security risks 2010[R/OL]. United States: OWASP, 2010 [2015-10-19]. http://owasptop10.googlecode.com/files/OWASP%20Top%2010%20-%202010.pdf
[3]Creative Commons Attributution Share-alike. The top10 most critical Web application security risks 2013[R/OL]. United States: OWASP, 2013 [2015-10-19]. http://owasptop10.googlecode.com/files/OWASP%20Top%2010%20-%202013.pdf
[4]安华金和. 2015H1安华金和数据库漏洞威胁报告[R/OL]. 北京: 安华金和数据库攻防实验室, 2015 [2015-10-19]. http://www.dbsec.cn/service/pdf/2015H1-DATABASE-VULNERABILITIES-REPORT.pdf
[5]NTT Innovation Institute. Global threat intelligence report[R/OL]. Palo Alto, California: NTT Group, 2015 [2015-10-19]. https://nttgroupsecurity.com/articles-content/articles/download-the-2014-report
[6]维基百科编者. SQL injection[G/OL]. 维基百科, (2015-10-19) [2015-10-19]. https://en.wikipedia.org/wiki/SQL_injection
[7]马小婷, 胡国平, 李舟军. SQL注入漏洞检测与防御技术研究[J]. 计算机安全, 2010 (11): 18-24
[8]Doupé A, Cova M, Vigna G. Why johnny can’t pentest: An analysis of black-box Web vulnerability scanners[M] //Detection of Intrusions and Malware, and Vulnerability Assessment. Berlin: Springer, 2010: 111-131
[9]Huang Y W, Huang S K, Lin T P, et al. Web application security assessment by fault injection and behavior monitoring[C] //Proc of the 12th Int Conf on World Wide Web. New York: ACM, 2003: 148-159
[10]Liu Lei,Xu Jing, Li Minglei, et al. A dynamic SQL injection vulnerability test case generation model based on the multiple phases detection approach[C] //Proc of the 37th IEEE Annual Computer Software and Applications Conf. Piscataway, NJ: IEEE, 2013: 256-261
[11]Gould C, Su Z, Devanbu P. JDBC checker: A static analysis tool for SQL/JDBC applications[C] //Proc of the 26th Int Conf on Software Engineering. Los Alamitos, CA: IEEE Computer Society, 2004: 697-698
[12]Livshits B V, Lam M S. Finding security errors in Java programs with static analysis[C] //Proc of the 14th USENIX Security Symp. Berkeley: USENIX Association, 2005: 271-286
[13]Whaley J, Lam M S. Cloning-based context-sensitive pointer alias analysis using binary decision diagrams[J]. ACM SIGPLAN Notices, 2004, 39(6): 131-144
[14]Martin M, Livshits B, Lam M S. Finding application errors using PQL: A program query language[R]. Palo Alto, California: Stanford University, 2004
[15]Martin M, Livshits B, Lam M S. Finding application errors and security flaws using PQL: A program query language[J]. ACM SIGPLAN Notices, 2005, 40(10): 365-383
[16]丁翔, 仇寅, 郑滔. 一种利用PHP防御SQL注入攻击的方法[J]. 计算机工程, 2011, 37(11): 152-153
[17]李小花, 孙建华, 陈浩. 程序分析技术在SQL注入防御中的应用研究[J]. 小型微型计算机系统, 2011, 32(6): 1089-1093
[18]谢亿鑫, 孙乐昌, 刘京菊. 基于数据流分析的SQL注入漏洞发现技术研究[J]. 微计算机信息, 2010 (15): 163-165
[19]Mono. Cecil[CP/OL]. 2015 [2015-09-10]. http://www.mono-project.com/docs/tools+libraries/libraries/Mono.Cecil/
[20]维基百科编者. Abstract syntax tree[G/OL]. 维基百科, (2015-09-08) [2015-10-19]. https://en.wikipedia.org/wiki/Abstract_syntax_tree
孙 伟
教授,博士生导师,主要研究方向为网络安全和多媒体技术通信.
sunwei@mail.sysu.edu.cn
陈 林
硕士研究生,主要研究方向为信息安全.
chanlan@163.com
A C# Source-Code SQL Injection Attack Detection Algorithm Based on Abstract Syntax Tree
Sun Wei1,2and Chen Lin3
1(SchoolofInformationScienceandTechnology,SunYat-senUniversity,Guangzhou510006)2(KeyLaboratoryofInformationTechnology(MinistryofEducation),SunYat-senUniversity,Guangzhou510006)3(SchoolofDataandComputerScience,SunYat-senUniversity,Guangzhou510006)
SQL injection attacks is ranked first in OWASP (open Web application security project) Top10 Web application security threats in both 2010 and 2013. This paper proposes a static abstract syntax tree analysis framework for detecting SQL injections based on the matching rules, and implements the C# source-code SQL injection attack detection algorithm. This paper focuses on data flow analysis based on the abstract syntax tree, tracing the route of transmission of data and detecting SQL vulnerability in accordance with the predefined rules. Then this paper achieves injection detection algorithm based on C# language source code and MSSQL. The detection algorithm results show that the algorithm works well for C# language source code. But the results also show that it is possible to make false negative due to lack of supportof detecting the vulnerability existing in the cross-file and cross-function. However, the proposed architecture and algorithms can be extended to other programming platforms. Finally, this paper makes a summary on both SQL injection and the defense, points out the shortcomings itself and makes a prospect of the SQL injection research.
SQL injection; abstract syntax tree; data flow analysis; feature matching; static analysis
2015-10-19
TP309