背景:
在 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 的本质实际上是对一个标签的执行,那么这个过程理论上和执行 “函数” 行为是完全一致的,为了满足更多的特殊需求:
-
热加载场景:配合一段 Yaklang 的代码进行使用
{{yak}}
热加载标签 -
在 Yak 脚本编写中,使用
{{params}}
标签来控制参数执行 -
Yakit 用户可以通过
{{codec}}
调用 Codec 类型插件
FX-1691115317401)]
特殊 Fuzztag
Fuzztag 的本质实际上是对一个标签的执行,那么这个过程理论上和执行 “函数” 行为是完全一致的,为了满足更多的特殊需求:
-
热加载场景:配合一段 Yaklang 的代码进行使用
{{yak}}
热加载标签 -
在 Yak 脚本编写中,使用
{{params}}
标签来控制参数执行 -
Yakit 用户可以通过
{{codec}}
调用 Codec 类型插件
网络安全学习路线
这是一份网络安全从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dZoaJBeR-1691115317402)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]编辑
阶段一:基础入门
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zE767bQD-1691115317402)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
网络安全导论
渗透测试基础
网络基础
操作系统基础
Web安全基础
数据库基础
编程基础
CTF基础
该阶段学完即可年薪15w+
阶段二:技术进阶(到了这一步你才算入门)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YIdt5oHX-1691115317403)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
弱口令与口令爆破
XSS漏洞
CSRF漏洞
SSRF漏洞
XXE漏洞
SQL注入
任意文件操作漏洞
业务逻辑漏洞
该阶段学完年薪25w+
阶段三:高阶提升
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qIhSzPHi-1691115317403)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
反序列化漏洞
RCE
综合靶场实操项目
内网渗透
流量分析
日志分析
恶意代码分析
应急响应
实战训练
该阶段学完即可年薪30w+
阶段四:蓝队课程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8B3YFZNk-1691115317404)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
蓝队基础
蓝队进阶
该部分主攻蓝队的防御,即更容易被大家理解的网络安全工程师。
攻防兼备,年薪收入可以达到40w+
阶段五:面试指南&阶段六:升级内容
需要上述路线图对应的网络安全配套视频、源码以及更多网络安全相关书籍&面试题等内容
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!
同学们可以扫描下方二维码获取哦!