- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一种基于证明树反演安全漏洞定位方法
一种基于证明树反演的安全漏洞定位方法
摘要:针对Web应用中普遍存在SQL注入漏洞等问题,提出了一种基于证明树反演的漏洞定位方法,该方法可对攻击产生的根源直接进行源代码的漏洞挖掘,其核心思想是:通过在脚本中反向追踪数据库操作所涉及的变量来检验其是否受到外界的影响,从而达到控制数据库操作的安全隐患,实验结果表明,所提方法能够准确验证53.8%的数据库操作的安全性,对于不能做出自动判定的风险操作,则能给出变量的依赖关系,该方法适用于以各种脚本语言和数据库系统搭建的Web应用平台。
关键词:注入漏洞;数据库操作;反演
中图分类号:TP393 文献标识码:A 文章编号:0253-987X(2007)04-0439-05
系统漏洞的挖掘和防范一直是网络安全讨论的热点话题,对于SQL注入式漏洞攻击的防范,学术界已有研究[1-5],主要分为代码审计和系统运行防护,本文在吸收了前人优秀思想的基础上,提出了证明树的概念,并通过在脚本中反向追踪数据库操作所涉及的变量来检验其是否受到外界的影响,从而达到证明数据库操作是否存在安全隐患的目的。
为了便于讨论,本文在阐述过程中所用到的代码片断及函数均基于PHP脚本和MY SQL数据库。
1 SQL注入式攻击原理
在Web应用的CGI脚本源代码中,不难见到如图1所示的语句。
如果有攻击者在客户端的统一资源定位(URL)请求中将变量$user的值赋为admin'or1=1#,经变量值的代人,脚本执行的代码则如图2所示。
在图2中,行注释符号#后的SQL语句在执行时将被数据库解释器去掉,所以最终数据库执行的语句如图3所示。
可见,由于程序员的疏忽,即没有对数据库操作的输入变量加以限制,所以口令验证机制可被攻击者轻易突破。
2 证明树的生成
注入漏洞的根源是直接或间接暴露了数据库操作的变量,在代码中验证一个数据库操作是否存在这种漏洞,本文采用了反向变量追踪方法,变量追踪的证明过程实际上是一棵树的生长过程,称其为证明树,由于证明树的搜索方向与代码的编译方向相反,它相当于编译技术中自下而上的语法树生长,也类似于语法归约的逆运算,故将证明过程称之为反演。
2.1 验证点
验证点是系统为脚本语言提供的数据库操作函数,也是引起注入攻击的根本因素。
就PHP脚本和MY SQL数据库而言,代码片断中的第78行、第80行的函数mysql_db_query()就是典型的验证点,如图4所示,每个验证点都对应一棵证明树,验证点的参数则是证明树的树根。
2.2 脚本代码的域划分
脚本的代码可分为如下2种区域。
(1)动态区,脚本中的条件分支、循环等代码块被定义为动态区,在执行过程中,这些代码区是否执行应根据用户的交互行为来决定,所以这种代码不可作为证明的证据。
另外,本文规定用户自定义函数体的实现部分也是动态区。
(2)静态区,除动态区以外,脚本的其余可见代码区都是静态区。
2.3 反演证据
从证明树当前位置反向逐行搜索,若证明树叶子节点中的变量第一次出现在赋值表达式的左边,这样的表达式称作证据,证据分为以下2种。
(1)可靠证据,证据表达式位于静态区,当赋值运算符右边只有变量、常量和字符串等运算符时,即作为可靠证据,可靠证据可以替换证明树上的叶子节点。
(2)不定证据,当证据位于动态代码区,或证据赋值表达式右边出现函数运算,称为不定证据,由不定证据扩充出的叶子节点不能被再次扩充。
2.4 证明树的生成算法
综上所述,可以给出证明树反演算法,其步骤描述如下:
步骤1:扫描脚本文件,生成验证点集合
同时设置初值i=1。
步骤2:判断i值,若im,下转步骤11。
步骤3:从V中取出验证点υi,将其参数作为证明树的根节点,并设置当前证明位置p为验证点所在的行号。
步骤4:从左向右扫描根结点,并用常量和变量初始化叶子节点集合L,用变量初始化可扩展叶子节点集合LE。
步骤5:若pO,赋p=p-1,否则下转步骤9。
步骤6:判断当前行是否是证据,若不是证据,上转步骤5;若是可靠证据,下转步骤7;若是潜在证据,下转步骤8。
步骤7:扫描可靠证据赋值号的右端,并用常量和变量替换集合L中的相应元素,用变量替换集合LE中的相应元素,同时判断LE是否为空,若LE为空则下转步骤9,否则上转步骤5。
步骤8:用不定证据更新L中的相关元素,并标记新加入的元素为不定证据派生的特殊元素,删除LE中的相应元素,同时判断LE是否为空,若LE空下转步骤9,否则上转步骤5。
步骤9:υi证明结束,按顺序输出L中的元
文档评论(0)