CVE-2023-5360 WordPress Royal Elementor 任意文件上传
漏洞信息
漏洞名称:WordPress Royal Elementor 任意文件上传
漏洞介绍:WordPress Royal Elementor 插件 1.3.78 及之前的版本允许未经身份验证的攻击者在易受攻击的网站上执行任意文件上传
影响应用:”WP Royal” 的 Royal Elementor 插件和模板是一个网站构建工具包,无需编码知识即可快速创建 Web 元素。据 WordPress.org 称,它的活跃安装量超过 200,000 次。
利用前提:版本 < 1.3.79 且该网站使用了这个插件提供的主题( 文件上传需要使用到 wpr_addons_nonce 参数 => JS 中的 WprConfig 变量 )
环境搭建
https://downloads.wordpress.org/plugin/royal-elementor-addons.1.3.78.zip
安装的时候还得安装个 Elementor 插件:
漏洞分析
文件上传在 wp-content\plugins\royal-elementor-addons\classes\modules\forms\wpr-file-upload.php 的 handle_file_upload() 函数中:
开始是先验证了个随机数:
这个东西是可能会输出到页面的,搜索一下 wpr-addons-js,这里是给一个叫 WprConfig JS 对象:
直接搜索一下就能找到:
PS :必须使用该插件的模板才会显示这个 WprConfig,不使用的话就没有
接着向下,使用 file_validity 函数做验证,然后通过 wp_unique_filename 生成文件名上传:
它的白名单不是固定的,而是说可以从 POST 获取一个白名单,不过最后还有一个黑名单检验:
黑名单列表:
白名单可控,黑名单就不行了。黑名单不是很全,就比如 phar 没有,不过这个后缀还需要服务器能解析,所以利用点不在这里,而是下面通过wp_unique_filename 生成文件名的时候:
https://developer.wordpress.org/reference/functions/wp_unique_filename/
它的内部会调用 sanitize_file_name 函数处理文件名:
https://developer.wordpress.org/reference/functions/sanitize_file_name/
它会去掉文件名中这样的字符串:
那么搞个像 ph?p、ph[p 的白名单上传后就是个 php 文件了。EXP 还没有公开,所以刚开始也没发现上传这个地方,不过看到了这个:
这里任意文件上传就搞完了,接着就找找哪里触发:
被加入到了 wp_ajax 里面,不跟了,直接向 /wp-admin/admin-ajax.php 发送相关数据包就行,找了下表单就是这些东西:
搞搞直接发包试一下:
也是成功上传了:
漏洞修复
https://downloads.wordpress.org/plugin/royal-elementor-addons.1.3.79.zip
这里修复是使用 wp_check_filetype() 它的作用是用来检测文件名的后缀和指定的 MIME 是否匹配,这里没有指定所以默认的是 get_allowed_mime_types() 中的 wp_get_mime_types 指定的,我们上传的 php 它默认的是没有这个 MIME 的,导致这里直接为 false :
https://developer.wordpress.org/reference/functions/wp_get_mime_types/
学习总结
当使用 wordpress 的 wp_unique_filename
方法去生成文件名的时候会导致如 ph?p 这种类型的后缀时会导致其生成 php 的文件名。