2020年12月29日,Wordfence威胁情报团队收到有关WooCommerce Upload Files插件的潜在0day漏洞的警报,该插件是WooCommerce的扩展插件,在超过5,000多个网站上安装。
请注意,这是与WooCommerce主插件不同,它被设计为WooCommerce插件的附加组件。
漏洞说明:未经身份验证的任意文件上传
受影响的插件: WooCommerce Upload Files
插件别名: woocommerce-upload-files
受影响的版本: <59.4
完整版本: 59.4
WooCommerce Upload Files是一个高级插件,旨在让客户在结帐时上传文件以购买定制产品。为了提供此功能,它使用了可公开访问的AJAX函数ajax_manage_file_chunk_upload。
function ajax_manage_file_chunk_upload()
{
global $wcuf_session_model ;
if(!isset($_POST['wcuf_upload_field_name']))
wp_die();
$this->saving_on_session = true;
$buffer = 5242880; //1048576; //1mb
$target_path = $this->get_temp_dir_path();
$tmp_name = $_FILES['wcuf_file_chunk']['tmp_name'];
$size = $_FILES['wcuf_file_chunk']['size'];
$current_chunk_num = $_POST['wcuf_current_chunk_num'];
$file_name = str_replace($this->to_remove_from_file_name, "",$_POST['wcuf_file_name']);
$tmp_file_name = $_POST['wcuf_current_upload_session_id']."_".$file_name;
$upload_field_name = str_replace($this->to_remove_from_file_name, "", $_POST['wcuf_upload_field_name']);
$wcuf_is_last_chunk = $_POST['wcuf_is_last_chunk'] == 'true' ? true : false;
$com = fopen($target_path.$tmp_file_name, "ab");
$in = fopen($tmp_name, "rb");
if ( $in )
while ( $buff = fread( $in, $buffer ) )
fwrite($com, $buff);
fclose($in);
fclose($com);
wp_die();
}
文件名基于可选wcuf_current_upload_session_id参数和wcuf_file_name参数的组合。虽然该函数确实尝试阻止上传具有可执行扩展名的文件,但它通过wcuf_file_name针对危险扩展名列表检查参数中提供的文件名,然后从文件名中删除扩展名而不是阻止请求来这样做。
var $to_remove_from_file_name = array(".php", "../", ".jsp", ".vbs", ".exe", ".bat", ".php5", ".pht", ".phtml",
".shtml", ".asa", ".cer", ".asax", ".swf", ".xap", ";", ".asp", ".aspx",
"*", "<", ">", "::");
例如,上传wcuf_current_upload_session_id参数设置为session1且wcuf_file_name参数设置为 shell.php的文件将导致实际上传的文件被命名session1_shell为.php扩展名。该函数仅运行一次清理过程,因此可以通过发送包含隐藏在另一个被阻止扩展名内的被阻止扩展名的文件名来绕过该功能。例如,如果一个攻击者上传与文件wcuf_current_upload_session_id参数集session1和wcuf_file_name设置为shell.p.phphp,中间.php将被删除,留下最后的文件名session1_shell.php。
不幸的是,该wcuf_current_upload_session_id参数也没有得到足够的清理,并且容易受到目录遍历的影响。例如,如果发送的请求的wcuf_current_upload_session_id参数设置为../../../../file,参数设置wcuf_file_name为info.p.phphp,则结果文件将被命名file_info.php并最终出现在webroot中。
这也意味着双重扩展攻击是可能的。例如,将wcuf_file_name参数设置为test和将wcuf_current_upload_session_id参数设置为info.php.将导致其文件名info.php._test在使用AddHandlerPHP文件指令的Apache环境中可执行。
无论使用哪种方法,能够使用此方法将可执行的PHP文件上传到网站的攻击者都可以感染并完全接管该网站以及同一托管帐户上的任何其他网站。
小心输入净化
随着越来越多的WordPress开发人员专注于安全性,简单的漏洞变得越来越不常见。尽管大多数开发人员都知道净化输入的重要性,但对正确的输入使用正确的功能也很重要,否则清除实际上可以用来绕过安全功能。重要的是要了解函数期望输入的种类及其可能带来的危险。例如,旨在清理要在数据库查询中使用的输入的功能可能无法提供针对跨站点脚本(XSS)的足够保护,而旨在删除脚本标记的功能可能无法针对SQL注入(SQLi)提供保护。通常,完全阻止恶意输入总比试图用错误的功能清除恶意输入要好。
结论
在今天的文章中,我们详细介绍了WooCommerce Upload Files插件中的一个关键0day漏洞,该漏洞可能使攻击者感染并完全接管网站。此漏洞已在59.4版中进行了修补,我们建议所有用户尽快将其更新到最新版本的插件,在撰写本文时为60.1。
如果您认识在其网站上使用此插件的朋友或同事,我们强烈建议将此建议转发给他们,以帮助保护他们的网站,因为这是一个严重的严重问题,可能导致远程执行代码和接管网站。

评论0