第三篇—基于黑白样本的webshell检测

2024-06-16 16:20

本文主要是介绍第三篇—基于黑白样本的webshell检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  本篇为webshell检测的第三篇,主要讲的是基于黑白样本的webshell预测,从样本收集、特征提取、模型训练,最后模型评估这四步,实现一个简单的黑白样本预测模型。
  若有误之处,望大佬们指出

Ⅰ 基本实现步骤

  1. 样本收集:首先,你需要收集大量的黑样本(恶意的webshell)和白样本(正常的web文件)。这些样本将用于训练和测试你的检测模型。
  2. 特征提取:对于每一个样本,你需要提取出对于webshell检测有用的特征。这些特征可能包括文件的大小、文件的修改时间、文件中包含的特定字符串等等。
  3. 模型训练:使用你收集的样本和提取的特征,你可以训练一个机器学习模型来进行webshell检测。这个模型可能是一个决策树、随机森林、支持向量机、神经网络等等。
  4. 模型评估:在模型训练完成后,你需要对模型的性能进行评估。这通常包括计算模型的准确率、召回率、F1值等指标。

关于样本收集过程,需要注意的地方

  • 选取合适的正常样本和恶意样本进行降噪、向量化与随机抽样
  • 其优点是具备不错的未知威胁检测能力,其缺点是对样本要求较高。

Ⅱ 样本收集

黑样本
  直接搜github,搜集近2000+webshell文件,进行数据清洗,最后只得到了525个php的webshell,样本有点少了

白样本
  常见的CMS框架:WP、帝国、极致、TP等等
注意:在这里,收集的白样本,小版本迭代的CMS可以不收集,里面存在大量的重复,我是直接收集大版本的源码
下面是我收集的白样本以及下载地址,近4w个左右
[图片]

  • https://github.com/phpmyadmin/phpmyadmin/tree/MAINT_4_0_10
  • https://github.com/smarty-php/smarty/tree/v2.6.32
  • https://github.com/yiisoft/yii2/tree/2.0.32

接下来就是——样本清洗
白样本清洗大致思路

  1. 删除无关文件:你可以删除那些与webshell检测无关的文件,例如图片、音频、视频等非代码文件。
  2. 删除重复文件:如果你的白样本中存在大量的重复文件,那么这些文件可能会对你的模型产生过拟合的影响。因此,你需要删除这些重复的文件。
  3. 代码格式化:为了使得你的模型能够更好地理解代码的结构,你可以对代码进行格式化,例如删除多余的空格和注释,统一代码的缩进和换行等。
  4. 提取代码特征:你可以提取代码的一些特征,例如函数的数量、变量的数量、代码的长度等,这些特征可以帮助你的模型更好地理解代码。
  5. 标记样本:为了训练你的模型,你需要给你的白样本打上标签,表示这些样本是正常的web文件。
    在这里插入图片描述

  黑样本清洗大致思路,样本有点少,清洗流程主要都是去空格、去注释、去重、去空白文件。

Ⅲ 特征提取

通过两种方式:词袋模型或者opcode模型训练,再配合上TF-IDF

TF-IDF是啥?
  这是一种统计方法,用来评估一个词对于一个文件集或语料库中的其中一份文件的重要程度,字词的重要性随着它在文件中出现的次数成正比增加, 但是同时也会随着它在语料库中出现的频率成反比下降。

  1. 词袋模型 + TF-IDF模型训练
    基本流程
  • 合并黑白样本
  • 计算TF-IDF值,并保存模型
def calculate_tfidf(self):# 合并黑样本和白样本samples = self.black_samples + self.white_samples# 计算TF-IDF值vectorizer = TfidfVectorizer(max_features=1000)self.features = vectorizer.fit_transform(samples)# 保存TF-IDF值模型joblib.dump(vectorizer, os.path.join(self.config_dir, "tfidf_model.pkl"))# 为黑样本和白样本生成标签self.labels = [1]*len(self.black_samples) + [0]*len(self.white_samples)# 保存特征和标签np.savez(os.path.join(self.config_dir, 'features_labels.npz'), features=self.features.toarray(), labels=self.labels)print(f"有效的样本总数:{len(samples)}")

最终需要形成一个特征文件,作为后续预测使用
采用词袋模型算法,计算出的样本数量 1w个
[图片]

【留下疑问】

  • 这个特征文件有什么用
  • 最后需要怎么进行评分模型处理
  • 如何提高一个预测的正确率

Ⅳ 预测模型生成

  拿到这个特征文件后,需要将黑样本标记为1,白样本标记为0,然后用以下算法,生成预测模型

  • 第一种是朴素贝叶斯算法,
  • 第二种是随机森林

用python写了两个算法的实现逻辑
【随机森林实现】

# 加载特征和标签
data = np.load('config/features_labels.npz')
features = data['features']
labels = data['labels']# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)# 输出矩阵数量
print(f"训练集的矩阵形状:{X_train.shape}")
print(f"测试集的矩阵形状:{X_test.shape}")
# 创建并训练随机森林模型
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train, y_train)# 保存随机森林预测模型
joblib.dump(clf, "config/rf_model.pkl")
# 预测测试集
y_pred = clf.predict(X_test)# 计算并打印检出率(召回率)和精确率
recall = recall_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)

朴素贝叶斯生成预测模型

data = np.load('config/features_labels.npz')
features = data['features']
labels = data['labels']# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)# 输出训练集和测试集的矩阵形状
print(f"训练集的矩阵形状:{X_train.shape}")
print(f"测试集的矩阵形状:{X_test.shape}")# 创建并训练朴素贝叶斯模型
clf = MultinomialNB()
clf.fit(X_train, y_train)# 预测测试集
y_pred = clf.predict(X_test)# 计算并打印检出率(召回率)和精确率
recall = recall_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)

以下是其预测结果
[图片]

Ⅴ 实战预测

利用训练好的模型,进行预测处理

    # 词袋模型tfidf_model = joblib.load('config/tfidf_model.pkl')# 随机森林预测模型rf_model = joblib.load('config/rf_model.pkl')# 预处理代码with open(file_path, 'r', errors='ignore') as f:code = f.read()code = preprocess_code(code)# 提取特征features = tfidf_model.transform([code])# 预测pred = rf_model.predict(features)

[图片]

效果没预期的那么好
这里会有一个问题,如果内容上不是携带有php文件的标签的,如"<?php>",就会默认评判会webshell
如下面所示
在这里插入图片描述

在这里插入图片描述

效果很一般,需要调整下

  • 使用MLP算法,特征提取使用词袋&TF-IDF模型
  • 特征提取使用opcode&n-gram,降低样本的噪点

  十分感谢能看到这里,这个预测还有好多好多需要完善的,貌似只使用一种方式,效果都是很一般的,下版本试一下优化下,尽可能是降低黑白样本噪点 + 其余辅助检测手段,进行文件研判。

参考文献

  • https://m.freebuf.com/articles/web/254913.html

这篇关于第三篇—基于黑白样本的webshell检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1066938

相关文章

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

Temu官方宣导务必将所有的点位材料进行检测-RSL资质检测

关于饰品类产品合规问题宣导: 产品法规RSL要求 RSL测试是根据REACH法规及附录17的要求进行测试。REACH法规是欧洲一项重要的法规,其中包含许多对化学物质进行限制的规定和高度关注物质。 为了确保珠宝首饰的安全性,欧盟REACH法规规定,珠宝首饰上架各大电商平台前必须进行RSLReport(欧盟禁限用化学物质检测报告)资质认证,以确保产品不含对人体有害的化学物质。 RSL-铅,

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

独立按键单击检测(延时消抖+定时器扫描)

目录 独立按键简介 按键抖动 模块接线 延时消抖 Key.h Key.c 定时器扫描按键代码 Key.h Key.c main.c 思考  MultiButton按键驱动 独立按键简介 ​ 轻触按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。  ​ 按键抖动 由于按键内部使用的是机

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品