一个概念验证的WordPress插件模糊测试工具,该工具发现了近3000万个站点上安装的WordPress插件中的300多个漏洞。
所用技术描述于 https://kazet.cc/2022/02/03/fuzzing-wordpress-plugins.html
如果你想继续研究,请从不太流行的插件开始——如果某个插件在2021年10月至2024年1月期间获得了至少1万次活跃安装,我大概率已经查看过模糊测试报告(并且重点关注那些至少有2万次活跃安装的插件)。由于模糊测试的工作方式存在大量随机性,这些插件中的某些漏洞可能仍然未被发现——但数量较少。
模糊测试报告包含大量误报——其中大多数并不代表漏洞。看到报告后,首先分析你所观察到的行为是否确实是漏洞还是误报。不要用原始模糊测试报告骚扰WPScan/供应商——请提供PoC漏洞利用代替。
出于显而易见的原因,示例只会包含已经修复的漏洞。
假设你正在模糊测试版本为6.4.0的 responsive-vector-maps:
./bin/fuzz_object plugin responsive-vector-maps --version 6.4.0
(要模糊测试最新版本,只需省略 --version)。
模糊测试完成后(对于这个插件大约需要10-30分钟),你可以调用:
./bin/print_findings data/object_fuzz_results/
你将看到,其中包括:
.
这意味着模糊测试检测到在已知payload上执行了 fopen()。
大多数payload包含单词 GARLIC,以便在输出中自动检测。你可以在 docker_image/magic_payloads.php 中查看或配置它们。
然后,你可以浏览源代码,发现确实 wp_ajax_rvm_import_markers 端点使用文件内容来渲染输出,从而允许你读取服务器上的任意文件:CVE-2021-24947。
白色显示的是被认为有趣的崩溃(你可以在 crash_detectors.py 中修改它们或添加新的)。绿色是上下文。蓝色显示报告文件名(包含插件名称)、插件流行度和端点名称(此处是ajax动作名称)。
黄色数据是注入到哪些变量中的哪些payload。
假设你正在模糊测试版本为1.4.9.4的 page-builder-add:
./bin/fuzz_object plugin page-builder-add --version 1.4.9.4
打印结果后,你会看到已知payload被回显:
.
然后你可以手动测试这个位置(记住:蓝色部分有端点名称,这里是菜单页面名称)是否容易受到XSS攻击。 在这个例子中,是的:CVE-2021-25067。
./bin/fuzz_object plugin duplicate-page-or-post --version 1.4.6
打印结果后,你会看到 update_option 被调用:
.
分析端点的代码会告诉你,这确实导致了一个存储型XSS漏洞:CVE-2021-25075。
不幸的是,对于大多数插件,模糊测试没有发现任何有趣的崩溃,而对于其余的插件,大多数报告都是误报。例如,如果你看到:
Call: wp_mail arguments={'to': '[email protected]', 'subject': '[Plugin contact] - http://GARLICGARLICGARLIC.example.com'}
这可能意味着 wp_mail 确实被调用,但你无法控制收件人和大部分主题。如果想确认,请查看插件源代码。
__GARLIC_ACCESSED__ _FILES[files] __ENDGARLIC__ ——这意味着检测到了上传文件访问。目前没有进行进一步检查——要检查这是否是一个漏洞,请查看代码。$_GET['page'] 中注入任何内容。首次运行模糊测试或测试可能需要大约一小时,因为我们需要构建带有插桩PHP和WordPress的Docker镜像。
./bin/fuzz_object plugin PLUGIN_SLUG
./bin/fuzz_object theme THEME_SLUG
你还可以从本地zip文件安装插件:
./bin/fuzz_object plugin PLUGIN_FILE_NAME.zip
要打印模糊测试的发现,使用:
./bin/print_findings data/object_fuzz_results/
要运行测试,使用:
./bin/test
警告:测试耗时很长(超过一小时),并且因为它们检查模糊测试是否会发现漏洞,所以有一定概率会失败。
wpgarlic 使用 pre-commit 来运行linters并格式化代码。
pre-commit 在CI上执行,以验证代码格式是否正确。
要在本地运行,使用:
pre-commit run --all-files
要设置 pre-commit 使其在每次提交前运行,使用:
pre-commit install
你可以使用以下命令启动一个仅安装了一个插件的测试环境:
./bin/manual_testing PLUGIN_SLUG|PLUGIN_PATH.zip [version]
你可以使用插件的slug或从本地zip文件安装插件。
它将在 http://127.0.0.1:8001/ 上监听。
数据库中将有两个测试用户:
这个工具是一个概念验证——本节包含可以改进以发现更多漏洞的地方。
你可能希望编辑 filtering.py ——它包含将特定崩溃视为重要或不重要的规则。如果更改它们,可能会有更多误报,但也可能发现更多漏洞。例如,我认为唯一有趣的头信息是Location头,用于检测开放重定向漏洞。这只是其中一个想法,你可能有其他想法。
另一个值得扩展的文件是 docker_image/patch_wordpress.sh。它描述了哪些函数的调用会被记录为有趣。
如果你想注入其他payload(或更改它们被注入的概率),编辑 docker_image/magic_payloads.php 和 docker_image/fuzz/config.py。
crash_detector.py 包含正则表达式,用于查找有趣的崩溃或暴露的有趣信息(例如电子邮件)。
以登录管理员身份模糊测试REST路由已被禁用,因为它会导致误报。取消注释 config.DEFAULT_ENABLED_FEATURES 中的 rest_routes_admin 可以更改此设置。
有些插件需要其他插件(例如woocommerce)作为依赖。在模糊测试一个有依赖的插件时,我们希望只模糊测试选中的插件,跳过其依赖的AJAX动作、REST路由和菜单页面。只有当我们选择模糊测试woocommerce时,才希望模糊测试woocommerce的动作/路由/页面。
依赖动作/路由/页面的列表称为黑名单,列在 docker_image/blocklists/ 中。名为 common 的文件包含WordPress核心动作/路由/页面——我们也不希望模糊测试这些。
要更新这些黑名单,使用 ./bin/update_blocklists。
也许。将插件安装到本地测试环境中(例如,你可以使用 手动测试环境 一节中描述的环境)并分析该bug。
不要这样假设。 模糊测试会发现某些类别的漏洞,但也有其局限性。
对于大多数插件,模糊测试没有发现任何东西——该工具的目的是大规模扫描大量WordPress插件,而不是对一个插件进行全面的测试。
这是可能的。模糊测试随机选择payload,并在其他方面引入随机性(例如==运算符在 https://kazet.cc/2022/02/03/fuzzing-wordpress-plugins.html#patched-equality 描述的情况下应该如何表现)。
提交Github工单或发送电子邮件至:[email protected]。