一次使用十六进制溢出绕过 WAF实现XSS的经历

news/2025/2/12 2:59:31/

 视频教程在我主页简介或专栏里

(不懂都可以来问我 专栏找我哦)

 目录:

XSS 攻击

引入——十六进制溢出(Hex Overflow)

  那么,当你输入 %5% 时,预期会得到什么?

  那么,解析器如何处理十六进制中的字母呢?

绕过 WAF

结论

今天分享如何使用 十六进制溢出 绕过 BIG-IP Local Traffic Manager (F5 Networks) Web 应用防火墙(WAF) 的过程。

整个过程看似是一个顺畅的流程,但实际上,情况是相反的。更像是 先解决问题,然后再去理解 问题的本质

XSS 攻击

最初,我注意到输入内容 未经过适当的过滤,于是我尝试了一个简单的 XSS 负载:

<svg onload=alert()>

结果,这个 payload 立即被拦截

img

于是,我开始不断尝试不同的输入,直到绕过拦截,最终发现 <svg onload> 可以成功通过。这意味着 onload=(带等号) 其实是被拦截的。 看到这个情况后,我尝试了所有可能的事件处理程序,但没有一个成功。到此就没办法了吗?


引入——十六进制溢出(Hex Overflow)

十六进制(Hexadecimal) 是一种 以 16 为基数的数值系统,由 0-F 组成(即 0123456789ABCDEF),其最大值为 FF。 在 URL 编码中,根据 [RFC 1738 2.2[1]],保留字符或不安全字符 会被编码为 % 符号后跟随两个十六进制数字。例如,%23 代表 #(井号/片段符号)。

十六进制溢出(Hex Overflow) 发生在错误实现的 URL 解码器解析 URL 时,如果它允许超出 0-F 范围的字符(包括符号 [] { } ; : < > ! & 等),就会导致解析异常。

在我测试的目标系统上,解码器的行为非常混乱,完全不符合常规逻辑。 它甚至可能使用了多种不同的解码逻辑,输出的字符全部变成小写,进一步增加了困惑。


那么,当你输入 %5% 时,预期会得到什么?

输出结果竟然是e(即 0x55)。你可能会好奇,为什么会这样?

解析器的处理过程如下:

1.解析器读取 %5 作为第一个部分,然后遇到了第二个 % 符号。

2.它将第二个 % 重新编码成 %25,然后忽略第一部分的 2,只取 5,最终变成 %55

3.由于这个字符属于溢出字符(Overflow Character),解析器会对结果的第一部分做 -1 处理,将 %55 变成 %45,即大写字母 E

4.最终 %7% 解析为 %65,即大写字母 E

同理:

%8% → %75,即小写 u

%6% → %55,即大写 U


那么,解析器如何处理十六进制中的字母呢?

第一阶段,它能正常解析 abcdef,但当发生溢出时,它会将字母当作索引处理,并且从 g 开始计数 0

img

经过进一步观察,我发现这些字符可以分为两组不同的集合。而当它们混合使用时,情况会变得更加有趣,就像这样:

img

如果两个集合中的字符被一起使用,并且其中一个字符来自绿色集合,那么第一位十六进制数字(nibble)会增加 1。例如,输入 %5g,按照此表 %5g 解析为 %50,但由于绿色集合的影响,最终输出 %(5+1)0 或 %60,即反引号 `

同样,如果输入 %hz(其中 h 来自第二个集合),按照表格 %hz 解析为 %13,但由于溢出机制,最终输出 %(1+2)3 或 %33,即字符 '3'

但是这种模式并不总是固定的,完整的工作流程也无法完全计算。有时会增加 1,有时会增加 2 或 3,而某些情况下第一位十六进制数字甚至会被减去。但即使如此,这些信息已经足够用于绕过 WAF。


绕过 WAF

在最初的测试中,我们发现几乎没有办法绕过 WAF,因为所有的事件处理程序都被屏蔽了,因此我们需要寻找其他方法。

利用 Hex Overflow,我们可以用许多不同的方法来表示单个 ASCII 字符。例如,等号 =(十六进制 %3d)也可以用 %3= 表示,其解释方式为 %3 %3d,其中第一个 %3 被解析器忽略,使其仍然等于 %3d

此外,还可以使用 %zd%z=%jd%it(在某些情况下第一位十六进制数字会被 -1 处理)。

因此,我们可以利用这些等价表示来绕过 WAF,例如:

<svg onload%jdonload=alert()>

img

img

它再次拦截了我们的 Payload,原因?这次是 alert() 函数被屏蔽了。

这个问题可以通过 可选链(optional chaining) 轻松绕过 → alert?.()

img

不仅仅限于此,使用许多其他方式也可以绕过,通过使用 Hex Overflow 生成 Payload 的不同部分,比如 %0d (CR) 转换为 ‘%0=’ 或 ‘%w=’,从而使 Payload 变为 <svg onload%w==alert()>

结论

不过这种存在缺陷的解码器非常罕见,并且可能并非所有解码器都有相同的缺陷。

 

视频教程在我主页简介或专栏里

(不懂都可以来问我 专栏找我哦)

申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关

 


http://www.ppmy.cn/news/1571305.html

相关文章

RocketMQ的缺点是什么?Kafka的缺点是什么?使用场景有什么区别?

目录 RocketMQ 的缺点 Kafka 的缺点 RocketMQ 和 Kafka 的使用场景区别 RocketMQ 的使用场景 Kafka 的使用场景 总结 RocketMQ 的缺点 Kafka 的缺点 1. 消息顺序保证能力有限 2. 消息事务功能相对较弱 3. 消息回溯能力有限 使用场景区别 1. RocketMQ 的适用场景 …

hive数仓的分层与建模

Hive 数据仓库分层和数据建模是一种常见的数据仓库设计方法&#xff0c;旨在通过分层的方式组织数据&#xff0c;提高数据的可维护性、可复用性和查询性能。以下是关于 Hive 数据仓库分层和数据建模的详细知识&#xff1a; 一、Hive 数据仓库分层 数据仓库通常采用分层架构&am…

8种方法解决电脑QQ能上网但是浏览器不能上网问题

刚接触电脑的时候遇到过很多的问题&#xff0c;每次遇到都让我焦头烂额&#xff0c;特别是一些问题不知道怎么解决&#xff0c;忙活很久还是没进展。当时遇到的问题是电脑QQ能上网但是浏览器打不开网页。明明QQ、视频软件也能正常使用&#xff0c;但是浏览器就是打不开网页&…

使用 DeepSeek 进行图像描述:多模态 AI 技术实践

使用 DeepSeek 进行图像描述&#xff1a;多模态 AI 技术实践 背景介绍 在当今的人工智能领域&#xff0c;多模态技术正在rapidly发展&#xff0c;为图像理解和描述提供了前所未有的可能性。本文将详细介绍如何使用 DeepSeek 的多模态模型来实现图像智能描述。 技术原理 多模…

Jupyter Notebook 6/7 设置代码补全

设置的方法根据 Notebook 的版本而定&#xff0c;可以通过以下命令查看版本 jupyter notebook --version Notebook 7 在主界面打开 Settings (注意不是在 *.ipynb 中的) 打开以下开关即可 Notebook 6 pip install jupyter_contrib_nbextensions jupyter contrib nbextension…

【Flink源码分析】5. Flink1.19源码分析-异步编程(CompletableFuture)

5 CompletableFuture 实现异步编排&#xff1b;获取异步任务执行的结果。 CompletableFuture提供了几十种方法&#xff0c;辅助我们的异步任务场景。这些方法包括创建异步任务、异步任务回调、多个任务组合处理等方面。 5.1 supplyAsync 方法 supplyAsync 执行 Completable…

【Qt Creator】Qt Creator编辑器打开QT项目后,项目栏的文件全部呈现灰色的原因分析

目录 1、现象描述2、原因分析3、解决方法 1、现象描述 在学习QT过程中&#xff0c;常常会从网络&#xff08;如GitHub&#xff09;上下载QT项目进行学习或借鉴使用&#xff0c;但是使用Qt Creator编辑器打开项目后&#xff0c;往往会出现项目栏的文件全部呈现灰色的问题&#x…

【Uniapp-Vue3】UniCloud云数据库获取指定字段的数据

使用where方法可以获取指定的字段&#xff1a; let db uniCloud.database(); db.collection("数据表").where({字段名1:数据, 字段名2:数据}).get({getOne:true}) 如果我们不在get中添加{getOne:true}&#xff0c;在只获取到一个数据res.result.data将会是一个数组&…