文章编号:2095-6835(2023)15-0101-04
基于Passthru框架的防SQL注入系统的设计
李洋,刘婷
(湖南信息职业技术学院,湖南长沙410200)
摘要:随着Web系统的广泛使用,数据库的安全问题越来越受到人们的关注。在数据库面临的众多安全风险中,SQL (Structured Query Language,结构化查询语言)注入攻击值得重视。在分析SQL注入攻击原理的基础上,设计了基于Passthru框架的防SQL注入系统,该系统能够在不牺牲Web系统响应时间的前提下提供较高的防护能力,具有实用价值。关键词:Web系统;SQL注入攻击;Passthru框架;数据库
中图分类号:TP393.08文献标志码:A DOI:10.15913/jki.kjycx.2023.15.030
spring framework框架漏洞随着Web系统在人们日常生活中扮演着越来越重要的角,作为其重要组成部分的数据库在安全方面也面临着越来越严峻的挑战。各种针对数据库的攻击层出不穷,其中SQL注入攻击是最常见的攻击方式之一[1]。本文针对SQL注入攻击设计了基于Passthru框架的防SQL注入系统,该系统能够根据事先定义好的规则检测客户端发往Web服务器的数据包中是否存在SQL注入攻击语句并采取相应的防御措施,有效地保护数据库的安全。
1SQL注入攻击
SQL注入攻击是几种常见的对数据库进行攻击的手段之一,非法用户利用程序员在编写代码时没有对用户输入数据的合法性进行判断的漏洞,通过提交一段针对性强的数据库查询代码,就可根据程序返回的结果获得想获取的数据[2]。由于SQL注入是从正常的WWW端口访问,表面上看起来与一般的Web页面访问没什么区别,因此部署在网络上的防御设备不会对这种渗透式的攻击发出警报,SQL注入也就很难在第一时间被发现。
SQL注入攻击语句往往具有非常典型的特征,3种常见的SQL注入攻击行为“判断注入点存在与否”“猜测数据库表名”和“猜测库表中字段”,它们对应的特征语句如下。
判断注入点存在与否。攻击者嵌入“and1=1”返回正确页面,嵌入“and1=2”返回错误页面,则说明此处大概率存在注入点。
and1=1
and1=2
猜测数据库表名。攻击者嵌入语句后返回正常页面,则说明数据库中存在该表。
and0<>(select count(*)from userinfo)---判断是否存在userinfo这张表
猜解库表中字段。攻击者嵌入语句后返回正常页面,则说明库表中存在相应的字段。
and0<>(select count(username)from userinfo)---猜测userinfo这张表中是否存在username这个字段
2防SQL注入系统的关键技术
2.1NDIS中间层驱动和Passthru框架
NDIS(Network Driver Interface Specification,微软定义的网络驱动程序接口规范)提供对网卡驱动程序、中间驱动程序和协议驱动程序的支持。其中中间驱动程序又称为NDIS中间层驱动,它工作在网卡驱动程序与协议驱动程序之间,接收网卡驱动程序传上来的数据包进行处理,再将处理后的数据包发送给协议驱动程序,这样就完成了一次数据包的传递工作[3],具体工作过程如图1所示。
图1NDIS中间层驱动工作过程图
在防SQL注入系统中,NDIS中间层驱动用于获DRIVERENTRY
PROTOCOL接口
协议驱动程序
(比如TCP/IP)
DRIVERENTRY
PROTOCOL接口
MINIPORT接口
PROTOCOL接口
中间驱动程序
协议驱动程序
(比如TCP/IP)
网卡驱动程序
MINIPORT接口
中间驱动程序
DRIVERENTRY
MINIPORT接口
网卡驱动程序
MINIPORT接口
PROTOCOL接口
取客户端发送给Web服务器的数据包,后续系统将对这些数据包进行检测,如果数据包中包含SQL注入攻击语句则系统将会自动启动防护措施。
由于从零开发一个完整的NDIS中间层驱动难度较高,因此微软公司提供了名为Passthru的开发框架,该框架作为NDIS中间层的一个实例,完成了一个NDIS中间层驱动所应具有的基本功能,程序员只需在此框架上进行二次开发就可以很容易地开发出满足特定功能的NDIS中间层驱动。
Passthru框架中的PtReceive函数和PtReceivePacket 函数负责完成接收数据包的工作,接收到的数据包存放在一个或多个名为NDIS_BUFFER的结构体中,其中每个结构体记录了数据包的一部分内容,以及下一个记录了数据包内容的结构体的地址。因此,程序员在这2个函数中添加适当的代码,通过顺序遍历数据包对应的所有结构体就可以获取到NDIS中间层驱动接收的数据包的内容。
2.2正则表达式
由于SQL注入攻击语句特征明显,因此可以利用正则表达式及适当的普通字符构造出用以描述SQL注入攻击语句的正则表达式,这些正则表达式将作为SQL注入攻击的匹配规则进行存储。
常见的SQL注入攻击语句及其正则表达式如表1所示。
表1常见的SQL注入攻击语句及其正则表达式攻击语句正则表达式说明
‘\s*'\s*获取数据库返
回的错误信息
and1=1\s*and\s+(\w+)\s*=\s*\1猜测是否有注
入点
and0<>(select count(*)from admin)\s*and\s+0\s*<>\s*\(\s*s
elect\s+count\s*\(\s*\*\s
*\)\s*from\s+\w+\s*\)
猜测数据库表名
一旦客户端发送给Web服务器的数据包中有数据匹配上了这些事先定义好的规则,则说明该数据包中嵌入了SQL注入攻击语句。
3防SQL注入系统的详细设计
3.1系统的总体设计
基于Passthru框架的防SQL注入系统获取发往Web系统的HTTP(HyperText Transfer Protocol,超文本传输协议)数据报进行分析,判断是否存在SQL 注入攻击行为,对攻击行为采取相应的防护措施。该系统由应用层程序和驱动层程序2部分组成,按模块分为基础功能模块、检测功能模块、防护功能模块,系统的总体设计如图2所示。
图2系统总体设计
基础功能模块包括规则管理和日志记录、网络套接字通信、数据库管理。其中规则管理提供对系统中的SQL注入攻击匹配规则进行增删改查的功能,日志记录则将系统遭受的SQL注入攻击的历史记录保存下来;网络套接字通信保证了应用层程序能够获取驱动层程序构造的数据包;由于SQL注入攻击匹配规则是存放在数据库中的,因此数据库管理可以满足应用层程序与数据库之间的交互。
检测功能模块包括数据包获取、数据包解析与构造、SQL注入攻击规则匹配。其中,数据包获取负责捕捉网卡接收到的数据包;数据包解析负责分析数据包是否携带HTTP数据报,因为SQL注入攻击的载体是HTTP数据报,所以系统不会对未包含HTTP数据报的数据包做后续的检测工作,数据包构造则提供在驱动层构造新数据包的功能,而新数据包将被应用层接收并分析其中的关键数据;SQL注入攻击规则匹配提供了将HTTP报文中的关键数据与之前定义好的规则进行匹配的功能,以此判断HTTP报文中是否包含了SQL注入攻击语句。
防护功能模块包括黑名单管理和应用层-驱动层通信。其中,黑名单存放在驱动层程序中,记录了曾经对Web系统进行过SQL注入攻击的主机IP(Internet Protocol,网际协议)地址,被列入黑名单的主机发来的数据包将被NDIS中间层驱动直接丢弃;应用层-驱动层通信则实现了应用层程序与驱动层程序之间的数据交互功能,为黑名单的管理提供支撑。
3.2检测功能模块的设计
检测功能模块是防SQL注入系统的核心模块,只有在该模块中顺利检测出SQL注入攻击才能采取后续的防护手段。检测功能模块工作在驱动层和应用层,包括数据包获取、数据包解析与构造和SQL注入攻击规则匹配,其中数据包获取、数据包解析与构造由驱动层程序完成,SQL注入攻击规则匹配由应用层程序完成。
基于Passthru框架的防SQL注入系统
SQL
注
入
攻
击
规
则
匹
配
数
据
包
解
析
与
构
造
数
据
包
获
取
检测功能模块
数
据
库
管
理
网
络
套
接
字
通
信
基础功能模块
应
用
层
驱
动
层
通
信
黑
名
单
管
理
防护功能模块
规
则
管
理
和
日
志
记
录
3.2.1数据包获取
数据包获取由Passthru框架的PtReceive和PtReceivePacket函数完成,其中添加的关键代码如下:NdisQueryBufferSafe(NdisOwnBuffer,&TmpBuffer,&Cp ySize,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;
}
3.2.2数据包解析
数据包解析的关键在于分析数据包中携带的数据报首部信息。TCP(Transmission Control Protocol,传输控制协议)/IP协议规定,HTTP数据报封装在TCP 数据报内,TCP数据报封装在IP数据报内,IP数据报封装在以太网帧内,因此依次分析数据包内是否包含了IP首部、TCP首部及TCP首部中目的端口号字
段是否为80就能判断数据包是否携带了HTTP数据报,关键代码如下:
if(MyBuffer[12]==0x08&&MyBuffer[13]== 0x00&&MyBuffer[23]==0x06&& MyBuffer[14+ipheaderlen+2]==0x00&& MyBuffer[14+ipheaderlen+3]==0x50)
3.2.3数据包构造
为了将驱动层程序获取的数据包发往应用层程序进行后续的检测工作,必须在应用层程序和驱动层程序之间建立一种通信机制。为此驱动层程序将获取的数据包整体作为数据部分,在前面依次手动添加以太网帧头、IP首部、UDP(User Data Protocol,用户数据报协议)首部,构造出一个新的数据包,如图3所示。
新添加的以太网帧头、IP首部的内容可以用获取的数据包原先携带的以太网帧头、IP首部的内容进行填充,UDP首部中的目的端口号设置为8080并填充相应的UDP长度字段。这样新的数据包被协议层驱动解析处理后,其中的数据部分——获取的数据包将发往8080端口,与此同时应用层程序在8080端口创建一个UDP套接字进行监听,利用套接字函数就可以接收数据包的内容了。
图3新构造的数据包
3.2.4SQL注入攻击规则匹配
应用层程序通过解析接收到的数据包能够获取到其中携带的HTTP数据报的内容,再从HTTP数据报中提取出客户端提交给Web服务器的数据。根据HTTP 数据报协议,客户端提交的数据按照请求行中请求方法的不同会出现在HTTP数据报的不同部分。如果请求方法为“GET”,则数据包含在URL部分;如果请求方法为“POST”,则数据包含在请求数据部分。应用层程序将提取出的数据与事先定义好的SQL注入攻击的匹配规则进行匹配,以此判断数据中是否存在SQL注入攻击语句。
3.3防护功能模块的设计
防护功能模块是防SQL注入系统的另一核心模块,当检测功能模块顺利检测出SQL注入攻击后,防护功能模块将自动启动防护措施,保护Web系统免受SQL注入攻击。
3.3.1防护模型的选择
为了在不牺牲Web系统响应时间的同时还能够提供较高的防护能力,防护功能模块采用基于IP地址的防护模型,如图4所示。该模型的核心思想是将曾经对Web系统进行过SQL注入攻击的主机IP地址加入到NDIS中间层驱动建立的黑名单中,如果接下来NDIS中间层驱动再接收到来自该IP地址的数据包则会直接将它丢弃,这样即可成功防御来自该IP地址的SQL注入攻击。
3.3.2黑名单的设计
黑名单记录了曾经发动过SQL注入攻击的主机的IP地址,是防护功能模块进行防护的依据。防护功能模块采用WinDDK提供的LIST_ENTRY双向循环链表来建立黑名单。LIST_ENTRY是一个结构体,它包含一个前指针和一个后指针,前指针指向链表中上一个LIST_ENTRY结构体,后指针指向链表中下一个LIST_ENTRY结构体。
双向循环链表的基本结构如图5所示。
新构造的数据包
以太网帧头IP首部UDP首部获取的数据包
8080
图4基于IP 地址的防护模型
图5双向循环链表的基本结构
由于LIST_ENTRY 结构体中只有指针,没有数据部分,因此需要自定义一个结构体,该结构体定义了数据部分用于存放IP 地址,同时将LIST_ENTRY 结构体作为其中的一个子域,这样就建立了一个黑名单列表,如图6所示。
图6黑名单列表
3.3.3应用层—驱动层通信
应用层—驱动层通信提供应用层程序与驱动层程
序进行数据交互的功能,该功能的实现依赖于名为IRP 的数据结构和与之映射的派遣函数。在Windows 中,应用层程序通过发送I/O (Input/Output ,输入/输出)请求给驱动层程序,通知驱动层程序发送数据给应用层程序和接收应用层程序发来的数据。此时操作系统将根据I/O 请求的类型将它转化为对应的IRP (I/O Request Package ,输入输出请求包)后交给驱动层程序,驱动层程序则利用与该IRP 建立映射关系的派遣
函数完成对IRP 的处理。通过处理IRP 可以获取IRP 的SystemBuffer 字段,它存放了I/O 控制器分配的系统缓冲区的地址。当应用层程序请求驱动层程序发送数据时,驱动层程序将数据写入系统缓冲区,I/O 系统再从系统缓冲区将数据复制到用户输入缓冲区,这样应用层程序就得到了驱动层程序发来的数据;当应用层程序请求驱动层程序接收数据时,I/O 系统将数据从用户输入缓冲区复制到系统缓冲区,驱动层程序再从系统缓冲区将数据读出,这样驱动层程序就得到了应
用层程序发来的数据。
4结束语
本文针对SQL 注入攻击的特点设计了基于Passthru 框架的防SQL 注入系统。经过部署和测试,该系统能有效阻止SQL 注入攻击,达到了预期的目标。
参考文献:
[1]谭剑.Web 网络及应用运维安全策略研究[J].电子制作,2020(增刊2):74-76,12.
[2]胡海斌.Web 系统中SQL 注入与攻击检测[J].福建电脑,2015,31(8):124-125.
[3]
陆嘉程,向燕冰,王远英.基于微软NDIS 中间层驱动的防火墙在广电信息系统中应用[J].有线电视技术,2019(6):96-98.————————
作者简介:李洋(1988—),男,湖南长沙人,硕士,
中级工程师,专任教师,研究方向为数据库应用与开发。刘婷(1991—),女,湖南常德人,硕士,中级工程师,专任教师,研究方向为无线通信、人工智能。
(编辑:丁琳)
用自定义的结构体
Blink
Blink Data
Data
Blink
Blink
N
Flink Y
将IP 地址添加进黑名单
用自定义的结构体
Flink 用自定义的
结构体
Y
Blink 等待检测功能模块的检测结果
Blink
Flink Data
分析数据包
Flink 结束
开始Flink N
Flink
丢弃数据包
存在SOL 注入攻击?
IP 地址在
黑名单?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论