
CVE-2026-19949 के लिए प्रतिलिपि योग्य Docker-आधारित प्रूफ-ऑफ-कॉन्सेप्ट, जो All-in-One WP Migration <= 7.109 में दूसरे-क्रम का SQL इंजेक्शन है, जो अनाम REST के माध्यम से ai1wm_secret_key लीक करता है और रिमोट कोड निष्पादन तक बढ़ जाता है।
All-in-One WP Migration and Backup (WordPress) में बिना प्रमाणीकरण के दूसरे क्रम की SQL इंजेक्शन
जो ai1wm_secret_key के रिसाव तक बढ़ती है, और इसके साथ, रिमोट कोड एक्ज़ीक्यूशन (RCE) तक।
इसे पढ़ें: English · Español
| CVE | CVE-2026-19949 |
| प्लगइन | All-in-One WP Migration and Backup (ServMask), ≤ 7.109 |
| पैच | 7.110 (20 अगस्त 2026) |
| CVSS | 8.8 (उच्च) — AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| आवश्यकता | कि कोई व्यवस्थापक साइट को एक्सपोर्ट और रिस्टोर करे (इस प्लगइन के साथ नियमित क्रिया) |
| शोधकर्ता | Jack Taylor (Wordfence बग बाउंटी प्रोग्राम) |
⚠️ केवल शैक्षिक और रक्षात्मक उपयोग के लिए। यह लैब एक WordPress साइट पर हमला करता है जो आपकी अपनी मशीन पर, Docker कंटेनरों के भीतर चलती है। इसे उन सिस्टमों के खिलाफ उपयोग न करें जो आपके नहीं हैं या जिनके लिए आपके पास स्पष्ट प्राधिकरण नहीं है।
प्लगइन का एक्सपोर्ट/इम्पोर्ट प्रवाह डेटाबेस को SQL में डंप करता है
(.wpress के भीतर database.sql) और, इम्पोर्ट करते समय, प्रत्येक स्टेटमेंट को
URL और टेबल प्रीफिक्स को बदलने के लिए Ai1wm_Database::replace_table_values() के साथ
फिर से लिखता है। स्ट्रिंग लिटरल्स का पता लगाने के लिए यह regex का उपयोग करता है:```php
// 7.109 (vulnerable) — class-ai1wm-database.php:1637
preg_replace_callback( "/'(.*?)(?<!\\)'/S", array( $this, 'replace_table_values_callback' ), $input );
समस्या *negative lookbehind* `(?<!\\)` में है: यह **प्रत्येक संभावित समापन उद्धरण से पहले केवल एक बाइट की जाँच करता है**, बजाय backslashes के पूरे *run* की गिनती करने के। MySQL डंप में, `\` पर समाप्त होने वाला डेटा `...\\'` के रूप में लिखा जाता है — एक समापन उद्धरण जिसके पहले backslashes की **सम** संख्या होती है (वास्तविक स्ट्रिंग backslash पर समाप्त होती है) — लेकिन regex इसे escaped मान लेता है और **अगले literal को over-capture कर लेता है**। फिर callback उस over-captured मान पर `unescape_mysql → replace_serialized_values → escape_mysql` निष्पादित करता है, और यह चक्र उद्धरणों/backslashes का एक असंतुलित अनुक्रम फिर से उत्सर्जित करता है जो परिणामी स्टेटमेंट में **MySQL स्ट्रिंग की सीमा को पलट देता है**, जिससे हमलावर का डेटा executable SQL में बदल जाता है।
## 2. मूल कारण: regex जो स्ट्रिंग को पलट देता है
Trackback स्थापित होने के साथ (देखें §4), `database.sql` में पंक्ति है:```sql
INSERT INTO `…_comments` VALUES (2,4,'Jack Blogs\\\\','','/*payload*/…','172.18.0.1',…);
एल author \ पर डेटा स्तर पर समाप्त होता है → डंप इसे \\ के रूप में लिखता है →
समापन उद्धरण एक सम run से पहले आता है। regex अगले फ़ील्ड के उद्घाटन उद्धरण
तक अधिक-कैप्चर करता है और callback पूरे सेट को फिर से एस्केप करता है:```
'Jack Blogs\\',' ← contenido sobre-capturado
unescape → 'Jack Blogs\',' ← strtr colapsa los pares
escape → 'Jack Blogs\\', ← una comilla ESCAPADA nueva ha aparecido
salida → 'Jack Blogs\\','…' ← el par \ , ' voltea el límite de la cadena
उस बिंदु से, स्टेटमेंट में जो कुछ भी आगे था, उसे बदली हुई समानता (parity) के साथ फिर से टोकनाइज़ किया जाता है (जो डेटा स्ट्रिंग था वह कोड बन जाता है और इसके विपरीत)। 7.110 का पैच किया गया regex उसी लाइन को प्रोसेस करता है और उसे **बिल्कुल समान** लौटाता है।
आप इसे बिना कुछ एक्सप्लॉइट किए, `make demo-flip` (`exploit/04_demo_flip.php`) के साथ बाइट-दर-बाइट देख सकते हैं, जो प्लगइन 7.109 और 7.110 के वास्तविक कोड को डंप की गई उसी लाइन पर चलाता है।
## 3. पैच (7.109 → 7.110)```diff
- $input = preg_replace_callback( "/'(.*?)(?<!\\\\)'/S", array( $this, 'replace_table_values_callback' ), $input );
+ $input = preg_replace_callback( "/'((?:[^'\\\\]++|\\\\.)*+)'/sS", array( $this, 'replace_table_values_callback' ), $input );
नया पैटर्न MySQL लिटरल्स को सही ढंग से टोकनाइज़ करता है: या तो एक कैरेक्टर जो
कोट/बैकस्लैश नहीं है, या एक एस्केप पेयर \x, पॉज़ेसिव क्वांटिफायर्स के साथ। बैकस्लैश
का एक सम पेयर अब लिटरल के बंद होने को भ्रमित नहीं करता।
Wordfence द्वारा प्रकाशित श्रृंखला (सितं. 2026) में चार चरण हैं:
wp-trackback.php?p=<id>)। ब्लॉग नाम
(→ comment_author) \ पर समाप्त होता है और URL (→ comment_author_url) पेलोड
ले जाता है। WordPress उन्हें बैकस्लैश को छुए बिना संग्रहीत करता है। प्रकाशित
वैरिएंट में, पहला ट्रैकबैक टाइम बम के रूप में कार्य करता है: यह आयात पास के
कटऑफ (10 सेकंड की सीमा) को मजबूर करता है ताकि पेलोड बाद के पास में निष्पादित हो,
जब आयातक ने पहले ही साइट की ai1wm_secret_key को wp_options में पुनर्स्थापित कर
दिया हो (निर्यातक इसे डंप से बाहर रखता है; आयातक इसे पासों के बीच फिर से लिखता है)।ai1wm_secret_key को comment प्रकार की एक स्वीकृत टिप्पणी
में कॉपी करता है, जो बिना प्रमाणीकरण के टिप्पणियों की REST API में दिखाई देती है।admin-ajax.php?action=ai1wm_import अनाम उपयोगकर्ताओं के लिए भी पंजीकृत है
(wp_ajax_nopriv_ai1wm_import) और इसकी एकमात्र बाधा ai1wm_verify_secret_key() है।
फ़िल्टर की गई कुंजी के साथ, हमलावर अपने स्वयं के .wpress के साथ आयात श्रृंखला चलाता
है जिसमें एक mu-plugin शामिल होता है; चरण Ai1wm_Import_Mu_Plugins (श्रृंखला की
प्राथमिकता 270) इसे wp-content/mu-plugins/ में निकालता है → अगली लोड पर कोड निष्पादन।यह रिपॉजिटरी श्रृंखला को शुरू से अंत तक एक ही रोपित ट्रैकबैक के साथ सत्यापित करता है (प्रयोगशाला में टाइम बम आवश्यक नहीं है: पंक्ति कुंजी के रीसेट के बाद बाद के पास में निष्पादित होती है)।
शोधकर्ता का सटीक एक्सप्लॉइट सार्वजनिक नहीं है (2026-09-07 को व्यापक खोज:
GitHub — मौजूद 2 रिपॉजिटरी एक खाली टेम्पलेट और गैर-मौजूद एंडपॉइंट्स वाला एक बड़ा टूल हैं —,
Exploit-DB/PacketStorm 0, Sploitus केवल उन नकली रिपॉजिटरी को अनुक्रमित करता है, WPScan बिना PoC,
फोरम केवल समाचार; फोरेंसिक विवरण research/poc-publica/ANALISIS.md में)।
हम इसे स्वयं व्युत्पन्न करते हैं तंत्र के विश्लेषण से (exploit/investigacion/)। डिज़ाइन:
\ पर समाप्त होता है → कमजोर regex का एक-बाइट लुकबिहाइंड अगले लिटरल को
अधिक-कैप्चर करता है और अनएस्केप→एस्केप चक्र स्ट्रिंग की सीमा को पलट देता है।comment_author और एक स्ट्रिंग , विस्थापन को अवशोषित करते हैं; URL में एक
प्रारंभिक अल्पविराम खाए गए संरचनात्मक विभाजक को पुनर्स्थापित करता है)।/**/ विभाजकों के साथ प्रदान करता है:
\' के रूप में पहुंचता है और कोड क्षेत्र में एक अनाथ
बैकस्लैश छोड़ देगा (त्रुटि 1064) → इसलिए हेक्स (0x616931776d… = "ai1wm_secret_key");sanitize_url रिक्त स्थान हटाता है (और / से शुरू न होने वाली हर चीज़ के आगे http:// जोड़ता है)
→ इसलिए शुरुआत /*pwn*/ और /**/;comment_author_url) = कुंजी पढ़ने वाली सबक्वेरी → कुंजी एक सार्वजनिक
फ़ील्ड में समाप्त होती है; 11वां = 0x31 ('1', स्वीकृत टिप्पणी); 13वां = 0x636f6d6d656e74
('comment', अनाम REST में दिखाई देने वाला);) टपल को ठीक 15 मानों के साथ बंद करता है और # (बिना स्थान वाला MySQL कमेंट, जिसे
sanitize_url सम्मानित करता है) मूल स्टेटमेंट के शेष भाग को निष्प्रभावी करता है।SERVMASK_PREFIX_options को संदर्भित करती है: आयातक SERVMASK→वास्तविक उपसर्गों को
regex पास से पहले फिर से लिखता है, इसलिए पेलोड किसी भी टेबल उपसर्ग वाली साइटों पर काम
करता है (सत्यापित)। लक्ष्य का एकमात्र विशिष्ट डेटा उसका URL है, जो आयातक के strpos फ़िल्टर को
ट्रिगर करने के लिए एक्सर्प्ट में ले जाया जाता है (केवल उन पंक्तियों को फिर से लिखता है जिनमें यह होता है)।परिणामी स्टेटमेंट (जो पुनर्स्थापना के दौरान MySQL निष्पादित करता है):
comment_author_url = (SELECT option_value FROM <उपसर्ग>_options WHERE option_name='ai1wm_secret_key') — असली कुंजी एक ऐसे फ़ील्ड में रहती है जिसे REST API बिना
प्रमाणीकरण के प्रकाशित करती है।
| श्रृंखला का चरण | स्थिति | कहाँ |
|---|---|---|
| पुनरुत्पादन योग्य कमजोर स्थापना (WP 7.1 + प्लगइन 7.109) | ✅ | make lab |
| ट्रैकबैक के माध्यम से अप्रमाणित रोपण (बाइट-सटीक, स्व-स्वीकृत) | ✅ | make plant |
| एडमिन निर्यात; डंप में रोपित पंक्ति होती है | ✅ | make export |
| मूल कारण: regex 7.109 स्ट्रिंग सीमा पलटता है (बनाम 7.110 अक्षुण्ण) | ✅ | make demo-flip |
| एडमिन पुनर्स्थापना: फ्लिप SQL को फिर से लिखता है और 7.109 में पंक्ति को दूषित/खो देता है | ✅ | make restore |
| कुंजी फ़िल्टरिंग (स्वयं का व्युत्पन्न पेलोड) → बिना प्रमाणीकरण के REST के माध्यम से वास्तविक लीक | ✅ | make leak |
| RCE: कुंजी के साथ अप्रमाणित आयात → mu-plugin निष्पादित | ✅ | make rce-auto |
| नकारात्मक नियंत्रण: 7.110 में पंक्ति बिना लीक के अक्षुण्ण बचती है | ✅ | make control-7110 |
| मैट्रिक्स WP 7.1 / 7.0.4 / 6.9.4 / 6.8.3: सभी में पूर्ण श्रृंखला ✓ | ✅ | research/test-wp-versions.sh |
| पूर्ण दूरस्थ श्रृंखला (केवल HTTP, वास्तविक डोमेन के लिए मान्य) | ✅ | python3 cli/poc.py explotar … |
एंड-टू-एंड सत्यापित परिणाम: एडमिन के निर्यात+पुनर्स्थापना के बाद, असली ai1wm_secret_key
GET /wp-json/wp/v2/comments में एक स्वीकृत टिप्पणी के author_url के रूप में दिखाई देती है —
बिना किसी प्रमाणीकरण के — और इसके साथ RCE चरण निष्पादित होता है (mu-plugin निकाला और निष्पादित
किया गया, wp-content/ में साक्ष्य मार्कर)। 7.110 में पंक्ति अक्षुण्ण बचती है (पेलोड निष्क्रिय
डेटा के रूप में रहता है) और कोई लीक नहीं होता।
RCE चरण को इसके अलावा स्वतंत्र रूप से प्रदर्शित किया जाता है: इसका एकमात्र इनपुट कुंजी है,
जिसे मैन्युअल रूप से पास किया जा सकता है (make rce KEY=…) — लीक के बाद हमलावर की सटीक स्थिति।
मैट्रिक्स bash research/test-wp-versions.sh 7.0 6.9 6.8 के साथ निष्पादित
(संस्करण द्वारा पुनर्निर्मित प्रयोगशाला, प्लगइन 7.109, समान पेलोड):
| WordPress | plant | export | restore | leak | RCE |
|---|---|---|---|---|---|
| 7.1.0 | ✓ | ✓ | ✓ | ✓ | ✓ |
| 7.0.4 | ✓ | ✓ | ✓ | ✓ | ✓ |
| 6.9.4 | ✓ | ✓ | ✓ | ✓ | ✓ |
| 6.8.3 | ✓ | ✓ | ✓ | ✓ | ✓ |
तंत्र सभी में स्थिर है: sanitize_url पेलोड का सम्मान करता है, wp_comments 15 कॉलम
संरक्षित करता है और wp-trackback.php परिचालन में रहता है। पेलोड टेबल उपसर्ग से स्वतंत्र है (देखें §5)।
docker-compose.yml WordPress (php8.2-apache) + MySQL 8; PLUGIN_VERSION y WP_VERSION configurables (7.109 por defecto, 7.110 control) docker/wordpress/Dockerfile imagen del sitio víctima: wp-cli + plugin de WordPress.org setup/init.sh core install, activa el plugin, crea la entrada con pings abiertos, comentarios sin moderación exploit/ ← fases numeradas de la PoC 01_plant_trackback.sh Fase 1 — trackback malicioso (no autenticado) 02_export.sh Fase 2a — export del admin (vía aiowpm_client) 03_restore.sh Fase 2b — restauración del admin + ANTES/DESPUÉS de la fila 04_demo_flip.php Causa raíz byte a byte: regex 7.109 vs 7.110 05_build_wpress.py Construye el .wpress malicioso (package.json + mu-plugin) 06_rce_unauth.py Fase 3 — import no autenticada con la clave → RCE 07_leak_key.sh Fase 3a — lee la clave filtrada de la REST anónima aiowpm_client.py Cliente del protocolo AJAX del plugin (export/import por prioridades, como su JavaScript) wpress.py Lector/escritor del formato .wpress (bloques de 4377 B) mu_plugin.php Mu-plugin BENIGNO (marcadores de evidencia, sin shell) investigacion/ Arneses y fuzzers con los que se DERIVÓ el payload: harness.php (pipeline real del plugin + MySQL de prueba), afinar/test/fuzzers, NOTAS.md del análisis cli/poc.py CLI de demostración: lab / scan / verificar / explotar web/index.html Landing bilingüe del CVE (estilo base de datos de vulnerabilidades; sin dependencias externas) research/ test-wp-versions.sh Matriz de compatibilidad por versión de WordPress poc-publica/ANALISIS.md Refutación forense de las «PoC públicas» falsas Makefile Objetivos: lab, plant, export, restore, demo-flip, leak, rce-auto, full-demo, control-7110, demo-cli… README.md / README.en.md Esta documentación (ES/EN) .gitignore Fuera: informes con claves, .wpress generados, zips y fuentes del plugin (terceros), PoC falsas descargadas
Artefactos que se generan al ejecutar y **no se comparten** (ver `.gitignore`):
`informes/` (contienen claves filtradas), `exploit/malicious.wpress`,
`plugin-src/` (fuentes 7.109/7.110 extraídas para diff), `research/*.zip`
(zips originales de WordPress.org), `research/database.sql`,
`research/backup-legit.wpress` y los ficheros de las PoC falsas analizadas.
## 9. Requisitos y arranque rápido
Requisitos: Docker (con el plugin compose), make, python3 con `requests`, curl.```bash
make full-demo # laboratorio completo de cero: lab → plant → export →
# restore → flip → leak → rce (todo lo anterior de una vez)
अपेक्षित आउटपुट (संक्षेपित):``` FASE 1 trackback plantado sin autenticar (error 0, comment_approved=1) FASE 2a export OK → .wpress en ai1wm-backups/ FASE 2b restauración: ANTES hay 2 trackbacks → DESPUÉS solo queda el benigno: la fila con '' final se pierde (INSERT reescrito/corrupto en 7.109) FLIP regex 7.109: 'Jack Blogs\\', → 'Jack Blogs\\',' (límite volteado) regex 7.110: la línea sale IDÉNTICA LEAK ai1wm_secret_key visible en la REST de comentarios sin autenticar RCE import anónima con la clave → /var/www/html/PWNED_CVE_2026_19949.txt + wp-content/mu-plugins/pwned.php + option pwned_cve_2026_19949
पीड़ित साइट तक पहुंच: <http://localhost:8080> — admin / `admin-password-123`
(सार्वजनिक प्रविष्टि ID 4 जिसमें पिंग और खुले टिप्पणियाँ हैं)।
## 10. चरण-दर-चरण चरण (make के लक्ष्य)```bash
make lab # levantar/inicializar el laboratorio (plugin 7.109)
make plant # Fase 1 — plantar el trackback (anónimo)
make export # Fase 2a — exportar como admin
make restore # Fase 2b — restaurar como admin (muestra ANTES/DESPUÉS)
make demo-flip # causa raíz: 7.109 vs 7.110 sobre la misma línea
make leak # Fase 3a — leer la clave filtrada de la REST (anónimo)
make rce KEY=XXXX # Fase 3 — RCE pasando la clave a mano
make rce-auto # Fase 3 — RCE encadenado con la clave filtrada
make control-7110 # control negativo con el plugin parcheado
make lab-7109 # volver al laboratorio vulnerable tras el control
make demo-cli # demo completa vía CLI (+ informe y control negativo)
make scan-cli URL=https://www.ejemplo.com # detección no invasiva
make landing # servir la landing del CVE en http://localhost:8090
make status | logs # estado de contenedores / log de WordPress
make down | clean # parar / parar y borrar volúmenes y artefactos
सभी मोड वाला एक ही कमांड; informes/ में रिपोर्ट उत्पन्न करता है
(टेक्स्ट + JSON; फ़ोल्डर रिपॉजिटरी के बाहर है क्योंकि इसमें कुंजियाँ होती हैं):```bash
python3 cli/poc.py lab # demo completa en el laboratorio (cadena + control 7.110)
python3 cli/poc.py scan https://www.tudominio.com # detección NO invasiva (versión del plugin)
python3 cli/poc.py verificar https://www.tudominio.com # ¿clave ya filtrada? (REST anónima)
python3 cli/poc.py explotar https://www.tudominio.com --acepto-responsabilidad
--admin-user TU_ADMIN --admin-pass TU_CLAVE --rce # cadena completa en TU dominio
- `lab` प्रयोगशाला को उठाता है, पूरी श्रृंखला और नकारात्मक नियंत्रण को 7.110 के साथ चलाता है, और रिपोर्ट लिखता है (`--sin-control` इसे छोड़ने के लिए)।
- `scan` 100% निष्क्रिय है: प्लगइन का सार्वजनिक `readme.txt` पढ़ता है, `wp-trackback.php` और टिप्पणियों की REST जाँच करता है। निर्णय लौटाता है।
- `verificar` फिर से जाँचता है कि क्या कुंजी पहले से अनाम REST में दिखाई देती है (जैसे, प्लांट करने के घंटों बाद, जब एडमिन ने अपना backup+restore कर लिया हो)।
- `explotar` आक्रामक है और `--acepto-responsabilidad` + डोमेन की इंटरैक्टिव पुष्टि की माँग करता है: ट्रैकबैक प्लांट करता है, एडमिन का अनुकरण करता है (export → बैकअप का डाउनलोड → पुनः-अपलोड और restore; **केवल HTTP**, उन क्रेडेंशियल्स के साथ जो आप अपनी साइट के लिए प्रदान करते हैं), फ़िल्टर की गई कुंजी पढ़ता है और, `--rce` के साथ, अनाम आयात के माध्यम से एक हानिरहित मार्कर छोड़ता है। एडमिन क्रेडेंशियल्स के बिना: प्लांट करता है और प्रतीक्षा में रहता है (`--esperar` लीक को झेलने के लिए; `--post-id` प्रविष्टि चुनने के लिए; `--no-interactivo` स्क्रिप्ट के लिए)।
## 12. CVE की लैंडिंग
स्थिर द्विभाषी पृष्ठ (ES/EN, हेडर में स्विचर, प्राथमिकता याद रखी जाती है) जो CVE और पेलोड को भेद्यता डेटाबेस की शैली में समझाता है: सारांश, श्रृंखला, **पेलोड का खंड-दर-खंड इंटरैक्टिव विवरण**, सत्यापन और शमन मैट्रिक्स।```bash
make landing # sirve http://localhost:8090
कोई बाहरी निर्भरता नहीं (न CDN, न तृतीय-पक्ष JS): यह web/index.html को सीधे खोलकर या किसी भी स्टैटिक सर्वर के साथ काम करता है।
wp-trackback.php और pingbacks को बंद करें (डिबेट/WAF विकल्प), जहाँ संभव हो admin-ajax.php को अनाम उपयोगकर्ताओं के लिए प्रतिबंधित करें, और wp-content/mu-plugins/ में फ़ाइलों के प्रकट होने तथा असामान्य संदर्भों (जैसे टिप्पणियाँ) में ai1wm_secret_key विकल्प की निगरानी करें।comment_author \ पर समाप्त होता है या जिनका comment_author_url में SELECT/**/, CONCAT(, लंबे 0x… लिटरल या /*…*/ होता है; स्वीकृत टिप्पणियाँ जिनका author_url बिना स्कीम के 12-वर्णों की अल्फ़ान्यूमेरिक स्ट्रिंग है।exploit/investigacion/): हम एक हार्नेस (harness.php) से शुरू करते हैं जो प्लगइन 7.109 की वास्तविक क्लासेस लोड करता है और एक नकली कुंजी के साथ परीक्षण MySQL के विरुद्ध पाइपलाइन चलाता है। फ़ज़र्स (search_payload.php, fuzz_rows.php, fuzz4.php, bruteforce_author.php) ने ट्रैकबैक के चार नियंत्रणीय क्षेत्रों पर महत्वपूर्ण अक्षरों का अन्वेषण किया; afinar_payload.php ने अभिव्यक्तियों की संख्या (N=12) समायोजित की और test_payload_final.php ने पूर्ण डिज़ाइन को मान्य किया। NOTAS.md विश्लेषण दर्ज करता है, जिसमें संरचनात्मक बाधाएँ शामिल हैं (wp_comments के INSERT के निश्चित क्षेत्र, आयातक द्वारा लगाया गया sql_mode, साइट URL का strpos फ़िल्टर)।research/poc-publica/ANALISIS.md): GitHub के दो रेपो जो इसे होने का दावा करते हैं, वे गैर-मौजूद एंडपॉइंट (permission_callback के साथ aio-migration/v1 बनाम वास्तविक ai1wm/v1), गलत अपलोड फ़ील्ड (file बनाम upload_file), .wpress के बजाय ZIP प्रारूप, और एक गोलाकार आधार का उपयोग करते हैं। किसी भी तृतीय-पक्ष स्रोत के पास अपना स्वयं का PoC नहीं है।lib/vendor/servmask/database/class-ai1wm-database.php:1637 पर है; निकाले गए स्रोत plugin-src/ में रहते हैं, साझा नहीं किए गए)यह सामग्री शैक्षिक और रक्षात्मक उद्देश्यों के लिए प्रकाशित की गई है: भेद्यता को समझना, पैच को सत्यापित करना और पहचान बनाना। श्रृंखला केवल अपने स्वयं के Docker लैब्स के विरुद्ध चलाई गई है। लिखित प्राधिकरण के बिना तृतीय-पक्ष प्रणालियों पर हमला करना अधिकांश क्षेत्राधिकारों में अवैध है। यदि आप प्रभावित साइटों का प्रबंधन करते हैं: ≥ 7.110 पर अपडेट करें, ai1wm_secret_key को घुमाएँ (प्लगइन को निष्क्रिय/पुनः सक्रिय करें या विकल्प हटाएँ ताकि यह पुनः उत्पन्न हो) और wp-content/mu-plugins/ तथा हाल की टिप्पणियों का ऑडिट करें।