用隐式马尔科夫模型检测XSS攻击Payload

news/2025/10/31 20:26:38/文章来源:https://www.cnblogs.com/hetianlab/p/19181203

0.前言

学习一下如何使用机器学习的方式去识别XSS Payload。

1.XSS介绍

其实xss说白了,就是通过向网页中注入恶意的脚本代码,一般来说都是 JavaScript,让代码在其他用户的浏览器中执行,从而达到窃取信息、冒充身份、传播木马等目的。

换句话说,网站本来应该只展示安全的内容的,但是攻击者把一些恶意的脚本给塞入了网站中,让浏览器错误地把其当成正常内容执行了。

大概有以下这几种分类:

反射型:payload 在请求里,也就是URL或者表单,服务器拼回页面即触发,通常需要诱导点击。

存储型:payload 被存入库,比如说什么网站的评论、昵称、公告之类的,所有访问者都会触发。

DOM 型:前端脚本把不可信数据塞进危险 DOM SinkinnerHTML 之类的,不依赖服务器拼接。

盲 XSS:这个顾名思义是看不到弹窗,但 payload 会在后台或者运营端页面执行。

自我 XSS:诱导用户在控制台粘贴代码。

变异 XSS:浏览器或框架在解析或者重排 DOM 时修补标签,绕过原本的过滤器。

2.隐式马尔科夫

马尔科夫模型就是基于本次观测的状态来预测上一次的状态 而不依赖前面的所有内容。

假设现在有三个时间点:1,2,3

在2这个时间点是a,到了3这个时间点就变成了A,而马尔科夫模型在这里就仅根据a来预测,而不是根据a前面的内容。

主要解决连续问题,比如说:

  • 文本类中上一个字或者词中下一个字词的出现概率。

  • 一个连续的字词构成的句子判断句子的情感等。

使用的时候需要在虚拟环境中下载一个第三方库

pip install hmmlearn -i https://pypi.tuna.tsinghua.edu.cn/simple

3.使用隐式马尔科夫识别XSS

注意:这里只截取重要部分代码,并没有展示完全。

xss语法特征

<src>
<script>
<alert>
http://
<img>
onerror

导入一个文本的数据,都是各种各样的xss变体,github或者是kaggle上都能找到相关的xss数据集。

然后进行一个数据向量的处理。

这是个正则表达式,匹配双引号里面的字符串,比如说xss里面会有这种<>括起来的符号。

还有把http开头的,闭合的标签,反斜杆,或者是只有一个>,还有=符号,毕竟xss里面有什么onerror=xxx之类

还有函数调用,老生常谈的alert。

然后使用nltk,一个自然语言的工具,用来做分词处理。

那什么是分词处理?把一段连续的文本拆分成一个个有意义的“词语”或“最小语言单位”的过程。

在英语中,单词之间有空格,计算机很容易识别:

“I love natural language processing.”

可以直接得到:["I", "love", "natural", "language", "processing"]

但在中文中,句子是连续的,没有空格:

“我爱自然语言处理。”

对计算机来说,这是一个连续的字符串,它不知道“我爱”、“自然语言处理”这些边界。所以就需要中文分词算法来判断哪些字该组合在一起。

【----帮助网安学习,以下所有学习资料免费领!加vx:YJ-2021-1,备注 “博客园” 获取!】

 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)

接下来就是转换列表,去重,添加等常规操作。

这样就大致完成了数据向量的处理。

模型的结构

import model_param
from hmmlearn import hmm
remodel = hmm.GaussianHMM(n_components=model_param.N, covariance_type="full", n_iter=model_param.n_iter)

model_param.N是模型的状态,就是样本到底有几个类型,比如3个不同类型的骰子之类的。

covariance_type="full" 这个表示所有的样本都是有数据的,都是不为0的。

#状态个数
N=5
#迭代次数
n_iter=100

这里就把状态数和迭代数设置为5和100,这里100次看个人电脑配置吧,我100次都跑得挺慢的。

模型的训练

import model_struct
import joblib
import vec_data
index_wordbag=1 #词袋索引
wordbag={} #词袋
wordbag = vec_data.load_wordbag("E:\\my_hmm\\data\\xss-200000.txt",2000)
X,X_lens = vec_data.vec("E:\\my_hmm\\data\\xss-200000.txt",wordbag)
remodel = model_struct.remodel.fit(X,X_lens)
joblib.dump(remodel, "xss-train.pkl")

把用到的数据都加入到词袋中去,第一次词袋是空的,第一次就是去填满这个内容,也就是词的特征,第二次是做匹配,也就是根据上面的特征去做匹配才能返回X这个结果。

有了X和X_lens之后就可以做训练,然后把xss-train.pkl这个模型保存到本地。

模型测试

可以设置一个判断的阈值,或者理解为一个评分。

都是负数,评分越靠近0就说明越不像xss,评分越远离0就说明很像xss。

比如说我们在test数据中放入这么几条数据

/0_1/?%22onmouseover='prompt(42873)'bad=%22%3E
/0_1/api.php?op=map&maptype=1&city=test%3Cscript%3Ealert%28/42873/%29%3C/script%3E
/0_1/api.php?op=map&maptype=1&defaultcity=%e5%22;alert%28/42873/%29;//
/0_1/api.php?op=map&maptype=1&defaultcity=%E5%8C%97%E4%BA%AC&api_key=%22%3E%3C/script%3E%3Cscript%3Ealert%28/42873/%29;%3C/script%3E
/0_1/api.php?op=map&maptype=1&defaultcity=%E5%8C%97%E4%BA%AC&field=%29%3C/script%3E%3Cscript%3Ealert%2842873%29%3C/script%3E//
/0_1/api.php?op=video_api&pc_hash=1&uid=1&snid=%3C/script%3E%3Cscript%3Ealert(/42873/)%3C/script%3E//&do_complete=1%20
/0_1/api.php?op=video_api&uid=1&snid=1&pc_hash=%3C/script%3E%3Cscript%3Ealert(/360/)%3C/script%3E//&do_complete=1
/0_1/?callback=%3Cscript%3Eprompt(42873)%3C/script%3E

让训练好的模型去检测这些是不是xss攻击。

可以看到评分越小,说明它越像xss攻击。

接下来,可以把训练好的模型做成一个可视化界面。

可以使用django或者flask框架,这里就使用flask框架。

...
#最大似然概率阈值
T=-13
def process_text(input_text):   # 这里可以添加处理逻辑   remodel = joblib.load("E:\\my_hmm\\model\\xss-train.pkl")   f = open("test.txt", "w")   f.write(input_text)   f.close()   pro,line = test(remodel,"test.txt")   print(pro)   if pro == -1000:       return "请输入长度为10以上的payload"   elif pro > T:       return "没有检测到xss代码"   else:       return f"检测的结果是: {line},评分为:{pro}"
​
@app.route('/', methods=['GET', 'POST'])
def index():   result = ""   if request.method == 'POST':       input_text = request.form['input_text']       result = process_text(input_text)   return render_template('index.html', result=result)
​
if __name__ == '__main__':   app.run(debug=True)

先把训练好的模型加载进来,然后把input_txt保存成一个本地文件test.txt,然后使用写好的判断分数函数去做一个分数判断。

因为最简单的xss攻击payload也会超过10个长度,所以可以先把长度小于10的排除了。

如果分数大于-13,就说明模型认为不是xss攻击。

实际效果就如下图:

使用样本里面没有的xss payload 模型也能检测出来。

但是并非百分之百正确,却可以解决一些看起来像的问题。

有一点要注意,虽然 HMM 可以捕捉 XSS Payload 的语法序列特征,但对于经过多层编码、混淆的攻击样本效果有限。

此外,模型需要大量带标签的数据进行训练,否则容易过拟合。

更多网安技能的在线实操练习,请点击这里>>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/952199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

revit api创建文字注释

revit api创建文字注释public void MyFirstMacroAppCS() {Autodesk.Revit.DB.XYZ baseVec = Application.Create.NewXYZ(1.0, 0.0, 0.0);Autodesk.Revit.DB.XYZ upVec = Application.Create.NewXYZ(0.0, 0.0, 1.0);Aut…

mysql 查询今天、昨天、本周、上周、本月、上月、本季度、上季度、本年、上一年、的数据

1、今天select * from 表名 where to_days(时间字段名) = to_days(now())2、昨天select * from 表名 where to_days( now( ) ) - to_days( 时间字段名) <= 13、近7天select * from 表名 where date_sub(curdate(), …

P10674 [MX-S1-T3] 电动力学 题解

P10674 [MX-S1-T3] 电动力学 题解 提供一种比现有题解简单的 DP 方式和用到结论的证明。首先,建立原图的圆方树,注意到如果两个圆点 \(x,y\in T\),那么在圆方树上 \(x\to y\) 路径上的所有方点对应的点双连通分量中…

【UE引擎解构】- GamePlay篇 : 移动

基本组件(继承链): UActorCompoent - 负责组件的生命周期管理、激活/停用、与Actor的绑定等USceneCompoent - 具有变换并支持附件(组件依附),但没有渲染或碰撞功能。UPrimitiveCompoent - 具有渲染和物理信息,可以实…

读后感一:《代码大全 2》—— 从 “写代码” 到 “做工程” 的思维跃迁 - A

初读《代码大全 2》时,我正陷入 “代码能跑就行” 的认知误区 —— 总以为优化语法、缩减行数就是提升代码质量的全部,直到这本书用近千页的内容,彻底颠覆了我对软件开发的认知。它没有停留在 “if-else 怎么用”“…

Ai元人文:对“局限性”的反驳

Ai元人文:对“局限性”的反驳 有些人指出,有关Ai元人文构想的研究仍存在一定的局限性。首先,由于AI元人文理论仍在发展完善中,一些核心概念和机制还需要进一步的理论论证和实证检验。其次,该理论在跨文化应用方面…

读后感二:《代码大全 2》—— 穿越技术迭代的 “软件开发说明书” - A

在这个框架迭代比季节更替还快的时代,拿起《代码大全 2》这样一本初版于 2004 年的书,我起初带着 “会不会过时” 的疑虑。但读完才发现,这本书就像软件开发领域的 “经典物理学”—— 它不依赖特定语言或框架,而是…

JDBC练习

环境准备:数据库表 tb_brand 实体类 Brand 测试用例查询所有数据 package com.itheima.example;import com.itheima.pojo.Brand; import org.junit.Test;import java.sql.*; import java.util.ArrayList;/*** 品牌数据…

2-SAT学习笔记

问题 给出一些\(0/1\)选择和一些约束条件,求出一组满足所有条件的解为方便叙述,我们把第 \(i\) 个 \(0/1\) 选择表示为 \(ai,0\), \(ai,1\) 首先观察性质,\(ax,t,ax,t\) 冲突意味着两者只能选其一。有了这个性质,我…

打造自己的 Claude Code:LangGraph + MCP 搭建一个极简的 AI 编码助手

实践是最好的学习方式。为了深入理解 LangGraph 和模型上下文协议(MCP)服务器的生态,我们来从零开始构建一个 CLI 编码代理。我们的目标是,抛开 Claude Code 那些花里胡哨的功能,看看最基础的编码代理能做到什么程…

CSP-S 2023-2024 分析

CSP-S 2023-2024 分析前言 考前临时写的题解,希望会有帮助 2023 比赛回顾 分数是 100+50+0+0=150 比赛打的没什么问题,就是当时水平菜,写不出 DP 和大模拟。 密码锁 枚举每一个密码是否可能。 消消乐 记 \(f_i\) 为…

Java:历久弥坚的编程基石,在变革中永葆活力

在技术浪潮日新月异的今天,编程语言的江湖风起云涌,新贵辈出,各领风骚数年。然而,有一门语言,自1995年诞生以来,便以其坚如磐石的稳定性、跨平台的包容性和蓬勃发展的生态系统,始终屹立于行业的核心地带,它就是…

revit api获取与连接器connector连接的图元

revit api获取与连接器connector连接的图元public void GetElementAtConnector(Connector connector) {MEPSystem mepSystem = connector.MEPSystem;if (null != mepSystem){string message = "Connector is owne…

Ant构建项目 - 沐春风

前言: Ant是java世界里第一个具有里程碑意义的项目构建工具。 官网地址:http://ant.apache.org/。 文档地址(Ant task):http://ant.apache.org/manual/index.html。 扩展工具地址(比如checkstyle和clover):http://…

专栏目录

欢迎投稿。方便有人喜欢在别人的反思下面乱评论。 也方便自己吸取教训。 UPD:现在不只是模拟赛反思目录了,想投稿的优秀文章都可以投稿。 UPD:搬运一下!欢迎投稿! 8.24总结之周练考炸了:KMP 写挂并且没有对拍。还…

MySQL 中常用函数使用

IF函数根据判断条件是否成立进行选择执行,成立时执行一条语句,不成立时执行另一条语句 语法结构:IF(condition, value_if_true, value_if_false)参数说明condition: 判断条件 value_if_true: 如果 condition 的结果…

详细介绍:基于stm32的物联网OneNet火灾报警系统

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Java的实战与思想:从代码到架构的工程之美

Java最大的优势,不仅在于语言本身,更在于它形成了一整套企业级软件工程方法论。无论是传统的单体系统,还是现代的微服务与云原生架构,Java都具备系统化的开发、测试、部署与维护能力。 1. 分层架构(Layered Archi…

revit api创建风管

revit api创建风管public static Duct CreateDuct(Document doc) {ElementId systemTypeId, ductTypeId, levelId;systemTypeId = ductTypeId = levelId = ElementId.InvalidElementId;// 获取标高Idvar levelFilter =…

代码大全2 第四五章

读《代码大全 2》第四、五章,感觉像被老程序员拽着纠正自己的坏毛病,每句话都戳中日常编程的痛点。第四章讲变量命名和数据类型,以前写代码总图懒省事,变量叫个 “temp”“val” 就完事,结果过两天再看,根本记不…