freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

安全能力强化:Fuzztag再升级!
yaklang 2022-12-30 11:56:36 190926
所属地 四川省


背景

前面的一次更新对 Fuzztag 进行了升级,在使用时可以用更简便的写法,而且支持了同步渲染。

本篇文章将会从这两方面介绍下更新内容。

FuzzTag优化

使用 Fuzztag 标签时函数要与{{}}成对使用,如:{{base64dec({{base64enc(admin)}})}}嵌套的多了看起来特别乱,不够优雅。所以本次优化,在实现原本的语法基础上,支持了一些简便写法。

Fuzztag 原理

Fuzztag 解析时,会将输入数据解析为 Data 节点和 Tag 节点,如图中的红色部分就是 Tag 节点,其它的是 Data 节点

然后将 Tag 节点替换为执行结果(如果一个 Tag 生成了多个结果就做笛卡尔乘积,生成多份数据),再将数据按顺序拼接起来,就是最终的执行结果。知道了原理后,再想下为什么函数要与{{}}成对使用?原因是为了区别 Data 节点和 Tag 节点,遇到{{开始解析 Tag 节点,遇到}}结束解析,{{}}外面都是数据节点。再看下 Tag 节点内,包含函数名和参数,这里参数也是 Data 节点,这里节点开始的标志是遇到(,结束的标志是遇到),一个请求包解析的语法树如图

重点看下 Tag Node 的解析,这里将参数解析为了 Data2 Node,与普通的 Data Node 区别是这里不能使用(),因为这是 Data2 Node 的边界,所以需要转义使用,例如\(\)

本次优化重点针对 Data2 Node 部分,把它变成一个更智能的节点。

嵌套函数

base64enc 函数嵌套 int 函数的传统写法是这样的:{{base64enc({{int(1-5)}})}},简化后:{{base64enc(int(1-5))}},在原本的基础上省略了int函数外的{{}}

简便写法中的int(1-5)本应解析为 Data2 Node。优化后会尝试解析参数为函数调用,成功后,则生成一个 Tag Node,否则生成 Data2 Node。

嵌套数据

原理和嵌套函数相同,会尝试将 Data2 Node 部分解析为函数调用,这里 admin 明显不是,所以会作为数据节点处理。

再看一些极端情况,如图,第二种情况,已经成功将base64enc1()解析为函数调用,将会作为 Tag Node 执行,但是由于这个函数不存在,对于这种执行时错误,它的根 Tag 将会返回空数据。第三种情况,将 123() 解析为函数时发生错误,因为 123 不能作为 Identifier ,属于明显的语法错误,会直接返回当前根 Tag 的源码。

还有一种特殊情况,Fuzztag 调用无参函数时是可以省略()的,例如{{headerauth}},但是如果这个函数作为参数,即放在 Data2 Node 的位置会直接作为数据处理,这种情况不能省略括号,如图:

嵌套数据和函数

原本的 Data2 Node 变得更智能了,如果是函数调用,会解析为 Tag 节点,否则是 Data2 节点,但当函数和数据一起作为参数时,还是需要使用传统方法区分数据和函数调用。如图是生成admin1到admin3的base64编码的 Tag

因为要将admin和int(1-3)区分开,所以不得不用{{}}。还有另一种情况,如果生成的是1admin到3admin的base64编码,还是可以使用简便写法。原因是解析到)可以作为边界将 Tag 节点和 Data 节点分隔开。

当然,还可以这样用

平行标签优化

{{}}是 Tag Node 的边界,其内部是函数调用,那如果在{{}}和函数调用之间写一些字符会发生什么呢。如图,在标签内,会忽略空白符。可以将{{理解为开启函数调用模式,}}是关闭函数调用模式

作为参数使用也是一样的

同步渲染

多个平行的 Fuzztag 在生成数据时,会做笛卡尔乘积,在做爆破时,类似 Burp Suite 的 Cluster bomb 模式。但如果在爆破用户名密码时,账号和密码是一对一的关系,这种场景的爆破,在 Burp Suite 中 需要使用 Pitchfork 模式。现在 Fuzztag 也支持这种模式了。

实现原理

原理上就是在每个函数后加一个 Label ,在生成数据时,会将具有相同 Label 的数据记录当前位置并打包,再将他们进行笛卡尔乘积,再将打包的数据恢复到原位置,原理类似下面这个过程,但实际在笛卡尔乘积过程中就已经进行了排序。

方法介绍

Lebal 命名规则在函数基础上,还允许数字开头,同一层级具有相同 label 的函数生成的数据在组合过程中,他们的索引是同步的,如图

当然也可以嵌套使用,但只有同级标签才会生效

总结

本次更新简化了 Fuzztag 的写法,支持了同步渲染,让 Fuzztag 可以适用于更多的场景。Fuzztag 越来越好用了,师傅们要多多使用啊。

# 漏洞 # 网络安全技术
本文为 yaklang 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
yaklang LV.8
做难而正确的事!
  • 152 文章数
  • 102 关注者
那我问你,MCP是什么?回答我!
2025-03-24
SyntaxFlow实战CVE漏洞?那很好了
2025-03-14
SyntaxFlow Java实战(一):值的搜索与筛选
2025-03-10
文章目录