APP下载

NDIS 中间层驱动在防御SQL 注入攻击方面的应用

2023-07-25李洋刘婷

科技与创新 2023年11期
关键词:中间层驱动程序网卡

李洋,刘婷

(湖南信息职业技术学院,湖南 长沙 410200)

随着信息技术日益发展,越来越多的团体或机构将日常业务放到Web 系统上处理,这对Web 系统的安全性提出了更高更严的要求。然而,很多程序员在开发Web 系统的过程中没有树立足够的安全意识,使得这些Web 系统中或多或少存在着一些安全漏洞。其中一个比较常见的是SQL 注入漏洞,攻击者利用SQL注入漏洞发起SQL 注入攻击以达到窃取用户敏感数据的目的[1]。

本文在分析目前主流的防SQL 注入攻击技术的基础上,提出了基于NDIS 中间层驱动的防御SQL 注入攻击的技术,并对此进行了详细阐述。

1 SQL 注入攻击以及常见的防御手段

1.1 SQL 注入攻击的原理

SQL 注入攻击是常见的攻击Web 系统的手段之一,非法用户利用程序员在编写代码时没有对用户输入数据的合法性进行漏洞判断,通过提交一段针对性强的数据库查询代码,就可根据程序返回的结果获得想获取的数据[2]。由于SQL 注入是从正常的WWW 端口访问,表面上看起来与一般的Web 页面访问没什么区别,因此部署在网络上的防御设备不会对这种渗透式的攻击发出警报,SQL 注入也就很难在第一时间被发现。近年来,SQL 注入攻击已经从简单的URL(Uniform Resource Locator,统一资源定位器)直接注入和表单注入发展成为对HTTP(Hyper Text Transfer Protocol,超文本传输)协议各个字段进行注入,SQL注入带来的威胁仍不可小视。

SQL 注入攻击有一些典型的攻击方式,下面通过一个例子来说明SQL 注入攻击的过程。以下是一个Web 系统中的部分代码:

String uID;

String sQuery;

uID=request.getParameter(“userCode”);

sQuery= “ select username from users where userid=’”+uID+”’”;

用户利用http://infoweb.com/username.do?user Code=mycode 进行查询工作,

Web 系统将获得的用户输入的参数传入数据库并执行如下的SQL 语句:

select username from users where userid=’mycode’

这是一次正常的查询操作,通过用户ID 查找对应的用户名。但由于参数值没有进行任何处理,攻击者通过嵌入附加SQL 语句的方式来修改查询字符串的值,从而改变原先的语句表达逻辑,例如:http://infoweb.com/username.do?userCode=mycode‘;delete from users;--。

此时WEB 系统将获得的用户输入的参数传入数据库后,数据库将执行如下3 条SQL 语句:

select username from users where userid=’mycode’;

delete from users;

--‘

可以看出,“;”和“--”字符终止了当前的SQL语句和,结合添加的注释将原来正常的SQL 查询语句修改成3 条SQL 语句,其中第二条SQL 语句将user表中的数据全部删除。造成这种情况的原因是攻击者利用代码缺陷重新构造了SQL 语句,导致原有的逻辑变为查询users 表并删除users 表中的数据,给数据的所有者造成巨大的损失。

1.2 典型的SQL 注入攻击语句

SQL 注入攻击语句具有灵活多变的特点,因此,需要通过分析大量的攻击语句来归纳总结这些语句的特征。以下是3 种最常见的完成某项攻击目的的语句的特征:①判断注入点存在与否。攻击者嵌入“and 1=1”返回正确页面,嵌入“and 1=2”返回错误页面,则说明此处大概率存在注入点。输入and 1=1,and 1=2。②猜测数据库表名。攻击者嵌入语句后返回正常页面,则说明数据库中存在该表。and 0<>(select count(*)from userinfo) ---判断是否存在userinfo 这张表。③猜解库表中字段。攻击者嵌入语句后返回正常页面,则说明库表中存在相应的字段。输入and 0<>(select count(username) from userinfo) ---猜测userinfo 这张表中是否存在username 这个字段。

1.3 SQL 注入攻击的防御手段

采用预编译技术。使用预编译的SQL 语句进行参数化查询,将带“?”的SQL 语句发送给DBMS(Database Management System,数据库管理系统)完成解析、检查、编译等工作,再把实际值赋给“?”,最后将“?”这个变量传给SQL 语句。预编译技术能够有效防范恶意攻击者利用拼接SQL 语句产生的漏洞进行的SQL 注入攻击。

严格控制数据类型。对强类型语言中一般不存在数字型注入,因为接收数字时,大多都会进行整型(int)数据类型转换。对于弱类型语言需要进行数字类型检查,防止数字型注入。

对特殊字符进行转义。手动或者利用安全函数对诸如“‘”“#”等特殊字符进行转义,防止恶意攻击者利用特殊字符闭合SQL 语句达到SQL 注入的目的。

上述技术手段的使用在很大程度上能够有效防范SQL 注入攻击,但在实际过程仍存在着以下困难:①不能动态地防范SQL 注入攻击。如果Web 系统上线后才发现仍然有部分SQL 注入攻击语句能够发生作用,那就说明系统代码中还存在着未检查出的SQL 注入攻击漏洞,这时为了安全起见必须中断Web 系统的正常运行并立刻对原有代码进行修改后使之生效,在此期间由于系统中断不可避免地会带来一定的损失。②对现存的大量Web 应用不适用。目前互联网上仍存在着成千上万的早期开发的Web 系统,受限于当时的技术水平,这些Web 系统中或多或少存在着一些SQL注入攻击漏洞,如果将这些系统的源代码进行一一修改,那耗费的人力和时间是不能接受的。

通过以上分析可知,传统的防范SQL 注入攻击手段存在着不足之处。鉴于此,本文提出将NDIS 中间层驱动技术应用到防SQL 注入攻击中,通过对发往Web 系统的HTTP 数据报进行分析,判断其中是否存在SQL 注入攻击行为,对攻击行为采取相应的防御措施。此技术最大的优势在于检测和防御期间不需要暂停Web 系统的运行,同时也不需要对Web 系统本身的代码做任何修改。

2 NDIS 中间层驱动

2.1 NDIS 中间层驱动工作原理

NDIS 的全称为网络驱动程序接口规范,在数据链路层、网络层和传输层均给出了详细的通信接口规范,如图1 所示。

图1 NDIS 驱动在Windows 中的位置

NDIS 提供了一个完整的开发环境,程序员只需要利用NDIS 提供的函数就能够顺利编写出满足自身业务需求的网络驱动程序[3]。

NDIS 对以下3 种网络驱动程序提供支持:①网卡驱动程序,又称为微端口驱动程序,负责将接收到的数据包转发给上层驱动程序和接收来自上层驱动程序发过来的数据包。②中间驱动程序,又称为NDIS 中间层驱动,它位于网卡驱动程序和协议驱动程序之间,既向网卡驱动程序展现协议特性,又向协议驱动程序展现小端口特性。因此网卡驱动程序把它看作协议驱动程序,协议驱动程序把它看作网卡驱动程序,中间驱动程序对于这二者来说是透明的。③协议驱动程序。实现并执行具体的诸如TCP/IP/IPX/SPX 等网络协议,对网卡驱动程序或者中间驱动程序发来的数据包进行协议解析。

NDIS 中间层驱动获取来自网卡的原始数据包,NDIS 中间层驱动的工作过程如图2 所示。

图2 NDIS 中间层驱动工作过程图

NDIS 中间层驱动工作在网卡驱动程序的MINIPORT 接口和协议驱动程序的PROTOCOL 接口之间,向下导出一个PROTOCOL 接口与网卡驱动程序交互,向上则导出一个MINIPORT 接口与协议驱动程序交互,这样就将自身透明地插入到了网卡驱动程序与协议驱动程序之间。当网卡驱动程序接收到底层传上来的数据包后,会将数据包从自身的MINIPORT 接口发送到NDIS 中间层驱动的PROTOCOL 接口,NDIS中间层驱动接收到数据包后可以对数据包的内容进行处理,然后将数据包从自身的MINIPORT 接口发送到协议驱动程序的PROTOCOL 接口,这样NDIS 中间层驱动就完成了一次数据包的传递工作。

由于从零开发一个完整的NDIS 中间层驱动是一件复杂且难度很高的工作,因此Windows 驱动开发工具WINDDK 自带了名为PASSTHRU 的开发框架,它作为NDIS 中间层驱动的一个实例,完成了一个NDIS中间层驱动所应具有的基本功能,程序员只需在此框架上添加合适的代码就能很容易地开发出满足特定功能的NDIS 中间层驱动。

2.2 PASSTHRU 中数据包的获取

PASSTHRU 框架中的 PtReceive 函数和PtReceivePacket 函数负责完成接收数据包的工作,接收到的数据包存放在一个或多个名为NDIS_BUFFER的结构体中,其中每个结构体记录了数据包的一部分内容及数据包内容的结构体的地址。因此程序员在这2个函数中添加适当的代码,通过顺序遍历数据包对应的所有结构体就可以获取到NDIS 中间层驱动接收的数据包的内容。以下是PtReceivePtReceivePacket 函数中添加的获取数据包的关键代码:

NdisQueryPacket(Packet,&PhysicalBufferCount,&B ufferCount,&NdisBuffer,&TotalPacketLength);

NdisAllocateMemory(&MyBuffer,4096,0,HighestA cceptableMax);

NdisZeroMemory(MyBuffer,4096);

NdisQueryBufferSafe(NdisOwnBuffer,&TmpBuffer,

&CpySize,NormalPagePriority);

NdisMoveMemory(MyBuffer,TmpBuffer,CpySize);

Offset=CpySize;

while(1)

{

if(NdisOwnBuffer==Packet->Private.Tail)

break;

NdisOwnBuffer=NdisOwnBuffer->Next;if(NdisOwnBuffer==NULL)

break;

NdisQueryBufferSafe(NdisOwnBuffer,&TmpBuffer,&CpySize,NormalPagePriority);

NdisMoveMemory(MyBuffer +Offset,TmpBuffer,CpySize);

Offset+=CpySize;

}

经过以上处理,MyBuffer 中存放了NDIS 中间层驱动接收的数据包的副本,数据包获取工作完成。

3 SQL 注入攻击的检测和防御

3.1 数据包的解析

由于SQL 注入攻击语句是通过HTTP 数据报提交给服务器的,因此需要对之前的MyBuffer 中的内容进行解析,判断获取的数据包中是否携带了HTTP 数据报,作为是否进行后续的SQL注入攻击检测工作的依据。

解析数据包的关键在于获取数据包中携带的数据报首部信息。如果通过解析,数据包中包含了IP 首部、TCP 首部及TCP 首部中目的端口号字段为80,则数据包中携带了HTTP 数据报,接下来将对HTTP 数据报进行解析。以下是NDIS 中间层驱动中解析数据包的关键代码:

if(MyBuffer[12] == 0x08 && MyBuffer[13] ==0x00 && MyBuffer[23] == 0x06 &&MyBuffer[14+ipheaderlen+2] == 0x00 &&MyBuffer[14+ipheaderlen+3]==0x50)

3.2 HTTP 数据报的解析

HTTP 数据报携带了客户端提交给服务器的数据,这些数据中可能包含SQL 注入攻击语句,因此需要通过解析HTTP 数据报获取客户端提交的数据。HTTP数据报的请求方法有“GET”和“POST”。根据HTTP数据报协议,如果请求方法为“GET”,则提交的数据包含在URL 部分;如果请求方法为“POST”,则提交的数据包含在请求数据部分,如图3 所示。

通过解析HTTP 数据报可以获得客户端提交的数据,接下来将对提交的数据进行SQL 注入攻击检测。

图3 HTTP 数据报

3.3 基于正则表达式的SQL 注入攻击检测技术

正则表达式实际上是一种逻辑公式,它表达的是匹配字符串的逻辑,即通过组合事先定义好的特定的字符构建一个“规则表达式”,然后利用这个“规则表达式”完成对字符串的匹配工作。正则表达式有基本元字符、次数元字符、位置元字符和特殊元字符这几类常见元字符,利用这些元字符以及适当的普通字符可以构造出用以描述SQL 注入攻击语句的正则表达式。常见的SQL 注入攻击语句及其正则表达式如表1 所示。

表1 常见的SQL 注入攻击语句及其正则表达式

一旦这些事先定义好的SQL 注入攻击语句的正则表达式匹配到了客户端通过HTTP数据报提交的数据,则说明数据中嵌入了SQL 注入攻击语句,此时HTTP数据报将被NDIS 中间层驱动丢弃,从而达到了保护Web 系统免遭攻击的目的。

4 结束语

本文首先介绍了SQL 注入攻击和NDIS 中间层驱动的工作原理,之后对NDIS 中间层驱动如何运用在SQL 注入攻击的检测和防御方面进行了详细描述,具有一定的参考价值。

猜你喜欢

中间层驱动程序网卡
一种十七股子午胎钢丝帘线
Server 2016网卡组合模式
计算机硬件设备驱动程序分析
镍基高温合金TLP扩散焊中间层材料研究进展
B含量对IC10合金TLP焊接用中间层材料及接头组织的影响
挑战Killer网卡Realtek网游专用Dragon网卡
读编往来
无线网卡种类有什么区别?
基于MPC8280的CPU单元与内部总线驱动程序设计
栅格中间层数据在数字地形分析中的应用