WordPress core (CVE-2026-60137)
CVE-2026-60137CWE-89OWASP A03:2021CVSS 5.9Bijgewerkt 1 oktober 20264 min leestijd
CVE-2026-60137 is een SQL injection in WP_Query, de query-engine van WordPress core. Op zichzelf krijgt de fout een 5.9, omdat een plugin of thema onbetrouwbare invoer moet doorgeven. Gekoppeld aan het REST API-lek CVE-2026-63030 als "wp2shell" kan een anonieme bezoeker een beheerder aanmaken op ongepatchte WordPress 6.9 en 7.0. Aanvallers probeerden het zo'n 90 minuten na de patch al.
- Kwetsbaar
- WordPress 6.8.0 tot en met 6.8.5, 6.9.0 tot en met 6.9.4 en 7.0.0 tot en met 7.0.1 (de keten zonder inloggen met CVE-2026-63030 pas vanaf 6.9.0)
- Gepatcht in
- WordPress 6.8.6, 6.9.5 en 7.0.2 (17 juli 2026) en elke latere release
- Actief misbruikt
- ja
Op 17 juli 2026 bracht WordPress de versies 7.0.2, 6.9.5 en 6.8.6 uit om twee fouten in de kern te dichten. Volgens Patchstack kwamen de eerste misbruikpogingen zo’n 90 minuten later al binnen op zijn sensoren. Dit artikel gaat over de SQL injection-helft van dat paar. Op zichzelf is die middelmatig. In combinatie met CVE-2026-63030 geeft hij een anonieme aanvaller de hele site.
Wat is CVE-2026-60137
WP_Query is de klasse waarmee WordPress berichten uit de database ophaalt. De parameter author__not_in, via de REST API bereikbaar als author_exclude, werd niet goed opgeschoond, waardoor een gemanipuleerde waarde in de SQL-query belandde: een klassieke SQL injection. WordPress spreekt van een “facilitated” injectie. Volgens de NVD-omschrijving werkt hij op zichzelf alleen als een plugin of thema onbetrouwbare invoer aan de parameter doorgeeft, en Patchstack merkt op dat hij gegevens kan lezen maar niet schrijven. Dat verklaart de CVSS-score van 5.9 van de CNA, WPScan. De ADP van CISA komt op 9.1, en per 1 oktober 2026 heeft NIST geen eigen score gepubliceerd. De kwetsbare code kwam erin met WordPress 6.8; oudere versies zijn niet getroffen.
Vanaf 6.9 levert een tweede fout het ontbrekende stuk. CVE-2026-63030 is een routeverwarring in het batch-endpoint van de REST API (/batch/v1): een subverzoek wordt gecontroleerd voor de ene handler en daarna door een andere uitgevoerd. Volgens Patchstack kan een niet-ingelogd verzoek zo de SQL injection langs het schema smokkelen dat de invoer normaal zou opschonen. De openbare exploit gebruikt de injectie vervolgens om gegevens te vervalsen waar WordPress zelf op handelt, met een nieuw beheerdersaccount als eindresultaat. Dat is privilege escalation van anonieme bezoeker naar beheerder, en daarna is de rest volgens Patchstack routine: een plugin uploaden die eigenlijk een webshell is, en code op de server uitvoeren. Adam Kues van Assetnote / Searchlight Cyber meldde de keten en publiceerde hem onder de naam “wp2shell”; de injectie zelf werd gemeld door TF1T, dtro en haongo.
Wat de aanvallers deden
Dit was een n-day, geen zero-day: eerst kwam de patch, daarna de aanvallen. De fix stond ongeveer anderhalf uur vóór de release in de openbare code van WordPress, en Patchstack noemt die commit in feite de bekendmaking: iedereen kon de wijziging bekijken. De eerste misbruikpogingen volgden drie uur na de commit. Het Amerikaanse CISA zette beide CVE’s op 21 juli op zijn lijst van actief misbruikte kwetsbaarheden, dezelfde dag waarop het NCSC meldde dat misbruik was waargenomen. Het Duitse BSI gaf de situatie niveau 3 van 4 (oranje) en sprak van actief misbruik.
Patchstack omschreef de eerste dagen als een stormloop van veel verschillende partijen in plaats van één gecoördineerd botnet; in zijn data probeerden maar drie IP-adressen de volledige keten tot een beheerdersaccount. CrowdSec telde 62.802 unieke aanvallende IP-adressen in de 15 dagen tot 23 augustus 2026 en beschouwde de fout toen nog steeds als actief misbruikt. Er is ook gericht misbruik: GreyNoise beschrijft een actor die het Kapibala noemt, naar zijn inschatting vermoedelijk Chineestalig, die de keten vanaf ongeveer 20 juli inzette en daarmee bij minstens 49 organisaties in 29 landen succes had, onder meer vier in Duitsland en één in Nederland. Bij één westerse overheidsinstantie stal de actor meer dan 18.000 records.
Waarom een 5.9 toch spoed verdiende
Wie op losse CVSS-scores prioriteert, had deze CVE in het volgende onderhoudsvenster gezet. Dat is de les: aanvallers denken in ketens, dus beoordeel een middelmatige fout samen met alles waarmee hij te combineren is. De tweede les gaat over tijd. Negentig minuten tussen patch en aanval laat geen ruimte voor een wijzigingsproces, en de afgedwongen automatische update helpt alleen waar hij ook echt aankomt. CrowdSec zag tienduizenden adressen nog steeds sites vinden waar dat niet zo was: automatische updates uitgezet, een hoster die de versie vastzet, of een stagingkopie waar niemand eigenaar van is. Dat zijn verouderde componenten in hun zuiverste vorm.
Wat u nu moet doen
- Controleer welke versie er werkelijk draait op elke WordPress-installatie, ook op staging-, test- en vergeten campagnesites. Ga er niet van uit dat de afgedwongen update is aangekomen.
- Draai de nieuwste release. Per 1 oktober 2026 is dat 7.1.2, die ook CVE-2026-87902 verhelpt, een aparte kernfout die CISA sinds 25 september als misbruikt vermeldt. Voor deze CVE alleen is het minimum 7.0.2, 6.9.5 of 6.8.6.
- Draaide een site na 17 juli 2026 een kwetsbare 6.9- of 7.0-versie, zoek dan naar beheerders die u niet hebt aangemaakt, plugins die u niet kent, PHP-bestanden onder
wp-content/uploadsen alles inwp-content/mu-plugins. - Kunt u niet direct updaten? Blokkeer zowel
/wp-json/batch/v1als?rest_route=/batch/v1aan de rand van het netwerk, en test de regel ook tegen de variant metrest_routein de POST-body. CrowdSec en Patchstack troffen regels aan die alleen naar de URL keken. - Bouwt u plugins of thema’s? Geef verzoekinvoer nooit ongecontroleerd door aan WP_Query; zet auteur-ID’s eerst om naar gehele getallen. Zie invoervalidatie.
- Neem uw WordPress-sites op in een periodieke penetratietest, de vergeten sites voorop.
Bronnen
- WordPress: WordPress 7.0.2 Releasewordpress.org
- NVD: CVE-2026-60137nvd.nist.gov
- Patchstack: Ninety minutes: watching attackers weaponize the WordPress core RCEpatchstack.com
- CrowdSec: CVE-2026-63030: WordPress WP2Shell Hits 62,802 Attacking IPscrowdsec.net
- GreyNoise: Open Season on Kapibalagreynoise.io
- NCSC: Ernstige kwetsbaarheden in WordPress Core: installeer updatesncsc.nl
Veelgestelde vragen
Waarom maar een 5.9 als dit zo ernstig was?
De 5.9 van de CNA, WPScan, geldt voor deze fout op zichzelf: de injectie leest alleen gegevens en werkt pas als een plugin of thema onbetrouwbare invoer aan de parameter doorgeeft. Het gevaar zit in de keten. Dezelfde CNA geeft CVE-2026-63030 een 9.8, en samen leveren ze een anonieme bezoeker een beheerdersaccount op.
Heeft WordPress niet iedereen automatisch bijgewerkt?
WordPress dwong de update af via het systeem voor automatische updates. Dat dekte de meeste sites, maar niet sites waar automatische updates uitstaan, sites die een hoster op een vaste versie houdt, of installaties waar de update mislukt, bijvoorbeeld door bestandsrechten. CrowdSec zag aanvallers vijf weken later nog steeds zulke sites vinden.
Is updaten genoeg?
Alleen als niemand u voor was. Een beheerdersaccount of webshell-plugin die via de keten is aangemaakt, overleeft de update. Draaide een site na 17 juli 2026 nog een kwetsbare 6.9- of 7.0-versie, controleer hem dan ook op sporen van een inbraak.
Verwante artikelen
- KwetsbaarhedenCWE-20A04:2021Invoervalidatie ontbreekt op de serverValidatie die alleen in JavaScript gebeurt, is met één direct verzoek te omzeilen. Lees waarom de server elke waarde opnieuw moet controleren.
- KwetsbaarhedenCWE-1104A06:2021Verouderde en kwetsbare componentenEen verouderde bibliotheek of webserver draagt publiek bekende kwetsbaarheden met kant-en-klare exploits. Lees hoe u dat beheersbaar maakt.
- KwetsbaarhedenCWE-269A01:2021Privilege escalationPrivilege escalation uitgelegd: hoe een aanvaller via een role-veld of een onbeschermde adminroute beheerder wordt, en hoe u dat serverzijdig voorkomt.
- KwetsbaarhedenCWE-89A03:2021SQL injectionSQL injection uitgelegd: hoe aanvallers via ongefilterde invoer uw database uitlezen of wijzigen, en hoe u het met prepared statements voorkomt.