首页
社区
课程
招聘
[原创][Web安全] (暗网论坛)phpBB Phar反序列化远程代码漏洞分析
发表于: 2019-10-17 14:29 1889

[原创][Web安全] (暗网论坛)phpBB Phar反序列化远程代码漏洞分析

2019-10-17 14:29
1889

小弟初来看雪,希望能升级,一起学习Web知识还有Web中涉及的bin知识。
图片描述
phpBB™ 已经成为世界上应用最广泛的开源论坛软件,包括暗网论坛也在使用。

在phpBB v3.2.3及以前的版本中,控制管理面板设置路径的$_REQUEST['config']参数过滤不严格,和不严谨的switch语句,引发获取webshell的严重安全问题。
图片描述

攻击者若通过社工,弱口令,钓鱼等方式拥有控制管理面板权限,可先前台上传恶意附件,再进入后台控制管理面板利用设置中对路径的验证的功能,结合PHP phar 反序列化进行php对象注入,构造可用的恶意攻击链,获取Webshell。

先看触发php phar反序列化漏洞的核心代码如下:

文件位置:phpBB3/includes/functions_acp.php::validate_config_vars
图片描述

通过file_exists函数判断$path是否存在,此处若可以被我们上传PHAR归档包,文件路径若被我们可知可控,就可以通过phar://协议进行反序列化攻击。

首先是载入的时候调用acp_attachments->main()方法

文件位置:phpBB3/includes/acp/acp_attachments.php
图片描述

关键函数为validate_config_vars函数,第一个参数为$display_vars['vars']来自上文的系统配置定义:

图片描述

第二个参数通过$_REQUEST接收,post发送数组参数config,被赋值成为$cfg_array

两个参数传入validate_config_vars函数,继续跟进。

文件位置:phpBB3/includes/functions_acp.php

图片描述

进入函数后使用foreach$config_vars进行遍历,键名为$config_name,键值为$config_definition

先对$cfg_array进行判断,也就是post数组中必须有和系统配置数组相同的键名的数组;然后又对键值的判断是否存在$config_definition['validate']。两个条件需要同时满足,不满足就跳过此变量循环,存在就对$config_definition['validate']进行分割为数组,并取第0个参数传进switch进行匹配,可以发现利用点在wpath分支里:

图片描述

满足上文两条件并且$validator[$type]==wpath才能进入分支,对系统配置数组进行筛选,暂时发现只有键名为upload_path的数组满足条件。

但是在进入路径判断前有一个三元运算

经过判断$config_definition['validate']在数组之中,所以会走第一个分支,$cfg_array[$config_name]就是post数组变量,此处可控,但是会和$phpbb_root_path进行拼接。
文件位置:phpBB3/adm/index.php

图片描述

因此拼接后的$path会变成./../xxxxxxxxxx,路径出错无法利用,如下。

图片描述

但是这里的整个switch语句犯了一个较为低级的错误,部分条件的语句段没有使用break进行结束。

switch执行方式:开始时没有代码被执行。仅当一个 case语句中的值和 switch表达式的值匹配时 PHP 才开始执行语句,直到switch的程序段结束或者遇到第一个break 语句为止。如果不在case的语句段最后写上break的话,PHP 将继续执行下一个case中的语句段。

图片描述

因此需要在$config_vars找到一个元素$config_definition,并且$config_definition['validate']等于absolute_path或者absolute_path_writable或者path,这样就能即进入wpath执行也不增加$path的前缀

使用如下代码过滤:

发现img_imagick元素满足条件:

图片描述

进入控制面板的附件设定,提交并该修改数据包

图片描述

数据包如下,关键点为config[img_imagick]参数:

此时已经可以触发反序列化,还需上传包含利用链的恶意附件。

上传位置为前台发帖附件处:

图片描述

处理文件上传的关键函数,以及函数调用栈:

文件位置:phpBB3/phpbb/plupload/plupload.php

图片描述

在这里函数handle_upload可以实现多个chunk处理。$this->request->variable函数根据键名从请求中获取值,首先获取chunks的值,并判断chunk是否小于2,如果小于就直接返回,如果大于就开始进行多chunk处理。

然后进入关键的temporary_filepath函数:

图片描述

这个就是计算上传文件路径的函数,$this->temporary_directory可知为./files/plupload$file_name可控,\phpbb\files\filespec::get_extension($file_name)获取文件的后缀同样可控,比较麻烦的是$this->config['plupload_salt']存在于数据库中,但可以在管理面板中通过备份进行获取。

图片描述

plupload_salt如下

图片描述

此时已经完全可以计算路径

然后进入函数进行文件写入

图片描述

中途会产生一个临时文件,但后面会删除,最后文件名还会增加.part后缀。

攻击数据包如下:

至此我们已经对上传文件路径内容可知可控,还恶意文件中的利用链。

利用PHP网络请求插件Guzzle完成反序列化利用。

文件位置:phpBB3/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php

图片描述

析构函数调用save函数,最后使用file_put_contents完成文件写入,整个漏洞利用完成。

参考链接:


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-10-17 18:39 被Rai4over编辑 ,原因:
收藏
免费 4
支持
分享
最新回复 (2)
雪    币: 26205
活跃值: (63302)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
2
欢迎!感谢分享~期待更多精彩文章!
2019-10-21 10:57
0
游客
登录 | 注册 方可回帖
返回
//