基于机器学习的Web应用漏洞分析与预测系统,使用django框架,三种机器学习模型
1 引言
1.1 研究背景
信息技术的发展,Web应用成为现代互联网生态系统的主体,Web应用在给用户带来便利服务的同时,也在面临着各种复杂的安全问题。随着移动设备的发展,越来越多的Android等系统上的应用涌现出来,安全问题同样严重。近几年,黑客的攻击手段层出不穷,大量的Web应用和移动应用因设计缺陷和漏洞而未及时修复,都成为黑客攻击的目标。安全问题不仅对用户的隐私、数据安全带来威胁,也损害了企业的品牌形象,造成严重经济损失,如何有效地检测和预测Web应用漏洞成为目前信息安全面临的重要挑战问题。
1.2 国内外研究现状
1.2.1 国内研究现状
随着近年来互联网技术的急速发展,在网络安全问题上面越来越多的研究通过对各种网络安全漏洞问题进行分析预测提出各种系统架构以及相关技术方案来保护用户的数据以及提升系统安全性。目前对于各种安全漏洞进行分析预测的系统大概分为以下几种架构与技术:
1.1基于C/S架构的系统
部分老牌的安全漏洞扫描工具采取了客户端/服务器(C/S)模式,用户要自行安装客户端程序在本地运行,这类系统使用和维护相对复杂,且占用了用户系统的资源。
1.2基于B/S架构的系统
B/S架构的漏洞扫描系统相比于C/S架构的漏洞扫描系统更便于用户使用,用户只需使用浏览器连接到服务器,而不需要安装软件。
1.3机器学习和数据挖掘技术
目前,也有多学者着手研究将机器学习和数据挖掘技术应用于检测漏洞中,从检测的结果来提高漏洞检测的准确性,研究使用支持向量机、回归模型等多种方法来实现软件度量、文本特征等进行分析,并精确预测漏洞分布情况及类型。
1.4网络知识图谱
也有一些研究构建了网络安全知识图谱,支持漏洞预测以及防御方案生成。这些网络安全知识图谱包含大量的网络安全数据,在漏洞利用行为的预测过程中提供了重要的信息支撑。例如徐金瑜[6]研究信息安全漏洞数据挖掘,基于领域本体的构建,利用本体方法驱动数据挖掘过程,挖掘潜在有用信息,提出了关联规则和时序预测建模方法。
虽然这些研究成果在漏洞检测与预判方面有了一定的突破,但是,存在很多问题。比如很多系统的实时性、更新等都不具备,其对新攻击的应对能力不强[7]。还有基于传统规则的检测方法,其在准确性和适应性方面有局限,有待于在智能化与自动化方面进一步优化和创新。
1.2.2 国外研究现状
国外对安全漏洞分析预测系统进行的研究也较多,尤其是针对Web应用程序的系统研究。AlghawaziMaha、AlghazzawiDaniyal[11]和AlarifiSuaad的研究都针对SQL注入攻击展开,表示SQL注入攻击将对数据库的机密性、完整性和可用性造成极大的威胁。AlghawaziMaha等人综述了不同的机器学习和深度学习模型对检测SQL注入攻击的应用,并指出人工智能可以用于提升SQL注入检测能力。
对国内外的研究总结发现,国外和国内的研究者均对安全漏洞分析与预测系统感兴趣,对SQL注入与XSS等漏洞展开研究,但是已有的系统均是对新型攻击适应差、仅对已知漏洞进行分析和依赖大量的测试字典等缺陷,导致系统效率低、资源浪费。为此,本文系统整合了多种机器学习算法,包括深度神经网络(DNN)、支持向量机(SVM)、KNN,并使用集成学习方法,根据数据类型灵活地选择最优的机器学习算法,并在不同情况适应不同的场景,同时使用爬虫更新漏洞特征的数据库。
1.3 研究内容
本研究通过python爬虫从国家信息漏洞共享平台中web应用漏洞数据,包括漏洞名称、公开日期、漏洞描述、漏洞类型等信息,通过数据处理,提取不同类型的漏洞描述的文本特征,通过卡方检验或者信息增益方式筛选出特征,构建训练的特征集,使用深度学习dnn、k近邻算法、svm算法进行训练调优,利用交叉验证和超参数优化提高模型的性能,选择最优算法进行漏洞预测,具体内容如下:
1、数据收集与预处理:收集大量的Web应用漏洞数据,进行数据清洗、去重、缺失值处理和数据规范化,以确保数据质量和一致性。
2、特征工程和特征提取:从原始数据中挖掘描述和表达安全漏洞的重要特征,通过特征选择算法(相关性分析、递归特征消除、卡方检测、信息增益等)去除不具有重要描述作用的特征,得出良好的特征组合。
3、选取与训练机器学习模型:对多个机器学习算法(如k近邻算法、支持向量机SVM、深度神经网络DNN等)在漏洞检测中的使用情况进行实验,对模型进行训练与训练,采用交叉验证和超参数调整等提高模型性能。
4、模型集成与优化:运用集成学习方法(如堆叠、投票和Boosting)将不同的模型的预测信息集合起来,实现整体的预测精度优化,研究模型的自适应机制,对新数据和新的攻击模型进行动态优化。
5、漏洞挖掘与预测:对Web应用漏洞进行挖掘与预测,综合考虑机器学习模型的输出结果,挖掘出攻击模式,分析漏洞导致原因,给出漏洞修复建议、漏洞优化建议等。
6、搭建漏洞分析预测系统:设计可视化界面,直观展示漏洞分析结果和预测功能。
7、系统测试及测评:对系统进行功能测试、性能测试、安全测试等综合测试,比较实验系统的漏洞检测和预测的准确性和效率,使系统稳定并具有实用性。
2 相关技术
2.1 爬虫技术
基于机器学习的Web应用漏洞分析预测系统的漏洞采集模块采用爬虫技术对公开数据源实施大量漏洞的高效获取。
2.3 TF-IDF技术
TF-IDF(词频-逆文档频率)是一个通常使用的自然语言处理领域的加权统计方法,常被用于信息检索与文本挖掘,如网页搜索及关键词抽取。
TF-IDF得到广泛应用,并且效果良好,比如被用于文本分类,对于信息检索技术,使用TF-IDF提取文本关键词,即最能体现文档主题或类别的词。如在搜索引擎中,搜索排名的权重是将文章中包含的关键词对文章重要性的排名进行量化计算,即通过TF-IDF对关键字在网页中的重要性进行评估,根据用户搜索关键词的不同显示和筛选相应的网页。
2.3 机器学习算法
2.3.1 朴素贝叶斯算法
朴素贝叶斯(NaiveBayesian)是一种基于贝叶斯定理的分类技术,通常用来处理二元分类或多元分类等问题。
2.3.2 KNN算法
K最近邻算法(K-NearestNeighbors,简称KNN)是一种基于实例的监督分类方法,其核心是依据测试实例与训练数据集中K个距离最近的实例的类标记来确定测试实例的类别。
KNN是一种有监督学习方法,训练的时候需要有标签的数据,而与之不同的是K-means为一种无监督学习方法,这种算法主要用来对数据聚类。
2.3.3 SVM算法
支持向量机(SVM,即SupportVectorMachine)是一种用于分类问题的监督机器学习算法,它以最大化间隔为目标来寻找最优的分离超平面,把不同的分类样本分开。SVM的核心思想就是利用给定训练数据找出一个最优的超平面,以分离距离它最近的样本,其中间隔为超平面与距离最近的样本点的距离。SVM能够通过增加间隔提高模型的泛化能力以求对未知数据进行更准确地预测。
2.3.4 深度学习DNN算法
深度神经网络(DNN)是一种神经元层组成机器学习模型进行复杂模式识别与预测任务的机器学习方法。深度神经网络通过利用前向与反向算法训练,可对数据进行有效建模。
正
2.4 Django框架
基于机器学习的Web应用漏洞分析预测工具后端一般采用Django框架。Django是Python编写的、开放开源的Web框架,强调快速应用开发、精简的设计,采用MVC(MODEL-VIEW-CONTROLLER)模型,实际中表现为MVT(Model-View-Template),应用逻辑、DB模型、用户界面相互独立,易于维护和拓展。
3 系统需求分析
本章主要是提出基于机器学习的Web应用程序漏洞分析预测系统的功能需求。采用文献研究和专家咨询的方式提出系统基本功能需求,然后结合高校网络安全管理相关工作从业者的意见和行业实际工作中的经验总结系统需求,以期对Web应用程序漏洞检测和预测提供在实战中应用的系统。
3.1 功能需求
系统的核心功能是分析Web应用的漏洞,基于机器学习算法进行漏洞预测。主要功能模块包括:
数据收集模块:从国家计算机安全漏洞数据中心中使用python爬虫收集web应用漏洞信息,包括漏洞发现时间、漏洞类别、等级、漏洞描述等,为漏洞预测提供原始数据。
特征抽取模块:对采样的数据进行预处理,采用TF-idf算法,对漏洞的特征进行抽取,形成用于机器学习建模训练的数据集。
漏洞预测模块:利用机器学习算法决策树、支持向量机、深度学习,对特征数据进行训练与预测,识别出漏洞类型。
输出结果:根据预测结果,可视化呈现预测结果,可以呈现成图表的形式,或者呈现成报告的形式,帮助用户了解漏洞的严重程度以及该漏洞的类型。并且还囊括不同的漏洞分析类型,例如,SQL注入,跨站脚本(XSS)及文件上传漏洞等等。
3.2 系统架构
系统采用B/S模式,由WEB界面、后台服务与数据库组成,WEB界面用于用户操作界面,后台服务处理机器学习模型训练和预测,数据库存储数据与分析结果。机器学习模型通过预测结果的循环训练不断优化。
前端界面:基于Boostrap的用户界面,展示漏洞检测结果、报告、图表等。
后端服务:采用Django框架实现,负责接收请求、调用机器学习模型、处理数据和返回结果。
数据库:用于存储系统收集的数据、分析结果,如下图所示。
图3-1 数据据流程图
3.3 用户需求
系统设计应支持不同类型的用户角色,以便根据其不同的权限和需求提供相应的功能。主要用户角色包括:
管理员:
权限管理:能够创建、删除、管理不同用户角色,设置用户访问权限。
系统配置与管理:对系统的整体设置、机器学习模型的更新与优化进行管理。
网络安全人员:
漏洞检测与分析:能够启动对特定Web应用的漏洞类型分析,查看分析结果。
漏洞可视化分析对漏洞详情查看详细的漏洞类型信息,进行多种漏洞分析,例如SQL注入漏洞分析、XSS跨站脚本漏洞分析、文件上传漏洞分析,并生成可视化分析报告。
漏洞查询:可以根据关键词进行模糊搜索,找到漏洞信息。
漏洞预测:利用机器学习模型深度神经网络等,进行漏洞检测与预测,识别Web应用中的漏洞类型,快速归类修复漏洞。
3.4 设计流程
在Web应用漏洞分析预测系统的流程中,首先使用网络爬虫国家计算机安全漏洞数据中心漏洞数据,网站的数据有些是需要下载xml文件提取,有些的需要登录验证采集,本研究则只针对下载xml文件进行提取漏洞信息。
对于系统会在预测界面预先输入的需要识别的漏洞描述,在漏洞的判断上会显得更加轻松,在web应用漏洞描述中,由于安全检测人员对漏洞描述带有很多专业术语,所以在采集数据后进行的预处理操作中,去除冗余信息,抽取关键特征,例如用户输入、HTTP请求类型、URL、请求参数、响应代码等。这些特征将用于漏洞检测模型的训练。特征提取过程中,特别注意提取可能影响系统安全性的关键数据,像是SQL查询字符串、跨站脚本(XSS)攻击路径、文件上传参数等。
针对历史的漏洞记录,系统将通过标注、漏洞库或漏洞数据库(如CVE)对数据进行标签化。标签的形式包括“漏洞类型”(如SQL注入、XSS攻击、CSRF等)。最后将标注好的数据进行使用支持向量机、深度神经网络等进行训练,通过评估参数准确率、混淆矩阵等,分析不同模型的效果,从而帮助安全检测人员选择最好的模型进行检测,以便识别和预测出现的漏洞类型。
4 系统详细设计
4.1 数据采集设计
CNVD是漏洞采集中最显著的特点在于其只能够通过登录注册账号,下载漏洞信息xml文件数据,故此次采集实现是由requests库模拟浏览器发送Http请求,在CNVD漏洞平台下载页获取漏洞数据文件,其中文档类型是xml格式设计的流程如下图所示。
图4-1 设计流程图
4.2 模型算法设计
4.2.1 漏洞类型标注
数据标注以关键词匹配及替换为主要手段,将漏洞描述文本与具体的漏洞类型标签结合起来。通过定义一组漏洞类型的关键词(如“SQL注入”、“缓冲区溢出”、“跨站脚本”等),对每一个关键词对应一种漏洞类型;利用正则表达式和关键词匹配进行漏洞描述文本与漏洞类型对应关系的自动标注,为机器学习提供标注好的训练数据。该标注方法能快速为大量文本数据加标签,应用该方法于基于文本数据的漏洞分类任务中,节省大量的人工标注工作。标注结果如下表:
表4-1 数据标注表
时间 | 标注类 | 描述 | 等级 |
2023-12-06 | 输入验证 | Pexip Infinity存在输入验证错误漏洞,攻击者可利用该漏洞通过RTP暂时终止软件 | 中 |
2023-12-04 | 跨站脚本 | KonaWiki3存在跨站脚本漏洞。攻击者可通过特制URL利用该漏洞在用户的Web浏览器上执行任意脚本 | 中 |
4.2.2 文本预处理
文本数据从原始的漏洞描述文本被逐步转化为适合机器学习模型处理的数值化数据。包括分词、词性还原、停用词过滤、特征提取、文本向量化和标签向量化这几个部分。其中:
最后信息增益。通过计算每个特征的信息增益,返回每个特征的信息增益值,进而选择最有用的特征用于分类任务。通过这种方式选择最能区分数据集的特征。最终向量化后得到如下图向量表:
4.2.3 划分数据集
划分数据集的方式为使用文本向量化数据集(data_vec)和对应标签(label_vec)划分出训练集和测试集,具体划分方式为使用数据集前40000数据为训练集(trainset和trainlabel),数据集后面数据(第40000条数据开始)为测试集(testset和testlabel),是采用简单的索引切分完成,其中data_vec[:40000],label_vec[:40000]为训练集,data_vec[40000:],label_vec[40000:]为测试集。
4.2.4 模型构建与训练
(1)朴素贝叶斯模型构建:朴素贝叶斯是一种基于贝叶斯定理的概率分类算法,假设特征之间是条件独立的。算法的是通过系统输入的漏洞描述数据,估计属于哪个类别 的概率,选择概率最大的类别作为预测结果。
(2)Svm模型构建:SVM是一种监督学习算法,主要用于分类和回归任务。其核心思想是通过寻找一个最优超平面,将不同类别的数据进行分离。该超平面满足以下两个条件:1、最大化类别间的间隔(margin);2、减少分类错误点的数量。对于非线性可分的数据,SVM通过核函数将数据映射到更高维空间,在高维空间中找到线性可分的超平面。模型结构如下图所示:
图4-2 模型结构图
训练流程如下图所示:
图4-3 训练过程图
4.2.4 模型性能评估
模型性能评估主要包括混淆矩阵、F1值、精准度、准确率这几个参数指标,如下表为不同模型的评估结果。
表4-2 各个模型评估结果
模型 | 准确率 | Precision | Recall | F1 score |
KNN模型 | 0.91318 | 0.91 | 0.91 | 0.91 |
svm模型 | 0.89848 | 0.91 | 0.9 | 0.89 |
朴素贝叶斯模型 | 0.89214 | 0.89 | 0.89 | 0.89 |
DNN模型 | 0.93012 | 0.92 | 0.92 | 0.92 |
在分类任务中,四种机器学习模型的性能评估结果显示(表4-2),DNN模型综合表现最优,其准确率(93.01%)、精确率(0.92)、召回率(0.92)及F1值(0.92)均位列首位,表明其在分类任务中具有较高的鲁棒性与平衡性。KNN模型次之,准确率为91.32%,其余指标均为0.91,虽略逊于DNN但性能均衡;SVM模型精确率(0.91)与KNN持平,但召回率(0.90)和F1值(0.89)稍低,可能受限于类别分布不均衡问题;朴素贝叶斯模型整体表现较弱(准确率89.21%,其余指标均为0.89),但其计算效率较高,适用于资源受限场景。综合而言,若侧重模型综合性能,DNN为首选;若需平衡效率与精度,KNN与SVM可作为备选方案,而朴素贝叶斯则适合轻量化需求场景。如表4-2 各个模型评估结果所示。
4.3 数据库设计
设计数据库最主要的目的就是方便人员的操作与管理,通过合理的字段进行设计,对数据库的各个表之间进行合理的设计,包括需要使用到的主、外键。系统中所具备的功能就是具备关键词模糊查询的功能,所以在进行数据库设计时,就需要尽量精准,考虑各数据所处的关系,从而得到更好的查询效果。
表4-3 用户表
字段 | 类型 | 大小 | 是否为空 | 主键 |
id | INTEGER | 0 | True | 是 |
password | varchar | 128 | True | |
last_login | datetime | 0 | False | |
is_superuser | bool | 0 | True | |
first_name | varchar | 150 | True | |
last_name | varchar | 150 | True | |
varchar | 254 | True | ||
is_staff | bool | 0 | True | |
is_active | bool | 0 | True | |
date_joined | datetime | 0 | True | |
username | varchar | 50 | True | |
gender | varchar | 1 | True | |
phone_number | varchar | 20 | True | |
avatar | varchar | 100 | False |
表4-3为用户表结构设计,包含用户基本信息和系统属性相关字段。该表主键为`id`(INTEGER类型),但标注允许为空,存在设计矛盾;`password`(varchar(128))与`username`(varchar(50))等关键字段允许为空,可能影响数据完整性与安全性。必填字段仅包括`last_login`(datetime)和`avatar`(varchar(100),或强制默认头像路径),其余如`email`(varchar(254))、`phone_number`(varchar(20))、`gender`(varchar(1))等均可为空,反映系统对用户信息采集的灵活性。布尔类型字段`is_superuser`、`is_staff`、`is_active`及时间字段`date_joined`(datetime)均允许空值,可能隐含默认状态逻辑。需注意主键空值、密码非强制等设计可能偏离数据库规范化原则,需结合具体业务场景评估其合理性。如表4-3 用户表所示。
表4-4数据表
字段 | 类型 | 大小 | 是否为空 | 主键 |
id | int | 0 | True | 是 |
cn_url | varchar | 255 | False | |
cn_title | varchar | 255 | False | |
pub_date | varchar | 255 | False | |
hazard_level | varchar | 50 | False | |
cn_impact | text | 0 | False | |
cnvd_id | varchar | 50 | False | |
cve_id | varchar | 50 | False | |
cn_types | varchar | 100 | False | |
cn_describe | text | 0 | False |
该数据表设计用于存储安全漏洞的详细信息,主要包含以下字段:`id`(主键,但需注意其允许为空的设计矛盾)、`cn_url`(漏洞链接,255字符)、`cn_title`(漏洞标题,255字符)、`pub_date`(发布日期,建议改用日期类型以优化查询效率)、`hazard_level`(危险等级,50字符)、`cn_impact`(影响范围,长文本)、`cnvd_id`(国家漏洞库编号,50字符)、`cve_id`(国际漏洞编号,50字符)、`cn_types`(漏洞类型,100字符)及`cn_describe`(详细描述,长文本)。所有字段均不可为空(`id`除外),确保了数据的完整性,但需注意主键设计和日期字段类型的潜在问题。该表适用于安全漏洞管理系统的数据存储需求,支持对漏洞信息的高效记录与查询,为学术研究或实际应用中的漏洞分析提供结构化数据基础。如表4-4数据表所示。
5 系统实现
5.1 登录注册实现
注册与登录功能是在login、register两个视图中实现的。若要访问注册页,则由register视图返回register.html注册页,用户需要提交注册信息,信息中包含用户名、密码和密码确认字段。登录和注册图如图5-1、图5-2所示。
图5-1 登录图
图5-2注册图
5.2 数据查询实现
在前端页面中查询的数据以表格的方式呈现出来。数据是由django的模板引擎渲染返回,比如通过locals()将数据返回模板。由boostrap进行渲染生成表格,如图5-3所示。
图5-3 数据查询实现图
5.3 漏洞类别分析实现
分析漏洞类型,由skill视图处理,通过GET请求,skill视图进行一个SQL查询获取数据库中cnvd表中的所有数据,对获取到的数据进行按漏洞类型分组,同时进行每种漏洞类型数量进行统计,得到分布情况,最后通过render方法,将处理后的数据返回给模板skill.html进行展示,这里可以在前端进行数据展示(图7),比如制作成图表展示等,便于用户快速直观地了解漏洞类型的分布。如图5-4所示。
图5-4 漏洞类别分析实现图
5.4 不同年份漏洞数量分析实现
按照年份分组获取不同年份的漏洞个数分组命令是groupby(df,“发布时间”),“发布时间”指年份,获得的结果是一个Series对象,通过map和values函数可以获取years列中的所有元素,结果是['2017','2018',‘2019’],对应的漏洞的个数可以通过count()方法获取,结果分别是['46',‘45’,‘64'],通过传递render将数据传递给salary.html模板,在该模板中可以使用这些数据绘制柱状图进行可视化分析。通过这些步实现了按年份分析和展示漏洞数量的功能,使得用户能够直观地看到不同年份的漏洞趋势和变化。如图5-5所示。
图5-5 不同年份漏洞数量分析实现图
5.5 不同模型效果对比实现
模型效果对比不同模型效果对比。从数据库中读取存储模型效果数据的表(模型效果)所有记录,把模型名称和准确率作为参数传到mox.html模板。通过render方法渲染页面,由前端显示不同模型的效果对比。以柱状图的形式展示这些数据,用户便于对模型效果进行对比。实现不同模型准确率对比,对用户进行不同模型的效果评估并做出合适的选择。如图5-6所示。
图5-6 不同模型效果对比实现图
5.6 漏洞文本分析实现
对KMeans视图和KMeans聚类算法进行了分析,对用户选择的漏洞类别(opt参数得到的,如“跨站脚本”)进行K-means聚类分析。对描述文本转化为词频矩阵,使用Kmeans进行聚类;根据聚类结果提取每一类“关键词”,作为该类漏洞的典型特征词;聚类完成后,每一类别都有最典型的特征词,并且显示有多少漏洞是属于这个类别的,并以JSON返回,以便在页面上制作图表。如图5-7所示。
图5-7 漏洞文本分析实现图
5.7 漏洞预测实现
漏洞预测使用view:predict,当获取到post请求时,视图从请求中获取用户所传入的数据和模型名称。之后加载所选择的模型进行预测操作,预测结果通过json将结果返回给客户端,主要系统即能够根据用户输入的属性以及选择模型进行漏洞预测,将其结果返回给用户。如图5-8所示。
图5-8 漏洞预测实现