本发明是关于信息安全
技术领域:
,特别涉及一种数据库对象脚本安全漏洞的行为检测方法。
背景技术:
:随着信息技术的发展,数据库成了很多企业的核心资产,特别是金融、互联网等企业,数据库一旦出现故障整个企业的业务立刻瘫痪,因此数据库安全越来越受到人们的重视。目前数据库系统越来越先进,功能也越来越强大,人们可以在数据库上开发各种对象供应用程序调用,比如各种存储过程、视图、触发器等,这方便了应用程序的开发,但同时也带来了各种安全问题。由于这些对象运行在数据库服务器上,能直接操作数据库,如果数据库对象开发人员开发时无意或有意的犯错,就可能会在数据库上留下后门或使数据库丢失数据,这些都会对数据库造成巨大的影响。因此对这些对象脚本的安全审计非常重要,但是很多时候由于审计人员经验欠缺或疏忽,这些对象脚本的安全风险不能被全部发现。而且很多时候由于没有审计人员,这些脚本直接写进了数据库。因此必须有方法能快速全面地发现脚本中的安全风险,降低脚本安全审计的难度。目前常见的数据库安全扫描软件主要检测数据库系统配置风险和数据库软件本身的安全漏洞,分析的都是数据库系统的信息,没有对数据库对象脚本进行分析的功能。技术实现要素:本发明的主要目的在于克服现有技术中的不足,提供一种能够发现数据库对象脚本安全漏洞的方法。为解决上述技术问题,本发明的解决方案是:提供一种数据库对象脚本安全漏洞的行为检测方法,用于对待检测数据库对象脚本的安全漏洞进行检测,所述数据库对象脚本安全漏洞的行为检测方法包括下述步骤:(1)将待检测数据库中的对象、表结构、部分表数据(部分表数据是指每个表开头的100条数据,全部复制数据量太大,如果表里没数据可能一些对象就无法正常执行)复制到测试数据库;所述测试数据库采用一个与待检测数据库同类型同版本号的空数据库,并在测试数据库中创建一张测试表;(2)获取测试数据库中所有用户编写的对象;具体包括下述子步骤:步骤D:在测试数据库中,用SELECT语句从数据库系统视图里获取对象列表;步骤E:将步骤D中获取的对象中,没有调用参数的对象过滤掉;(3)用渗透参数库中的字符串作为传入参数,尝试执行测试数据库中所有有参数的对象;具体包括下述子步骤:步骤F:取步骤E返回的一个对象;步骤G:取渗透参数库中的一条字符串作为调用参数,尝试执行取得的对象;所述渗透参数库是指(根据以往漏洞渗透经验形成的)渗透字符串的集合,用于对参数进行渗透测试;(4)对象尝试调用后判断测试表中是否插入了测试数据,如果有说明该对象存在安全漏洞;具体包括下述子步骤:步骤H:对象执行后判断测试表里是否插入了测试数据:如果测试表里有数据说明该对象有安全漏洞,记下对象名称、参数名称,以及渗透用的字符串,并删除测试数据;如果测试表里没有数据,循环执行步骤G、步骤H,直至完成渗透参数库中所有字符串的渗透测试;步骤I:循环执行步骤F、步骤G、步骤H,直至完成对步骤E返回的所有对象的执行结果行为判断;(5)列出有安全漏洞对象名、参数名和对应的渗透字符串,即步骤H中得出的有安全漏洞的对象名称、参数名称和渗透字符串,形成扫描报告输出。在本发明中,所述步骤(1)具体包括下述子步骤:步骤A:准备一个与待检测数据库同类型同版本号的空数据库作为测试数据库(比如Oracle10.2.0.1.0),并创建一张测试表;步骤B:用管理员账号连接待检测数据库和测试数据库;步骤C:用SELECT语句获取待检测数据库的对象脚本、表结构,然后用CREATE语句在测试数据库中重新创建对象和表(用SELECT语句获取待检测数据库中每个表的部分数据,比如100条,然后用INSERT语句插入测试数据库)。与现有技术相比,本发明的有益效果是:本发明根据当前要检测的数据库生成测试数据库,然后在测试数据库上对数据库脚本进行渗透测试,故能在不影响待检测数据库的前提下,通过渗透测试、行为分析,发现对象中SQL注入等危害比较大的安全漏洞。由于本发明在测试数据库上进行渗透,所以这种方法能避免对待扫描数据库造成损害,同时用户也能快速定位有安全漏洞的脚本对象,并能有效降低漏洞的误报率。附图说明图1为本发明的工作流程图。具体实施方式首先需要说明的是,本发明涉及数据库技术,是计算机技术在信息安全
技术领域:
的一种应用。在本发明的实现过程中,会涉及到多个软件功能模块的应用。申请人认为,如在仔细阅读申请文件、准确理解本发明的实现原理和发明目的以后,在结合现有公知技术的情况下,本领域技术人员完全可以运用其掌握的软件编程技能实现本发明,凡本发明申请文件提及的均属此范畴,申请人不再一一列举。下面结合附图与具体实施方式对本发明作进一步详细描述:如图1所示,假设要对Oracle10g数据库进行对象脚本安全漏洞行为检测,具体包括下述步骤:步骤A:首先确定要检测的数据库的类型和版本号,比如Oracle10.2.0.1.0,然后在另外一台计算机上安装一个相同版本的数据库,我们称它为测试数据库,并创建一张名为TestTable的表,添加一个字符串类型的字段strTest;步骤B:用管理员账号连接要检测的数据库和测试数据库;步骤C:用SELECT语句获取待检测数据库的对象脚本、表结构,然后用CREATE语句在测试数据库中重新创建对象和表。用SELECT语句获取待检测数据库中每个表的部分数据,比如100条,然后用INSERT语句插入测试数据库,尽量使测试数据库和待检测数据库保持一致;步骤D:在测试数据库中,用SELECT语句从数据库系统视图All_SOURCE里获取对象名称和传入参数列表,例如:对象名称为test,传入参数为一个VARCHAR2型的参数;步骤E:将没有传入参数的对象过滤掉;步骤F:取步骤E返回的一个对象,如test(VARCHAR2);步骤G:取渗透参数库中的一条字符串作为调用参数,尝试执行取得的对象,例如:首先创建一个插入测试数据的函数F1:CREATEORREPLACEFUNCTIONF1RETURNNUMBERAUTHIDCURRENT_USERASPRAGMAAUTONOMOUS_TRANSACTION;BEGINEXECUTEIMMEDIATE'insertintoTestTablevalue(\‘test\’)';COMMIT;RETURN(0);END;然后调用渗透测试对象:begintest('.”||F1()||””)--','a');end;步骤H:对象执行后判断测试表里是否插入了测试数据,用select*fromTestTable语句查看,如果表里有测试数据,说明该对象有安全漏洞,记下对象名test和参数名param1,以及渗透用的字符串'.”||F1()||””)--','a',然后删除测试数据deletefromTestTable;步骤I:如果测试表里没有数据,循环执行步骤G、步骤H,直至完成渗透参数库中所有字符串的渗透测试;步骤J:循环执行步骤F、步骤G、步骤H、步骤I,直至完成对步骤E返回的所有对象的执行结果行为判断;步骤K:将步骤H中得出的有安全漏洞的对象名称、参数名称和渗透字符串列出,形成扫描报告提供给用户,可参考下表1。表1扫描报告表对象名参数名渗透字符串testparam1'.”||F1()||””)--','a'最后,需要注意的是,以上列举的仅是本发明的具体实施例。显然,本发明不限于以上实施例,还可以有很多变形。本领域的普通技术人员能从本发明公开的内容中直接导出或联想到的所有变形,均应认为是本发明的保护范围。当前第1页1 2 3