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:
Executable → Regular
+22
@@ -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:"
|
||||
|
||||
Reference in New Issue
Block a user