cutover: retirar en cada import la inyeccion de SEO spam del #183

Buscando si Wordfence habia que reinstalarlo limpio (#183 comment-492) resulta
que Wordfence NO esta instalado en produccion. Lo que si queda es una opcion
llamada 'wordfence_core_options' que no es suya: es el payload del atacante,
disfrazado con ese nombre para pasar por legitimo.

Cifrado con un cesar de una letra (ejw->div, tuzmf->style, isfg->href). Una vez
descifrado:

  <div style="position: absolute;margin-top: -110px;">
    <div style="position: absolute; left: -7585px;">
      <a href="https://1xbetjap.com/ja/casino/">

Un div fuera de pantalla con enlaces a un casino japones, con el campo output
apuntando a wp_footer. Esto explica los "dos POST a wp-admin/options.php" del
comment-492, que se habian atribuido a que el atacante toco la configuracion de
Wordfence: lo que hacia era crear esta opcion.

Hoy esta inerte porque quien la leia era el plugin wp-highlits, en cuarentena.
Pero viaja dentro del dump, asi que CADA import la reintroduce en el servidor
nuevo: por eso va aqui y no como limpieza manual de una vez.

Se preserva el valor en /data/feadulta-migracion/evidencia-183/ antes de borrar.

Barrido de la BD del destino: es la unica. 0 en post_content, 0 enlaces ocultos
fuera de pantalla en el contenido, 0 referencias a las IPs del atacante.

Nota sobre el escaneo previo del dump: lo di por limpio buscando <script, eval(,
base64_decode y gzinflate. Este payload no lleva ninguno de esos patrones y paso
el filtro. El escaneo por firmas conocidas no acredita limpieza.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-31 19:34:12 -04:00
parent 508a6b4178
commit 0ee9a2eef5
+22
View File
@@ -70,6 +70,28 @@ for hook in wpseo-reindex wpseo_permalink_structure_check wppb_review_check cozm
fi
done
echo ""
echo "=== 3b. Retirar la inyeccion de SEO spam del incidente #183 ==="
# La opcion 'wordfence_core_options' NO es de Wordfence (que ni siquiera esta instalado):
# es el payload que dejo el atacante, cifrado con un cesar de una letra, con un div oculto
# (left:-7585px) y enlaces a un casino japones, enganchado a wp_footer. Hoy esta inerte
# porque quien lo leia era el plugin wp-highlits, en cuarentena. Pero VIAJA EN EL DUMP,
# asi que cada import lo reintroduce. Se preserva antes de borrar (evidencia del #183).
SPAMOPT=wordfence_core_options
if [ $DRY -eq 1 ]; then
echo " [dry-run] preservaria y borraria la opcion $SPAMOPT"
else
ssh -o BatchMode=yes "$SRV" "bash -s" <<REMOTE
RP=\$(docker inspect mysql-$U --format '{{range .Config.Env}}{{println .}}{{end}}' | sed -n 's/^MYSQL_ROOT_PASSWORD=//p')
m() { docker exec mysql-$U mysql --default-character-set=utf8mb4 -uroot -p"\$RP" -N -e "\$1" wordpress 2>/dev/null; }
EV=/data/feadulta-migracion/evidencia-183; mkdir -p "\$EV"
m "SELECT option_value FROM wp_options WHERE option_name='$SPAMOPT';" > "\$EV/${SPAMOPT}.\$(date +%Y%m%d%H%M%S).txt"
m "DELETE FROM wp_options WHERE option_name='$SPAMOPT';"
n=\$(m "SELECT COUNT(*) FROM wp_options WHERE option_name='$SPAMOPT';")
echo " $SPAMOPT: preservada y borrada (quedan \$n)"
REMOTE
fi
echo ""
echo "=== 4. Verificacion ==="
echo " administradores que quedan:"