导语:一种新的PHP漏洞利用技术影响着最著名的论坛软件phpBB3。该漏洞允许拿到管理员权限的攻击者执行任意的PHP代码并完全控制整个论坛。
一种新的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并执行任意代码,从而控制整个站点。