未加星标

Phar反序列化到RCE

字体大小 | |
[开发(php) 所属分类 开发(php) | 发布者 店小二05 | 时间 2019 | 作者 红领巾 ] 0人收藏点击收藏

一种新php漏洞利用技术影响着最著名的论坛软件phpBB3。该漏洞允许拿到管理员权限的攻击者执行任意的PHP代码并完全控制整个论坛。

影响

phpBB是最古老最受欢迎的论坛管理软件。如果攻击者想要控制运行着phpBB3的系统,攻击者通常都会对目标站点安装的插件入手,通过暴力破解,钓鱼或者XSS漏洞来拿到管理员控制面板的访问权限。但是在管理控制面板中无法直接安装插件,也没有什么其他的功能可以被管理员利用来执行任意PHP代码。不过,本文所描述的漏洞允许攻击者突破管理员控制面板,在底层服务器上执行任意PHP代码,然后再进行对站点的完全控制。

phpBB3代码库(300KLOC)中的问题是phar反序列化漏洞。在版本3.2.4中已经修复。

技术细节

如果用户输入未经过过滤处理就传递给PHP中的任意文件系统函数,比如file_exists(),就会产生Phar反序列化漏洞。

该漏洞存在于允许管理员编辑上传到论坛的图片的这个功能上。该功能使用了Imagic这个图片编辑器二进制文件。管理员可以在运行着phpBB3的服务器上设置图片编辑器二进制文件的绝对路径。在更新这个设置之前,phpBB3尝试着使用validate_config_vars()这个函数来验证新的路径。该函数通过检查文件是否确实存在来进行验证,代码如下:

/includes/functions_acp.php

function validate_config_vars($config_vars, &$cfg_array, &$error)
{
case 'absolute_path':
case 'absolute_path_writable':
case 'path':
case 'wpath':
if (!file_exists($path)) {
$error[] = sprintf($user->lang['DIRECTORY_DOES_NOT_EXIST'], $cfg_array[$config_name]);
} 漏洞利用

对于漏洞利用,必须执行下面几个步骤。请注意,我们省略掉了一些技术细节。

上传恶意phar文件

为了触发phar反序列化漏洞,必须提供目标服务器上phar文件的本地路径。

触发phar反序列化漏洞示例:

file_exists('phar:///var/www/phpBB3/files/evil.phar');

这表明攻击者必须将恶意的phar文件上传到目标主机上。因为phpBB3允许用户上传附件并将它们添加到threads和帖子中,那么上传phar恶意文件就很简单了。虽然已经做了白名单策略,只允许上传.jpg和.pdf等,但是攻击者仍然能够将有效的phar文件上传到服务器。这是因为phar文件的扩展名是独立的,如果evil.phpr被重命名为了evil.jpg,上面的触发phar反序列化的示例仍然有效。还有一种 ployglot文件 既是有效的phar文件也是有效的JPG文件。

phar文件扩展名是独立的

file_exists('phar:///var/www/phpBB3/files/evil.jpg'); 处理文件名随机化

当文件上传到phpBB3论坛时(如帖子的附件或图片),文件名是随机生成的。当evil.jpg上传成功时,文件会存储在/phpBB3/files目录下,文件名是随机生成的MD5哈希值,例如2_08cc076da659b5b30de5fbfe10c05270。为了利用phar反序列化漏洞,攻击者必须知道服务器上文件的确切位置。phpBB3的文件名随机化还是比较安全的,因为做了加密处理,所以对文件名进行暴力破解基本上是不可行的。这就意味着,也许我们可以轻易的完成第一步:上传恶意的phar文件,但是第二步:触发phar反序列化漏洞却以失败告终,因为攻击者不知道phar文件的路径。

然而,在上传附件的过程中存在一个缺陷,让攻击者可以预测服务器上的文件名。phpBB3允许用户以块的形式上传文件,也就是一个大文件可以在不同的请求中拆分上传。所有的上传块都会写入到一个临时文件中。当所有的块上传完成形成完整的文件时,对文件名进行随机化并移动到/phpBB3/files目录中。临时文件名由temporary_filepath()函数生成。该函数接收一个参数,这个参数是攻击者想要上传的phar文件的文件名,在我们这个例子中,该参数也就是evil.jpg。

/includes/functions_acp.php

protected function temporary_filepath($file_name)
{
// Must preserve the extension for plupload to work.
return sprintf( 'files/plupload/%s_%s%s', $this->config['plupload_salt'], md5($file_name), \phpbb\files\filespec::get_extension($file_name)
);
}

这个函数返回文件名,包含一个上传的盐值,还有文件名的MD5哈希值,文件名也就是evil.jpg,还有$file_name的扩展名.jpg。由于$file_name是攻击者可以控制的,现在文件名中唯一未知的部分是plupload_salt这个盐。这个salt是经过加密的安全随机的哈希值,而且对于每一个phpBB3管理面板都是唯一的,并且在论坛面板安装时生成。然而,这个哈希值存储在数据库中的phpbb_config表中。管理员权限可以从管理控制面板下载mysql数据库备份。这也就意味着攻击者可以轻易的下载备份文件,然后提取其中的plupload salt。这样一来,攻击者就可以预测服务器上phar文件的完整路径了。

临时文件将存储在服务器上,直到所有的块文件发送完成。攻击者可以发起文件上传并告诉phpBB3将发送两个块。通过第一个块上传Phar文件,但一直不发送第二个块,这样攻击者可以骗过phpBB3,让其一直等待第二个块上传,这样就不会删除临时文件。如此一来,攻击者就能够上传文件并知道本地文件名。

触发漏洞并执行代码

利用Phar反序列化的最后一步是找到可能被滥用来执行恶意操作的POP gadgets。我们成功找到了一个POP链,允许攻击者在服务器上创建任意文件并将PHP代码注入文件。这意味着攻击者可以轻松的在目标服务器上创建shell.php并执行任意代码,从而控制整个站点。

本文开发(php)相关术语:php代码审计工具 php开发工程师 移动开发者大会 移动互联网开发 web开发工程师 软件开发流程 软件开发工程师

分页:12
转载请注明
本文标题:Phar反序列化到RCE
本站链接:https://www.codesec.net/view/627938.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(php) | 评论(0) | 阅读(31)