Fork me on GitHub

wordpress-5.0-rce-漏洞复现(从环境搭建到代码执行)

当你觉得很累的时候,说明你正在走上坡路。

看了网上大佬们的分析,作为代码审计入门级别的我,看大佬分析都很吃力,很多地方看得稀里糊涂…所以决定动手跟踪下,看下到底怎么触发漏洞,也学习下大佬们的思路,积累些经验。参考了seebug paper seebugpaper与绿盟的分析nsfocusblog

前言

看了网上大佬们的分析,作为代码审计入门级别的我,看大佬分析都很吃力,很多地方看得稀里糊涂…所以决定动手跟踪下,看下到底怎么触发漏洞,也学习下大佬们的思路,积累些经验。参考了seebug paper seebugpaper与绿盟的分析nsfocusblog

环境

  • windows 10
  • phpstudy (php-7.0.12-nts+Apache)
  • wordpress 5.0.0 (注: 官网的影响版本被修复了,自己去其他地方下载)
  • ImageMagick-6.9.3-Q16

准备

  • step1 查看phpinfo参数

    这几个参数和step2中ImageMagick和php-imagick扩展版本必须对应

  • step2 下载对应ImageMagick和php-imagick扩展

    • php-imagick扩展下载:php-imagick

      比如我的是windows,php7.0 nts,vc14,x86,non safety,那么我选择如下

    • 将下载的扩展包下的

      将红色部分放到php安装目录(有php.ini)下,黄色部分放到安装目录的ext目录下

    • 在php.ini中添加imagick扩展

      修改配置后重启查看phpinfo

      去imagemagick官网下载对应版本如上图我应该下载ImageMagick 6.9.3-7 Q16 x86,下载之后配置环境变量,配置好了可以使用convert命令查看是否安装好

  • step3 测试php-imagick能否正常工作与能不能远程加载图片

    1
    2
    3
    4
    <?php
    $image = new Imagick();
    $image->readImage('http://bpic.588ku.com/element_origin_min_pic/19/03/01/5011d5b976536a8e0807d11da668db43.jpg');
    ?>

    如果不能远程加载,那么修改下wordpress的wp-includes/class-wp-image-editor-imagick.php的153行:

  • step4 wordpress安装

    wordpress安装就不说了,一路点击安装

    安装完成后,使用管理员登陆,创建一个具有author权限的用户(利用此漏洞最低权限为author)

漏洞利用链

  • 通过post meta变量覆盖,将数据库中的图片的_wp_attached_file变量覆盖,这一步是为下一步写入图片马到目录做铺垫
  • 通过图片裁剪功能,将裁剪后的图片写到我们设定的目录下
  • 通过post meta变量覆盖,设置_wp_page_template,指定template为图片马
  • 在模板加载时包含恶意裁剪的图片马

漏洞复现

  • step1 制作一张图片马

    我使用的MagickEXIF修改器MagickEXIF修改图片的exif信息制作的图片马

    使用方式是直接拖进MagickEXIF,修改图片exif信息就可以了

  • step2 覆盖_wp_attached_file变量

    • 上传setp1制作的图片马

      此时查看wordpress数据库的wp_postmeta表,_wp_attached_file默认是图片上传所在路径(即wp-content/uploads/2019/03

    • 编辑图片信息并抓包

      抓包

      在repeater中修改包,添加如下内容:

      1
      &meta_input[_wp_attached_file]=2019/03/3-1.jpg#/../../../../themes/twentynineteen/shell.jpg

      注意#前半部分setp1图片上传所在路径,后半部分可以任意。使用repeater重新发包记得删掉content-length

    • 查看wp_postmeta表,_wp_attached_file已经被覆盖

  • step3 裁剪图片,将裁剪后的图片写到任意目录下(我上面的路径为wp-content/themes/twentynineteen/shell.jpg

    抓包

    在repeater中,将post数据修改为如下(记得删除content-length,数据包中的_ajax_nonce为你数据包中的nonce,id你数据包 中的postid):

    1
    action=crop-image&_ajax_nonce=e6c1b51c5b&id=22&cropDetails[x1]=10&cropDetails[y1]=10&cropDetails[width]=500&cropDetails[height]=750&cropDetails[dst_width]=100&cropDetails[dst_height]=100

    查看下文件exif信息,恶意代码还保留着

  • step4 覆盖_wp_page_template变量

    • 再上传一个txt文件,和前面上传图片一样

    • 修改文件信息并抓包改包

      数据包中添加(图片为刚裁剪后的图片)

      1
      &meta_input[_wp_page_template]=cropped-shell-e1551529756623.jpg

      查看数据库,_wp_page_template被覆盖为了我们指定的值

  • step5 包含图片马

    查看text.txt的附件信息,图片马被包含

分析

_wp_attached_file变量覆盖

进入编辑

进入更新post data

进入wp_insert_attachment

进入wp_insert_post

最后到更新_wp_attached_file这里,可以看到我们自己传递的数据经过一系列复杂的操作及过滤依然没有变

裁剪图片,将裁剪后的图片写到任意目录下

进入do_action处理,然后进入到wp_ajax_crop_image

进入wp_crop_image,可以看到取出了attachment_file,就是我们开始覆盖的值

创建上传文件夹,这里根据当前日期创建了2019/03文件夹

接着调用editor(这里是imagick)save方法将裁减的内容保存到dst_file,也就将裁剪后的图片马保存了我们设置的地方

_wp_page_template覆盖

这一步和__wp_attached_file覆盖一样,至于如何找到的要覆盖这个变量,应该需要熟悉wordpress和足够的审计经验。我这种小白是不知道大佬如何找的…

包含裁剪图片马

根据网上的一些分析,函数get_page_templateget_single_template这两个在函数中调 用了get_page_template_slug函数,而get_page_template_slug又从数据库获取了_wp_page_template

只需要找到调用了get_page_templateget_single_template的地方,模板就能被包含

在上面复现的步骤中,我们点击了查看附件,会进入

进入get_single_template,可以看到模板被复赋值为图片马

图片马被包含

相关链接

-------------本文结束感谢您的阅读-------------

本文标题:wordpress-5.0-rce-漏洞复现(从环境搭建到代码执行)

文章作者:Longofo

发布时间:2019年03月03日 - 13:03

最后更新:2019年03月08日 - 09:03

原始链接:http://longofo.cc/wordpress-5.0-rce-漏洞复现(从环境搭建到代码执行).html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

请我吃包辣条也好啊!!!
分享到: