旁路式解析和还原tns协议中sql命令的方法

文档序号:7856834阅读:599来源:国知局
专利名称:旁路式解析和还原tns协议中sql命令的方法
技术领域
本发明属于网络信息安全与计算机应用技术领域,涉及一种旁路式解析和还原TNS协议中SQL命令的方法。
背景技术
随着信息时代的到来,计算机和数字设备使用数量的逐年增加,数据库系统大量使用,尤其是适合大型应用的Oracle数据库。oracle是殷墟出土的甲骨文(oracle bone inscriptions)的英文翻译的第一个单词,在英语里是“神谕”的意思。Oracle是世界领先的信息管理软件开发商,因其复杂的关系数据库产品而闻名。Oracle数据库产品为财富排行榜上的前1000家公司所采用,许多大型网站也选用了 Oracle系统。因Oracle系统可移植性好、使用方便、功能强,适用于各 类应用环境,其市场占有率一直处于领先地位。数据库安全是信息安全的底线。用户对于Oracle的操作直接关系到数据库的安全,所以对用户数据库业务进行在线审计、行为回溯和风险控制有着十分重要的意义。ORACLE客户端和服务端通讯采用的协议是TNS协议(Transparence NetworkSubstrate,透明网络底层)。对使用TCP/IP协议传输的TNS数据包进行旁路监听,处理之后就可以得到每位用户的SQL操作命令。

发明内容
本发明针对现有技术的不足,提供了一种旁路式解析和还原TNS协议中SQL命令的方法。实现发明的技术方案一种旁路式解析和还原TNS协议中SQL命令的方法,采用旁路获取网络中客户端对Oracle数据库服务器发送的请求数据包,并其进行过滤、缓存和解析,最后还原出客户端完整的SQL命令。步骤(I)利用开源库Iibpcap或winpcap中的函数pcap_findalldevs ()获取并输出所有网络设备接口号、名称和描述信息。步骤(2)从步骤(I)中输出的所有网络设备接口号中选择需要捕获的网络设备接口号作为指定的数据捕获网络设备接口。步骤(3)设置device参数为指定打开的网络设备接口名称,捕获数据的最大字节数参数snaplen为65535 (可以保证捕获不同数据链路层的数据),网络设备接口工作模式参数promise为I (即混杂模式),超时时间参数为1000毫秒,准备好函数出错返回NULL时用于传递错误消息的参数ebuf,调用Iibpcap或winpcap中的函数pcap_open_live (),打开步骤(2)中指定的数据捕获网络设备接口,使其处于混杂模式捕获其连接网络的所有数据,并将函数pcap_open_live ()的返回值保存到变量adhandle中。步骤(4)以变量adhandle为输入参数,调用Iibpcap或winpcap中的函数pcap_datalink()判断捕获数据的数据链路层类型,若函数pcap_datalink()的返回值为DLT_EN10MB,则捕获的数据链路层类型为以太网,进入步骤(5),否则结束。步骤(5)设置包过滤参数packet_filte为“TCP”,优化参数optimize为I,网络掩码参数netmask为数据捕获网络设备接口所在网络的掩码,调用Iibpcap或winpcap中的函数pcap_compile ()和pcap_setfilter (),编译包过滤表达式“TCP”进入驱动程序并
设置使其起作用。步骤(6)设置回调函数参数为自定义的packet_handler ()函数,调用Iibpcap或winpcap中的pcap_loop()函数,开始循环捕获网络数据巾贞,根据包过滤表达式对每个数据巾贞调用回调函数packet_handler ()解析出其中的SQL语句。回调函数packet_handler ()的处理步骤包括步骤(I)根据以太帧格式,将指向以太帧指针加上14个字节偏移得到指向IP数据包头结构指针值,将其保存到变量ipHeader中。步骤(2)根据IP协议数据包格式,读取ipHeader结构中第4 一 7个bit的首部长度字段值ipHeaderLen (默认值为5 ),计算出IP头部长度为ipHeaderLenX4字节(默认值为2 0字节)。步骤(3)根据IP协议数据包格式,将指向IP数据包头结构指针加上IP数据包头长度(即ipHeaderLenX4)个字节偏移,得到指向TCP数据包头结构指针值,将其保存到变量 TCPHeader 中。步骤(4)根据TCP协议数据包格式,读取第2-3字节的目的端口字段信息,将端口字段信息从网络顺序转变为主机顺序并保存到变量dPort中。若dPort值为1521则进入步骤(5),否则结束本回调函数对本网络数据帧的处理。步骤(5)根据TCP协议格式,读取TCPHeader结构中第12字节开始4个bit的首部长度字段值tcpHeaderLen,计算出TCP数据包头部长度为tcpHeaderLen X 4字节(默认值为2 0字节)。步骤(6)根据TCP协议数据包格式,将指向TCP数据包头结构指针加上TCP数据包头长度(即tcpHeaderLenX4)个字节偏移,得到指向TNS数据包头结构指针值,将其保存到变量tnsHeader中。步骤(7)根据TNS协议数据包格式,将指向TNS数据包头结构指针tnsHeader加上10个字节偏移,得到指向TNS负载数据部分的指针值,将其保存到变量tnsData中。步骤(8)分别读取tnsData指针的第零、第一和第三个字节值并将其保存到变量zeroByte>oneByte 和 threeByte 中。根据 zeroByte、oneByte 和 threeByte 的值情况分别选择步骤8. I、8. 2或8. 3中的一步来执行。8. I 若 zeroByte 值为 0x03, oneByte 值为 0x5e,且 threeByte 值为 0x61 ;则数据包中包含Select命令语句,执行以下步骤
(I)赋值偏移变量offset为95,读取tnsData+offset指针指向的命令串长度值,将其保存到变量cmdLen中。(2)将 offset 值加 1,并将 tnsData+offset 保存到 tnsCMDStart 变量中。(3 )对tnsData+offset指针指向的字符进行检测,若字符为可打印字符且offset-95< cmdLen,则将offset加1,并重复执行步骤(3),否则将tnsData+offset保存到变量tnsCMDEnd中。
(4)从tnsCMDStart指针指向的字符开始到tnsCMDEnd指针指向的字符为止,将字符串拷贝出来即为完整的Select命令。8. 2 若 zeroByte 值为 0x03, oneByte 值为 0x5e,且 threeByte 值为 0x21 ;则数据包中包含CREATE、DROP、INSERT或ALTER命令语句,执行以下步骤
(I)赋值偏移变量offset为95,读取tnsData+offset指针指向的命令串长度值,将其保存到变量cmdLen中。(2) offset 值加 1,并将 tnsData+offset 保存到 tnsCMDStart 变量中。(3 )对tnsData+offset指针指向的字符进行检测,若字符为可打印字符且offset-95< cmdLen,则将offset加1,并重复执行步骤(3),否则将tnsData+offset值保存到变量tnsCMDEnd中。
(4)从tnsCMDStart指针指向的字符开始到tnsCMDEnd指针指向的字符为止,将字符串拷贝出来即为完整的CREATE、DROP、INSERT或ALTER命令。8. 3 若 zeroByte 值为 0x03, oneByte 值为 0x77,且 threeByte 值为 0x21 ;则数据包中包含DESC命令语句,执行以下步骤
(I)赋值偏移变量offset为24,读取tnsData+offset指针指向的命令串长度值,将其保存到变量cmdLen中。(2) offset 值加 1,并将 tnsData+offset 保存到 tnsCMDStart 变量中。(3 )对tnsData+offset指针指向的字符进行检测,若字符为可打印字符且offset~24< cmdLen,则将offset加1,并重复执行步(3),否则tnsData+offset保存到变量 tnsCMDEnd 中;。(4)从tnsCMDStart指针指向的字符开始到tnsCMDEnd指针指向的字符为止,将字符串拷贝出来即为完整的DESC命令语句。本发明可提供对Oracle数据库细粒度审计、精准化行为回溯、全方位风险控制功能和安全审计基础功能。


图I为本发明的整体流程 图2为包处理回调函数处理流程 图3为Select命令解析流程;
图4为CREATE、DROP、INSERT或ALTER命令解析流程;
图5为DESC命令语句解析流程;
图6为本方法的一般使用部署图。
具体实施例方式以下结合附图对本发明作进一步描述。图I是本发明的整体流程图,其主要步骤如下
步骤(I)调用开源库Iibpcap或winpcap中的函数pcap_findalIdevs ()。步骤(2)若pcap_findalldevs ()返回值为_1,则退出并结束本流程,否则pcap_findalldevs ()返回所有网络设备接口号、名称和描述信息。
步骤(3)系统管理员从步骤(2)中pcap_findalIdevs ()返回的所有网络设备接口号中选择需要数据捕获的网络设备接口号作为指定的数据捕获网络设备接口。步骤(4)设置device参数为指定打开的网络设备接口名称,捕获数据的最大字节数参数snaplen为65535 (可以保证捕获不同数据链路层的数据),网络设备接口工作模式参数promise为I (即混杂模式),超时时间参数为1000毫秒,准备好函数出错返回NULL时用于传递错误消息的参数ebuf,调用Iibpcap或winpcap中的函数pcap_open_live (),打开步骤(2)中指定的数据捕获网络设备接口,使其处于混杂模式捕获其连接网络的所有数据,并将函数pcap_open_live ()的返回值保存到变量adhandle中。步骤(5)以变量adhandle为输入参数,调用Iibpcap或winpcap中的函数pcap_datalink()判断捕获数据的数据链路层类型,若函数pcap_datalink()的返回值为DLT_EN10MB,则捕获的数据链路层类型为以太网,进入步骤(6),否则结束。步骤(6)设置包过滤参数packet_filte为“TCP”,优化参数optimize为I,网络掩码参数netmask为数据捕获网络设备接口所在网络的掩码,调用Iibpcap或winpcap中 的函数pcap_compile ()和pcap_setfilter (),编译包过滤表达式“TCP”进入驱动程序并设置使其起作用。步骤(7)设置回调函数参数为自定义的packet_handler ()函数,调用Iibpcap或winpcap中的pcap_loop()函数,开始循环捕获网络数据巾贞,根据包过滤表达式对每个数据巾贞调用回调函数packet_handler ()解析出其中的SQL语句。图2包处理回调函数处理流程图,其主要步骤如下
步骤(I)从以太帧得到IP包头。根据以太帧格式,将指向以太帧指针加上IP包头偏移(默认值是14个字节)得到指向IP数据包头结构指针值,将其保存到变量ipHeader中。步骤(2)计算I P头部长度。根据IP协议数据包格式,读取ipHeader结构中第4 一 7个bit的首部长度字段值ipHeaderLen (默认值为5),计算出IP头部长度为ipHeaderLen X 4字节(默认值为2 0字节)。步骤(3)找到TCP包头。根据IP协议数据包格式,将指向IP数据包头结构指针加上IP数据包头长度(即ipHeaderLenX 4)个字节偏移,得到指向TCP数据包头结构指针值,将其保存到变量TCPHeader中。步骤(4)获取TCP端口字段信息。根据TCP协议数据包格式,读取其第2-3字节的目的端口字段信息,将端口字段信息从网络顺序转变为主机顺序并将其保存到变量dPort中。步骤(5)判断是否为TNS数据包。若dPort值为Oracle数据库服务端口(默认为1521)则进入步骤(6),否则结束回调函数对本网络数据帧的处理;。步骤(6)根据TCP协议格式,读取TCPHeader结构中第12字节开始4个bit的首部长度字段值tcpHeaderLen,计算出TCP数据包头部长度为tcpHeaderLen X 4字节(默认值为2 0字节)。步骤(7)计算TCP头部长度。根据TCP协议数据包格式,将指向TCP数据包头结构指针加上TCP数据包头字节长度偏移(即tcpHeaderLen X 4个字节),得到指向TNS数据包头结构指针值,将其保存到变量tnsHeader中;
步骤(8)找到TNS包数据负载部分。根据TNS协议数据包格式,将指向TNS数据包头结构指针tnsHeader加上10个字节偏移,得到指向TNS负载数据部分的指针值,将其保存到变量tnsData中。步骤(9)根据语句的类型SELECT,CREATE、DROP、INSERT或 ALTER 命令,DESC 命令语句;分别解析出TNS负载数据中的SQL语句。图3 SELECT命令解析流程图,其主要步骤如下
步骤(I)分别读取tnsData指针的第零、第一和第三个字节值并将其保存到变量zeroByte、oneByte 和 threeByte 中。步骤(2)若zeroByte 值为 0x03, oneByte 值为 0x5e,且 threeByte 值为 0x61 ;则数据包中包含Select命令语句,执行步骤(3),否则结束本流程;
步骤(3)赋值偏移变量offset为95,读取tnsData+offset指针指向的命令串长度值,将其保存到变量cmdLen中。 步骤(4)将offset 值加 I,并将 tnsData+offset 保存到 tnsCMDStart 变量中。步骤(5)对tnsData+offset指针指向的字符进行检测,若是可打印字符且offset-95< cmdLen,则将offset加I,并重复执行步骤(5),否则将tnsData+offset保存到变量tnsCMDEnd中。步骤(6 )从tnsCMDStart指针指向的字符开始到tnsCMDEnd指针指向的字符为止,将字符串拷贝出来即为完整的SELECT命令。图4 CREATE、DROP、INSERT或ALTER命令解析流程图,其主要步骤如下
步骤(I)分别读取tnsData指针的第零、第一和第三个字节值并将其保存到变量zeroByte、oneByte 和 threeByte 中。步骤(2)若zeroByte 值为 0x03, oneByte 值为 0x5e,且 threeByte 值为 0x21 ;则数据包中包含CREATE、DROP、INSERT或ALTER命令语句,执行步骤(3),否则结束本流程。步骤(3)赋值偏移变量offset为95,读取tnsData+offset指针指向的命令串长度值,将其保存到变量cmdLen中。步骤(4)offset 值加 1,并将 tnsData+offset 保存到 tnsCMDStart 变量中。步骤(5)对tnsData+offset指针指向的字符进行检测,若是可打印字符且offset-95< cmdLen,则将offset加I,并重复执行步骤(5),否则将tnsData+offset值保存到变量tnsCMDEnd中。步骤(6 )从tnsCMDStart指针指向的字符开始到tnsCMDEnd指针指向的字符为止,将字符串拷贝出来即为完整的CREATE、DROP、INSERT或ALTER命令。图5 DESC命令语句命令解析流程图,其步骤如下
步骤(I)分别读取tnsData指针的第零、第一和第三个字节值并将其保存到变量zeroByte、oneByte 和 threeByte 中。步骤(2)若zeroByte 值为 0x03, oneByte 值为 0x77,且 threeByte 值为 0x21 ;则数据包中包含DESC命令语句,执行步骤(3 ),否则结束本流程;
步骤(3)赋值偏移变量offset为24,读取tnsData+offset指针指向的命令串长度值,将其保存到变量cmdLen中。步骤(4)offset 值加 I,并将 tnsData+offset 保存到 tnsCMDStart 变量中;
步骤(5),对tnsData+offset指针指向的字符进行检测,若是可打印字符且offset~24< cmdLen,则将offset加1,并重复执行步(5),否则tnsData+offset保存到变量 tnsCMDEnd 中。步骤(6),从tnsCMDStart指针指向的字符开始到tnsCMDEnd指针指向的字符为止,将字符串拷贝出来即为完整的DESC命令语句。
图6是本方法的一般使用部署图。本方法可以在不改变原有的网络和信息系统结构,一般情况下可采用旁路接入捕获网络数据包的方法,在不占用数据库服务器任何资源、不影响数据库性能的情况下,快速部署到业务系统中。
权利要求
1.旁路式解析和还原TNS协议中SQL命令的方法,该方法采用旁路获取网络中客户端对Oracle数据库服务器发送的TNS协议数据包,并进行过滤、缓存和解析,最后还原出客户端完整的SQL命令,其特征在于该方法包括以下步骤 步骤(I)利用开源库Iibpcap或winpcap中的函数pcap_findalldevs ()获取并输出所有网络设备接口号、名称和描述信息; 步骤(2)从步骤(I)中输出的所有网络设备接口号中选择需要捕获的网络设备接口号作为指定的数据捕获网络设备接口; 步骤(3)设置device参数为指定打开的网络设备接口名称,捕获数据的最大字节数参数snaplen为65535,网络设备接口工作模式参数promise为1,超时时间参数为1000毫秒,准备好函数出错返回NULL时用于传递错误消息的参数ebuf,调用Iibpcap或winpcap中的函数pcap_open_live (),打开步骤(2)中指定的数据捕获网络设备接口,使其处于混杂模式捕获其连接网络的所有数据,并将函数pCap_0pen_live ()的返回值保存到变量adhandle 中; 步骤(4)以变量adhandle为输入参数,调用Iibpcap或winpcap中的函数pcap_datalink()判断捕获数据的数据链路层类型,若函数pcap_datalink()的返回值为DLT_EN10MB,则捕获的数据链路层类型为以太网,进入步骤(5),否则结束; 步骤(5)设置包过滤参数packet_filte为“TCP”,优化参数optimize为1,网络掩码参数netmask为数据捕获网络设备接口所在网络的掩码,调用Iibpcap或winpcap中的函数pcap_compile ()和pcap_setfilter (),编译包过滤表达式“TCP”进入驱动程序并设置使其起作用; 步骤(6)设置回调函数参数为自定义的packet_handler ()函数,调用Iibpcap或winpcap中的pcap_loop()函数,开始循环捕获网络数据巾贞,根据包过滤表达式对每个数据中贞调用回调函数packet_handler ()解析出其中的SQL语句。
2.根据权利要求I所述的旁路式解析和还原TNS协议中SQL命令的方法,其特征在于所述的回调函数packet_handler ()的处理步骤包括 步骤(I)根据以太帧格式,将指向以太帧指针加上14个字节偏移得到指向IP数据包头结构指针值,将其保存到变量ipHeader中; 步骤(2)根据IP协议数据包格式,读取ipHeader结构中第4 一 7个bit的首部长度字段值ipHeaderLen,计算出IP头部长度为ipHeaderLenX4字节; 步骤(3)根据IP协议数据包格式,将指向IP数据包头结构指针加上IP数据包头长度个字节偏移,即ipHeaderLenX4个字节偏移,得到指向TCP数据包头结构指针值,将其保存到变量TCPHeader中; 步骤(4 )根据TCP协议数据包格式,读取第2-3字节的目的端口字段信息,将端口字段信息从网络顺序转变为主机顺序并保存到变量dPort中;SdPort值为Oracle TNS协议服务端口则进入步骤(5),否则回调函数处理结束; 步骤(5)根据TCP协议格式,读取TCPHeader结构中第12字节开始4个bit的首部长度字段值tcpHeaderLen,计算出TCP数据包头部长度为tcpHeaderLenX4字节; 步骤(6)根据TCP协议数据包格式,将指向TCP数据包头结构指针加上TCP数据包头长度个字节偏移,即tcpHeaderLenX 4个字节偏移,得到指向TNS数据包头结构指针值,将其保存到变量tnsHeader中; 步骤(7)根据TNS协议数据包格式,将指向TNS数据包头结构指针tnsHeader加上10个字节偏移,得到指向TNS负载数据部分的指针值,将其保存到变量tnsData中; 步骤(8)分别读取tnsData指针的第零、第一和第三个字节值并将其保存到变量zeroByte、oneByte 和 threeByte 中;根据 zeroByte、oneByte 和 threeByte 的值情况分别选择步骤8. I、8. 2或8. 3中的一步来执行; · 8. I 若 zeroByte 值为 0x03, oneByte 值为 0x5e,且 threeByte 值为 0x61 ;则数据包中包含Select命令语句,执行以下步骤 (1)赋值偏移变量offset为95,读取tnsData+offset指针指向的命令串长度值,将其保存到变量cmdLen中; (2)将offset 值加 I,并将 tnsData+offset 保存到 tnsCMDStart 变量中; (3)对tnsData+offset指针指向的字符进行检测,若字符为可打印字符且offset-95〈cmdLen,贝丨J将offset加I,并重复执行步骤(3),否则将tnsData+offset保存到变量tnsCMDEnd 中; (4)从tnsCMDStart指针指向的字符开始到tnsCMDEnd指针指向的字符为止,将字符串拷贝出来即为完整的Select命令; · 8. 2 若 zeroByte 值为 0x03, oneByte 值为 0x5e,且 threeByte 值为 0x21 ;则数据包中包含CREATE、DROP、INSERT或ALTER命令语句,执行以下步骤 (1)赋值偏移变量offset为95,读取tnsData+offset指针指向的命令串长度值,将其保存到变量cmdLen中; (2)offset 值加 I,并将 tnsData+offset 保存到 tnsCMDStart 变量中; (3)对tnsData+offset指针指向的字符进行检测,若字符为可打印字符且offset-95〈cmdLen,则将offset加I,并重复执行步骤(3),否则将tnsData+offset值保存到变量tnsCMDEnd 中; (4)从tnsCMDStart指针指向的字符开始到tnsCMDEnd指针指向的字符为止,将字符串拷贝出来即为完整的CREATE、DROP、INSERT或ALTER命令; · 8· 3 若 zeroByte 值为 0x03,oneByte 值为 0x77,且 threeByte 值为 0x21 ;则数据包中包含DESC命令语句,执行以下步骤 (1)赋值偏移变量offset为24,读取tnsData+offset指针指向的命令串长度值,将其保存到变量cmdLen中; (2)offset 值加 I,并将 tnsData+offset 保存到 tnsCMDStart 变量中; (3)对tnsData+offset指针指向的字符进行检测,若字符为可打印字符且offset-24〈cmdLen,则将offset加1,并重复执行步(3),否则tnsData+offset保存到变量tnsCMDEnd中;; (4)从tnsCMDStart指针指向的字符开始到tnsCMDEnd指针指向的字符为止,将字符串拷贝出来即为完整的DESC命令语句。
全文摘要
本发明涉及一种旁路式解析和还原TNS协议中SQL命令的方法。本发明首先利用开源库获取并输出所有网络设备接口号、名称和描述信息,选择需要捕获的网络设备接口号作为指定的数据捕获网络设备接口。其次设置参数device、参数snaplen、网络设备接口工作模式、超时时间参数、参数ebuf,打开指定的数据捕获网络设备接口。然后判断捕获数据的数据链路层类型,若为以太网,则编译包过滤表达式“TCP”进入驱动程序。最后开始循环捕获网络数据帧,根据包过滤表达式对每个数据帧调用回调函数解析出SQL语句。本发明可提供对Oracle数据库细粒度审计、精准化行为回溯、全方位风险控制功能和安全审计基础功能。
文档编号H04L29/08GK102801714SQ20121026174
公开日2012年11月28日 申请日期2012年7月26日 优先权日2012年7月26日
发明者徐 明, 孔飞, 郑宁, 张海平, 徐建 申请人:杭州电子科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1