freeBuf
主站

分类

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

特色

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

点我创作

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

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

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

FreeBuf+小程序

FreeBuf+小程序

Web Fuzzer 进阶
yaklang 2023-11-20 10:51:07 117698

前言

Web Fuzzer,作为Yakit平台的核心组件之一,已经超越了传统的“重放数据包”的功能,成为了一个多面的工具,支持更加丰富的功能,本篇文章会围绕最近添加的 Fuzzer 序列功能和 PoC 模板生成功能展开讲讲。

多请求 PoC 的免写攻略

在此前的poc免写攻略文章中https://mp.weixin.qq.com/s/0u2bBPQ_EEQ_4u-A5EZkMQ,我们以 ThinkPHP RCE 为例,通过 "点点点" 的方式,生成了一个还算合格的 Yaml PoC 插件,相信小伙伴们在阅读后,心中多半会有一个疑问,例子中的 ThinkPHP RCE 只需要发送一次请求包即可判断漏洞是否存在,那么对于下列的一些漏洞场景,怎么办呢?

  1. 访问漏洞 API 前,需要先获取 token 的场景
  2. 上传文件后,想要对上传的文件是否成功进行判断的场景
  3. ... 其他需要前置包的场景

仔细思考可以发现,这些场景和 Web Fuzzer 序列功能十分契合,本质就是通过设置数据包发送的顺序,达到触发漏洞的目的,因此,对于多数据包的 PoC 生成也理所应当的被放在了 Fuzzer 序列中。

我们再以 ThinkPHP RCE 为例,为了体现出多次发包的要求,我们不再使用回显 phpinfo() 的方式判断漏洞检出,我们首先构造文件写入数据包,随后访问写入文件是否成功的方式来判断漏洞是否存在。

1700448145_655ac791a659a82fd0d92.png!small?1700448147762

我们使用 Vulhub 启动一个 ThinkPHP 的靶场,随后在 Web Fuzzer 中构造如下数据包

HTTP
// 上传一个名为 test.php 的文件,文件内容是打印 Yakit md5 后的值,并且在访问后会自行删除 test.php 文件
GET/index.php?s=index/\think\template\driver\file/write&cacheFile=test.php&content=%3C?php%20echo%20md5(%27Yakit%27);unlink(__FILE__);?%3E HTTP/1.1
Host: 127.0.0.1:8888

发送文件写入数据包

1700448156_655ac79c8bc8fe6663d99.png!small?1700448158697

验证文件是否上传成功,通过我们上面发送的 Payload 内容可以知道,上传成功的标准应当是 response 中有 "Yakit" 字符串 md5 后的结果

1700448162_655ac7a2ad94f9ce1002e.png!small?1700448163559

点击发送数据包,观察结果,完美符合预期!复现漏洞阶段结束,接下来我们开始把这两个数据包变为一个插件,首先需要对第二个数据包设置一个匹配器,用于设置漏洞是否存在的条件,也就是我们前面提到的 Response body 中有 Yakit md5 后的结果

我们可以根据需求,选择使用硬编码匹配的方式进行判断,如下设置匹配 "53d363904730659dc7c1338948f77772"

1700448177_655ac7b1a619174caabba.png!small?1700448179400

也可以配合 设置变量功能 使用更加灵活的方式来设置匹配器,通过对结果和设置的变量进行比较来确认漏洞是否存在,如下所示

1700448188_655ac7bc62dcd2c857dde.png!small?1700448190496


之后我们可以把前面的两个数据包添加进一个 Fuzzer 序列组中,

1700448222_655ac7de3f7a46a507ce7.png!small?1700448223450


点击开始执行,我们可以在 验证 数据包中,看见匹配成功的字样

1700448346_655ac85ae780b25ddc88c.png!small?1700448348270

随后我们就可以点击右上角的 "生成为 Raw 模板"

1700448351_655ac85f43d5b940f1681.png!small?1700448353024

生成如下的 Ymal PoC

1700448355_655ac86392cc83de7b515.png!small?1700448357086

点击执行后,可以发现检出了漏洞

1700448360_655ac8685f90407fe9654.png!small?1700448362428


至此,我们使用序列构造的多请求包 PoC 就完成了,可以后续完善一些漏洞信息即可保存为 Yaml 插件,方便后续的使用了


Fuzzer 序列场景:CSRF Token 保护下的爆破

在官网的 Web Fuzzer 教程中,有热加载实现的 热加载场景案例:csrf token保护下的爆破,我们现在使用 Fuzzer 序列的方式来实现一下。

我们以pikachu靶场为例,安装pikachu靶场后(记得要初始化),我们打开如下页面:

1700448378_655ac87a1bc74c661e1c8.png!small?1700448379308

任意输入账号密码之后,使用 Yakit 的 MITM 模块拦截登录请求,我们可以看到请求如下:

1700448382_655ac87e81df09efbcd13.png!small?1700448384147

注意到除了用户和密码之外,还存在一个 token 的 post 参数,这是一个 CSRF token,它主要是用来防止CSRF攻击的,但是这也给我们的爆破增加了一定的难度,因为每次爆破都需要使用一个新的 token。

观察返回包中的 token ,后续的请求需要带上这个 token。

1700448387_655ac883d14be843f118a.png!small?1700448389086

理清思路后,本次的爆破流程如下图所示

1700448393_655ac8893d96b6a2bb0c3.png!small?1700448394470

第一步,我们首先需要提取 token,使用 Web Fuzzer 中的提取器,添加一个变量名为 token 的 Xpath 提取器,使用 //input[@name='token']/@value进行匹配

1700448399_655ac88f59408835902a6.png!small?1700448400720

由于第二个登录数据包中每次都需要一个新的 token,所以我们需要在进行登录尝试前,都去获取一次 token,因此,对于字典的设置,需要在第一个数据包中进行设置,第二个数据包中使用,最终,第一个数据包 "提取 token" 如下图,我们设置了一个名为 pass 类型为 fuzztag的字典,用于在后续包中使用。

1700448405_655ac8959a80ba536e761.png!small?1700448406822

提示

由于此靶场的Cookie 和 CSRF Token 有绑定关系,在获取 token 的数据包中,需要删掉Header 中的 Cookie


第二个数据包的设置就十分简单了,只需要使用数据包一中设置的两个变量token和pass。如下图

1700448424_655ac8a86cea6821db77b.png!small?1700448426362

随后将数据包一和数据包二变成一个序列组,设置执行顺序即可开始进行爆破了

1700448429_655ac8ad4c90e9a8deb63.png!small?1700448430828

最后可以通过搜索字符串来进行验证,发现所有的 token 都正常使用

1700448435_655ac8b39fb7b778c06eb.png!small?1700448436752

同时爆破出了 admin/123456 的用户名和密码

1700448439_655ac8b7d126b3f6dd562.png!small?1700448441394

至此,我们通过序列对 CSRF Token 场景的爆破也已经完成。

小结

本文通过两个例子,分享了一些 Fuzzer 序列的场景,希望对大家有所帮助。

# 漏洞 # 黑客 # 网络安全 # web安全
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 yaklang 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
yaklang LV.8
做难而正确的事!
  • 152 文章数
  • 102 关注者
那我问你,MCP是什么?回答我!
2025-03-24
SyntaxFlow实战CVE漏洞?那很好了
2025-03-14
SyntaxFlow Java实战(一):值的搜索与筛选
2025-03-10
文章目录