SQL-injectiekwetsbaarheid in de Better Search Replace WordPress-plugin
Een van de onderzoekers van MijnSecurityPartner.nl heeft onlangs een code-audit uitgevoerd op verschillende populaire WordPress-plugins. Tijdens deze beoordeling ontdekte de beveiligingsonderzoeker een kwetsbaarheid in de Better Search Replace WordPress-plugin. De kwetsbaarheid, aangeduid als CVE-2022-2593, maakt de plugin vatbaar voor een SQL-injectieaanval, die mogelijk kan worden misbruikt door gebruikers met hoge privileges om willekeurige SQL-statements uit te voeren. Dit artikel geeft gedetailleerde informatie over de kwetsbaarheid en de impact ervan, samen met aanbevolen maatregelen om het risico te beperken.
De Better Search Replace WordPress-plugin voorafgaand aan versie 1.4.1 is vatbaar voor een SQL-injectieaanval, die kan worden misbruikt door gebruikers met hoge privileges om willekeurige SQL-statements uit te voeren. De plugin slaagt er niet in om tabelgegevens op de juiste manier te saneren en te escapen voordat deze worden opgenomen in SQL-query's, wat kan leiden tot mogelijke manipulatie van databasequery's.
De kwetsbaarheid kan worden geactiveerd door een gemanipuleerd POST-verzoek naar het endpoint better-search-replace te sturen. In de code van de plugin wordt het parameter select_tables onvoldoende gezuiverd, waardoor een aanvaller kwaadaardige SQL-code kan injecteren in de query.
Proof of Concept
Een aanvaller kan misbruik maken van deze kwetsbaarheid door een POST-verzoek naar het volgende endpoint te sturen:
POST /wp-admin/tools.php?page=better-search-replace&bsr-ajax=process_search_replace HTTP/1.1
Host: [target_host]
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 369
Connection: close
Cookie:[admin+]
bsr_ajax_nonce=3c38e50368&action=process_search_replace&bsr_step=0&bsr_page=0&bsr_data=search_for%3Daaa%26replace_with%3Dcef%26select_tables%255B%255D%3Dwp_posts%60%20WHERE%201=SLEEP(1)%20--%20%26dry_run%3Don%26bsr_nonce%3Da66e81c52b%26_wp_http_referer%3D%252Fwordpress%252Fwp-admin%252Ftools.php%253Fpage%253Dbetter-search-replace%26action%3Dbsr_process_search_replace
In het bovenstaande verzoek wordt een POST-verzoek verzonden naar het endpoint /wp-admin/tools.php?page=better-search-replace&bsr-ajax=process_search_replace. De body van het verzoek bevat de volgende parameters:
- bsr_ajax_nonce: Nonce-waarde voor authenticatie.
- action: Specificeert de uit te voeren actie, in dit geval process_search_replace.
- bsr_step en bsr_page: Parameters met betrekking tot het zoek- en vervangproces, deze kunnen beide worden ingesteld op een willekeurige numerieke waarde voor het misbruik om te werken. In dit geval zijn ze ingesteld op 0.
- bsr_data: De bsr_data bevat een URL-gecodeerde tekenreeks met specifieke parameters voor de plugin:
-
- select_tables: Deze parameter is de daadwerkelijke parameter die de SQL-payload injecteert. In dit geval probeert de payload een SQL-injectie uit te voeren door een kwaadaardige WHERE-clausule toe te voegen: wp_posts` WHERE 1=SLEEP(1) -- . Het dubbele streepje "--" commentarieert het overige deel van de oorspronkelijke SQL-query uit.
- dry_run: Geeft aan of de zoek- en vervangoperatie moet worden uitgevoerd of gesimuleerd. In beide gevallen is er sprake van een kwetsbaarheid.
- bsr_nonce: Nonce-waarde voor verificatie van het verzoek.
- _wp_http_referer: Verwijst naar de URL van de vorige pagina.
- action: Specificeert opnieuw de actie, in dit geval bsr_process_search_replace.
De kwetsbaarheid ontstaat door een fout in de manier waarop de Better Search Replace-plugin tabelnamen verwerkt bij het construeren van SQL-query's. Hoewel de plugin de door WordPress geleverde sql_esc-functie gebruikt om de meeste invoer te saneren, slaagt deze er niet in om backticks op de juiste manier te saneren bij het construeren van SQL-query's voor tabelnamen. Hierdoor kan een aanvaller het opschoningsmechanisme omzeilen en kwaadaardige SQL-code injecteren om van deze fout gebruik te maken.
Impact:
Om misbruik te maken van deze SQL-injectiekwetsbaarheid moet de aanvaller toegang hebben tot een account met hoge privilege-niveaus, zoals een beheerdersaccount. Succesvol misbruik kan de aanvaller in staat stellen willekeurige SQL-query's uit te voeren binnen de context van de WordPress-database. Dit kan leiden tot ongeautoriseerde toegang, manipulatie van gegevens of zelfs een volledige compromittering van de server waarop de database draait.
Oplossing:
Om deze kwetsbaarheid aan te pakken, hebben de beheerders van de plugin de code herzien om de geldigheid van tabelnamen te controleren voordat ze in SQL-query's worden gebruikt. Ze hebben een mechanisme geïmplementeerd om de geldigheid van tabelnamen te controleren aan de hand van de bestaande tabellen in de database, waardoor SQL-injectieaanvallen worden voorkomen.
Getroffen versies:
De SQL-injectiekwetsbaarheid bestaat in de Better Search Replace WordPress-pluginversies voorafgaand aan 1.4.1. Het wordt aangeraden dat alle gebruikers van deze plugin upgraden naar de nieuwste versie om het risico dat gepaard gaat met deze kwetsbaarheid te beperken.
Referenties
- Better Search Replace Plugin: https://bettersearchreplace.com/
- CVE-2022-2593: https://nvd.nist.gov/vuln/detail/CVE-2022-2593
- WP-Scan: https://wpscan.com/vulnerability/229a065e-1062-44d4-818d-29aa3b6b6d41