安全基础设施:用Fuzztag优雅地生成与变形任何Payload

背景:

在 Web Fuzzer 中,我们实现 BurpSuite Intruder 的代替是使用一种名字叫 Fuzztag
的全新机制,这种机制在以前并没有出现在任何安全工具和产品中,因此它对于绝大多数人来说是 “船新” 的。

实际在使用中,Fuzztag 并没有给大家带来太多麻烦的学习成本,其简单的语法和快速交互解决了各种 “配置” 的过程。

但是因为早期版本 Fuzztag
的技术实现比较简单,纯正则编译+分阶段编码有很多的额外限制,造成了不必要的理解成本,我们在v1.1.3-sp4以后的版本中,对 Fuzztag
的底层机制进行了完全的重构,使用编译原理的技术实现定制的 Lexer 和 Parser,实现了一套可嵌套递归执行 fuzztag 表达式模版语言。

Yaklang Fuzztag 是什么?

这是一种可以把字符串进行一定规则渲染变形的模版表达式语言,这种语言标记以{{开头,}}结尾,中间包含规则的具体名称和参数,执行的结果为 n
个原字符串的变形。

以 Antlr4 Grammar 风格的语法定义:

expr = data '{{' identifier ( '(' expr ')' )? '}}'data

简单来说,如果我们想要生成

payload-1
payload-2
payload-3
payload-4
payload-5

那么,我们仅需要编写的 Fuzztag 表达式为payload-{{int(1-5)}}

从字面意思理解,我们这个表达式以payload-开头,遇到{{int(1-5)}}我们按字面意思理解为,在这儿生成 1-5
这五个整数。因此,他的结果为[1 2 3 4 5]我们和payload-进行组合,可以得到结果为:

payload-1
payload-2
payload-3
payload-4
payload-5

五分钟学会 Fuzztag

快速开始:使用 Fuzztag 生成整数列表爆破

最简单的情况,如果我们要进行一个参数位置的 ID 遍历,一般来说,我们比如 url 为

https://www.example.com/order.php?id=1

那么,我们要对 id 进行遍历,需要编写的 tag 为{{int(1-100)}}即可生成 100 个
url,但是对于用户来说,只编写了https://www.example.com/order.php?id=``{{int(1-100)}}

与此同时,如果这个 ID 带了前缀呢?

简单修改为https://www.example.com/order.php?id=``myPrefix{{int(1-100)}}

可生成一系列的相关 URL

https://www.example.com/order.php?id=myPrefix1
https://www.example.com/order.php?id=myPrefix2
https://www.example.com/order.php?id=myPrefix3
...
https://www.example.com/order.php?id=myPrefix99
https://www.example.com/order.php?id=myPrefix100

爆破固定位整数:使用 0 左值填充[001, 002, 003...999]

很多时候,爆破的时候,整数位数应该是固定的,那么我们怎么变形生成更完整的 payload 呢?

通过简单的变形,我们在参数后增加一个|3=>{{int(1-999|3)}}可以指定要填充的位数。

https://www.example.com/order.php?id=``myPrefix``{{int(1-999|3)}}

可以生成如下内容:

https://www.example.com/order.php?id=myPrefix001
https://www.example.com/order.php?id=myPrefix002
https://www.example.com/order.php?id=myPrefix003
...
https://www.example.com/order.php?id=myPrefix998
https://www.example.com/order.php?id=myPrefix999

最基础的整数使用如上,当然,实战情况大家更容易能体会到这样的操作带来的方便

我们简单的通过一个标签,可以发送批量的请求来进行测试。

举一反三:用户名密码爆破

当然,仅仅知道{{int(...)}}标签并不能帮助我们完成所有的工作内容,我们对 Yaklang 支持的 Fuzztag
进行了一些总结,地址我们放在了这里

《https://yaklang.com/docs/newforyak/fuzztag》

一些简单的字面量和编码生成的函数我们在链接中都可以找到,那么我们除了上述的功能之外,我们需要能解决另外一些问题,“使用字典” 或者使用 “文件字典”。

最典型的,如果我们要使用一个文件,把它按行解析,可使用{{file:line(/tmp/dict.txt)}}

当然,如果你是 Yakit 的用户,在上传过字典之后,可以通过{{x(dictname)}}

所以,如果原文内容是:

https://www.example.com/login.php?username={{file:line(/tmp/user.txt)}}&password={{file:line(/tmp/pass.txt)}}

即可快速生成针对用户名和密码爆破的数据包 URL。

例如如果字典文件存在的话,执行内容为

https://www.example.com/login.php?username=admin&password=admin
https://www.example.com/login.php?username=admin&password=admin123
https://www.example.com/login.php?username=admin&password=123456
...
...
https://www.example.com/login.php?username=root&password=admin
https://www.example.com/login.php?username=root&password=admin123
https://www.example.com/login.php?username=root&password=123456
...
...

在实际 Web Fuzzer 使用中,我们可以很容易的做到如下内容

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dmvkwp5D-1691115317399)(https://image.3001.net/images/20221020/1666259551_63511a5f4bba8742744d1.png!small)]

我们使用了内置的 top10 用户名与 top25 的密码字典,组合了 250 个请求发送出去,对网站进行了批量请求,在 Response
列表中,实现了多种内容的爆破和查看。

标签的嵌套:变形 + 编码 + 动态数量

很多时候,仅仅单个标签并不能满足实际需求,例如我们经常需要对一个值进行 base64,以往我们都需要编写脚本来实现这个功能,实际上,我们在
Yaklang.Fuzztag 中将会非常容易处理这个功能,整个过程非常简单

{{base64({{int(1-10)}})}}

/*
MQ==
Mg==
Mw==
NA==
NQ==
Ng==
Nw==
OA==
OQ==
MTA=
*/

在 Codec 中,我们可以很容易的编写一个 tag 来实现上述功能

缩进让嵌套更加可读

同时由于 Fuzztag 本质上是通过标签执行来做的,在标签内部,为了方便内容编写,可以在恰当的地方控制锁进,让你的 fuzztag
看起来更简单优雅,正如下面看到的内容,括号的前后是可以允许任意缩进的

{{base64
    ({{int
        (1-5)
    }})
}}

但是值得注意的是,括号内的内容应该为具体的编码的内容,包含换行等空白符号,所以在括号内(...)换行需要谨慎,不然很容易在编码内容中加入多余的空白符或者换行符

在 Fuzztag 中使用编码转义:)

一般来说,我们经常要编码特殊的 JSON 字段内容,但是在数据中,很有可能出现特殊字符和 Fuzztag
冲突的情况,这种情况下,我们通过\)来转义一下,告诉 fuzztag 的数据段中,不要闭合数据。

例如,我们想要编码println(123)这个字符串内容,一般来说我们会编写{{base64(println(123))}}希望他输出println(123)
base64 编码cHJpbnRsbigxMjMp。但是实际上,上述标签无法执行成功,因为)和标签参数闭合的时候冲突了!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vLzgGb3y-1691115317400)(https://image.3001.net/images/20221020/1666259630_63511aae2bb1b4c4de47e.png!small)]

那我们如何解决这个问题呢?在yaklang-v1.1.3-sp6中,我们实现了针对)的转义功能。可以很容易解决上述提到的问题。

只需要把标签改成{{base64(println(123\))}}就大功告成了!

高级嵌套特性

当然标签的嵌套其实是很自然的过程,他理论上可以无限嵌套,但是需要注意的是,嵌套如果发生在标签名中,不保证可以正常工作

所以说,我们看得到,嵌套是可以实现在任何 “参数段” 的,我们以一个非常有意思的嵌套按理来说:

Union-SQL 注入 Payload 生成

我们在 SQL 注入测试 Union 的时候,很有可能要生成若干个 Union Select … 来猜测注入表的列数,比如

union select 1,1
union select 1,1,1
union select 1,1,1,1
...

那么,根据结果反推我们应该如何编写 Fuzztag?

union select {{
    repeatstr(1,|{{
        int(1-10)
    }})
}}1

特殊 Fuzztag

Fuzztag 的本质实际上是对一个标签的执行,那么这个过程理论上和执行 “函数” 行为是完全一致的,为了满足更多的特殊需求:

  1. 热加载场景:配合一段 Yaklang 的代码进行使用{{yak}}热加载标签

  2. 在 Yak 脚本编写中,使用{{params}}标签来控制参数执行

  3. Yakit 用户可以通过{{codec}}调用 Codec 类型插件

FX-1691115317401)]

特殊 Fuzztag

Fuzztag 的本质实际上是对一个标签的执行,那么这个过程理论上和执行 “函数” 行为是完全一致的,为了满足更多的特殊需求:

  1. 热加载场景:配合一段 Yaklang 的代码进行使用{{yak}}热加载标签

  2. 在 Yak 脚本编写中,使用{{params}}标签来控制参数执行

  3. Yakit 用户可以通过{{codec}}调用 Codec 类型插件

网络安全学习路线

这是一份网络安全从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dZoaJBeR-1691115317402)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]编辑

阶段一:基础入门

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zE767bQD-1691115317402)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

网络安全导论

渗透测试基础

网络基础

操作系统基础

Web安全基础

数据库基础

编程基础

CTF基础

该阶段学完即可年薪15w+

阶段二:技术进阶(到了这一步你才算入门)

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YIdt5oHX-1691115317403)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

弱口令与口令爆破

XSS漏洞

CSRF漏洞

SSRF漏洞

XXE漏洞

SQL注入

任意文件操作漏洞

业务逻辑漏洞

该阶段学完年薪25w+

阶段三:高阶提升

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qIhSzPHi-1691115317403)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

反序列化漏洞

RCE

综合靶场实操项目

内网渗透

流量分析

日志分析

恶意代码分析

应急响应

实战训练

该阶段学完即可年薪30w+

阶段四:蓝队课程

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8B3YFZNk-1691115317404)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

蓝队基础

蓝队进阶

该部分主攻蓝队的防御,即更容易被大家理解的网络安全工程师。

攻防兼备,年薪收入可以达到40w+

阶段五:面试指南&阶段六:升级内容

img

需要上述路线图对应的网络安全配套视频、源码以及更多网络安全相关书籍&面试题等内容

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

同学们可以扫描下方二维码获取哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值