menu arrow_back 湛蓝安全空间 |狂野湛蓝,暴躁每天 chevron_right ... chevron_right (CVE-2019-15866)WordPress Plugin - Crelly Slider 任意文件上传&RCE漏洞 chevron_right (CVE-2019-15866)WordPress Plugin - Crelly Slider 任意文件上传&RCE漏洞.md
  • home 首页
  • brightness_4 暗黑模式
  • cloud
    xLIYhHS7e34ez7Ma
    cloud
    湛蓝安全
    code
    Github
    (CVE-2019-15866)WordPress Plugin - Crelly Slider 任意文件上传&RCE漏洞.md
    5.83 KB / 2021-07-15 20:10:17
        (CVE-2019-15866)WordPress Plugin - Crelly Slider 任意文件上传&RCE漏洞
    =======================================================================
    
    一、漏洞简介
    ------------
    
    WordPress Crelly
    Slider是一个开源的幻灯片插件。用户可以使用强大的拖放生成器来添加文本、图像、youtube/vimeo视频,并为每个视频制作动画。
    
    WordPress Crelly
    Slider插件具有20,000多个活动安装。该插件在1.3.4及更低版本中出现任意文件上传漏洞。任意经过身份验证的用户(例如订阅者身份)可通过向wp\_ajax\_crellyslider\_importSlider发送带有恶意PHP文件的ZIP压缩文件来利用该漏洞上传文件并将恶意PHP文件解压到插件目录中。
    
    二、漏洞影响
    ------------
    
    三、复现过程
    ------------
    
    ### 漏洞分析
    
    在crelly-slider\\crellyslider.php文件中,存在如下代码
    
    ![](./resource/(CVE-2019-15866)WordPressPlugin-CrellySlider任意文件上传&RCE漏洞/media/rId25.png)
    
    位于上图45行处可见,插件使用if(is\_admin())进行判断,满足条件则可以进入上图if分支,并且在58行处将wordpress/ajax.php文件包含进来
    
    接着来分析下ajax.php文件
    
    在crelly-slider/wordpress/ajax.php中存在如下代码
    
    ![](./resource/(CVE-2019-15866)WordPressPlugin-CrellySlider任意文件上传&RCE漏洞/media/rId26.png)
    
    可见上图520行处注册了一个名为wp\_ajax\_crellyslider\_importSlider 的ajax
    action并指向ajax.php中的crellyslider\_importSlider\_callback方法。
    
    在wordpress插件调用机制里,crellyslider\_importSlider\_callback方法可以通过构造
    
        http://0-sec.org/wordpress/wp-admin/admin-ajax.php?action=crellyslider_importSlider
    
    这样的url来访问
    
    具体调用链如下
    
    ![](./resource/(CVE-2019-15866)WordPressPlugin-CrellySlider任意文件上传&RCE漏洞/media/rId27.png)
    
    在搞清楚crellyslider\_importSlider\_callback方法是如何通过url调用后,继续分析crellyslider\_importSlider\_callback方法
    
    在crellyslider\_importSlider\_callback方法中523行处使用crellyslider\_importSlider方法来处理上传文件,如下图
    
    ![](./resource/(CVE-2019-15866)WordPressPlugin-CrellySlider任意文件上传&RCE漏洞/media/rId28.png)
    
    接着来看下crellyslider\_importSlider方法
    
    ![](./resource/(CVE-2019-15866)WordPressPlugin-CrellySlider任意文件上传&RCE漏洞/media/rId29.png)
    
    crellyslider\_importSlider方法将上传zip文件解压,并将解压后的文件存储于/wordpress/temp/路径中,如上图553行红框处
    
    现在梳理一下上文介绍的流程:
    
    crelly-slider插件将使用is\_admin()方法验证用户是否有使用crellyslider\_importSlider\_callback方法的使用权限。通过is\_admin()方法验证的用户则可以使用crellyslider\_importSlider\_callback方法上传任意zip压缩包,程序将上传的压缩包中的文件解压至/wordpress/temp/路径。
    
    能使整个流程执行的前提是通过is\_admin()的校验。但是is\_admin()方法具体是做什么的呢?它是否像字面上看起来的那样:判断用户是否是管理员身份吗?------答案是否定的。
    
    is\_admin方法只是用来确定当前请求是否是针对管理界面页面。使用if(is\_admin())只是为了确保if条件中的代码在后端管理界面加载,而不会再前台管理界面加载
    
    is\_admin方法并没有核实用户是否是管理员身份的能力,其代码如下图:
    
    ![](./resource/(CVE-2019-15866)WordPressPlugin-CrellySlider任意文件上传&RCE漏洞/media/rId30.png)
    
    因此crelly-slider插件开发者误用了is\_admin方法,错误的将其用来判断当前操作的用户身份是否为管理员身份。
    
    事实上,只要是是后台文件,都会定义WP\_ADMIN常量为true,例如本次漏洞的入口:wp-admin/admin-ajax.php文件,如下图
    
    ![](./resource/(CVE-2019-15866)WordPressPlugin-CrellySlider任意文件上传&RCE漏洞/media/rId31.png)
    
    可见上图17-19行,使用常量WP\_ADMIN来标识这是一个后台文件
    
    这就导致了无论什么身份的用户,只要访问后台文件,is\_admin方法都会返回true
    
    我们新建一个名为subscriber的用户,其权限为订阅者权限(subscriber)
    
    ![](./resource/(CVE-2019-15866)WordPressPlugin-CrellySlider任意文件上传&RCE漏洞/media/rId32.png)
    
    在wordpress中,订阅者权限具有极低的权限:
    
    "具有订阅者用户角色的用户可以登录WordPress站点并更新自己的配置。他们可以根据需要更改密码。订阅者用户角色无法在WordPress管理后台内撰写文章,查看评论或执行任何其他操作。订阅者用户角色无权访问设置,插件或主题,因此无法更改网站上的任何设置"
    
    订阅者wordpress管理页面如下
    
    ![](./resource/(CVE-2019-15866)WordPressPlugin-CrellySlider任意文件上传&RCE漏洞/media/rId33.png)
    
    crelly-slider插件开发者的本意是希望"is\_admin"用户拥有调用crellyslider\_importSlider
    ajax接口的权限,但实际上,subscriber身份的用户仍有权限使用crellyslider\_importSlider
    ajax接口上传压缩包并将其中内容解压到/wordpress/temp/路径中
    
    在我们构造的webshell.php文件中写入如下代码
    
    ![](./resource/(CVE-2019-15866)WordPressPlugin-CrellySlider任意文件上传&RCE漏洞/media/rId34.png)
    
    并将其压缩至webshell.zip中
    
    ![](./resource/(CVE-2019-15866)WordPressPlugin-CrellySlider任意文件上传&RCE漏洞/media/rId35.png)
    
    使用subscriber身份的用户的cookie,发送如下POST请求
    
    ![](./resource/(CVE-2019-15866)WordPressPlugin-CrellySlider任意文件上传&RCE漏洞/media/rId36.png)
    
    webshell.zip 中的webshell.php将会被解压到wordpress\\temp目录下,如下图
    
    ![](./resource/(CVE-2019-15866)WordPressPlugin-CrellySlider任意文件上传&RCE漏洞/media/rId37.png)
    
    通过访问这个地址,webshell.php中的内容将会被执行
    
    四、参考链接
    ------------
    
    > <https://xz.aliyun.com/t/6841>
    
    
    links
    file_download