{"id":16625,"date":"2026-07-25T10:07:51","date_gmt":"2026-07-25T10:07:51","guid":{"rendered":"https:\/\/blog.quarticon.com\/pl\/wp2shell-krytyczna-podatnosc-wordpressa-jak-zalatac\/"},"modified":"2026-07-25T10:07:51","modified_gmt":"2026-07-25T10:07:51","slug":"wp2shell-krytyczna-podatnosc-wordpressa-jak-zalatac","status":"publish","type":"post","link":"https:\/\/blog.quarticon.com\/pl\/wp2shell-krytyczna-podatnosc-wordpressa-jak-zalatac\/","title":{"rendered":"wp2shell: krytyczna podatno\u015b\u0107 WordPressa. Jak za\u0142ata\u0107"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Krytyczna podatno\u015b\u0107 zdalnego wykonania kodu (RCE) w rdzeniu WordPressa, nazwana <strong>wp2shell<\/strong>, zosta\u0142a publicznie ujawniona <strong>17 lipca 2026 r.<\/strong> W przeciwie\u0144stwie do wielu problem\u00f3w bezpiecze\u0144stwa WordPressa zale\u017cnych od podatnych wtyczek lub motyw\u00f3w, wp2shell atakuje <strong>samego WordPressa<\/strong>, umo\u017cliwiaj\u0105c <strong>nieautoryzowanym atakuj\u0105cym<\/strong> uzyskanie RCE na <strong>domy\u015blnych instalacjach WordPressa<\/strong> w wersjach WordPressa wydanych od <strong>grudnia 2025 r.<\/strong><\/p>\n<p class=\"wp-block-paragraph\">\u0141a\u0144cuch zosta\u0142 odkryty i ujawniony przez <strong>Searchlight Cyber<\/strong>, a dodatkow\u0105 weryfikacj\u0119 oraz prace nad narz\u0119dziami obronnymi opisali pierwsi reaguj\u0105cy. Od publikacji aktywno\u015b\u0107 eksploatacyjna by\u0142a obserwowana szybko, po czym pojawia\u0142y si\u0119 sp\u00f3jne wzorce post-exploatacji, w tym wdra\u017canie webshelli.<\/p>\n<p class=\"wp-block-paragraph\">Dlaczego o tym piszemy? Szacuje si\u0119, \u017ce WordPress dzia\u0142a na ponad 500-600 milionach stron na ca\u0142ym \u015bwiecie, na oko\u0142o 44% wszystkich stron, r\u00f3wnie\u017c na naszej. <\/p>\n<h2 class=\"wp-block-heading\">\u0141a\u0144cuch podatno\u015bci<\/h2>\n<p class=\"wp-block-paragraph\">wp2shell wykorzystuje dwie luki:<\/p>\n<ul class=\"wp-block-list\">\n<li><strong>CVE-2026-63030<\/strong>: problem <strong>nieautoryzowanego pomylenia tras w REST API<\/strong> w domy\u015blnym endpointcie <strong>batch<\/strong> (punkt wej\u015bcia).<\/li>\n<li><strong>CVE-2026-60137<\/strong>: podatno\u015b\u0107 <strong>SQL injection<\/strong> zwi\u0105zan\u0105 z <strong>WP_Query<\/strong>.<\/li>\n<\/ul>\n<p class=\"wp-block-paragraph\">Razem pozwalaj\u0105 atakuj\u0105cemu przej\u015b\u0107 od <strong>braku dost\u0119pu<\/strong> do utworzenia <strong>podstawionego administratora<\/strong>, a ostatecznie do <strong>wykonania kodu<\/strong> (oraz utrzymywania dost\u0119pu przez webshell). Mechanika opiera si\u0119 na wieloetapowym procesie, a nie na pojedynczym \u017c\u0105daniu; zachowanie ko\u0144cowej eksploatacji zale\u017cy te\u017c od tego, jak budowana jest \u015bcie\u017cka zapytania strony.<\/p>\n<p class=\"wp-block-paragraph\">Naprawione przez poprawk\u0119 opisan\u0105 w po\u015bcie: <strong><code>wp_parse_id_list()<\/code> w WordPress 7.0.2<\/strong>.<\/p>\n<h2 class=\"wp-block-heading\">Dlaczego ta podatno\u015b\u0107 jest inna (i ma du\u017cy wp\u0142yw)<\/h2>\n<p class=\"wp-block-paragraph\">Wi\u0119kszo\u015b\u0107 podatno\u015bci WordPressa koncentruje si\u0119 w ekosystemie wtyczek\/motyw\u00f3w. wp2shell jest inna, poniewa\u017c dotyczy <strong>rdzenia<\/strong> &#8212; czyli mo\u017ce dosi\u0119gn\u0105\u0107 go\u0142ej instalacji, bez dodawania czegokolwiek.<\/p>\n<p class=\"wp-block-paragraph\">Dodatkowo jest nieautoryzowana, dzia\u0142a domy\u015blnie za po\u015brednictwem odpowiedniego endpointu REST i jest dost\u0119pna bez interakcji u\u017cytkownika. To po\u0142\u0105czenie skutkuje ogromn\u0105 populacj\u0105 wystawionych instancji, dlatego tak istotne by\u0142y wymuszone automatyczne aktualizacje na WordPress.org.<\/p>\n<p class=\"wp-block-paragraph\">Odnotowano jedno zaw\u0119\u017caj\u0105ce ograniczenie: \u015bcie\u017cka prowadz\u0105ca do wykonania kodu mo\u017ce si\u0119 zmieni\u0107 w zale\u017cno\u015bci od tego, czy w\u0142\u0105czone jest trwa\u0142e zewn\u0119trzne cache obiekt\u00f3w. Mo\u017ce to zmniejszy\u0107 ekspozycj\u0119 w niekt\u00f3rych wi\u0119kszych wdro\u017ceniach, ale nie rozwi\u0105zuje problemu w du\u017co cz\u0119stszym przypadku standardowych instalacji.<\/p>\n<h2 class=\"wp-block-heading\">Ekspozycja wed\u0142ug wersji (co trzeba poprawi\u0107)<\/h2>\n<p class=\"wp-block-paragraph\">Dwie podatno\u015bci nie pokrywaj\u0105 si\u0119 idealnie pod wzgl\u0119dem zastosowania do wersji, wi\u0119c ekspozycja dzieli si\u0119 zale\u017cnie od tego, kt\u00f3re cz\u0119\u015bci \u0142a\u0144cucha s\u0105 mo\u017cliwe do osi\u0105gni\u0119cia.<\/p>\n<ul class=\"wp-block-list\">\n<li><strong>6.8.0 &#8211; 6.8.5<\/strong>: ekspozycja: <strong>tylko SQL injection<\/strong> (brak pe\u0142nego \u0142a\u0144cucha RCE)<\/li>\n<li><strong>6.9.0 &#8211; 6.9.4<\/strong>: ekspozycja: <strong>pe\u0142ny nieautoryzowany \u0142a\u0144cuch RCE<\/strong><\/li>\n<li><strong>7.0.0 &#8211; 7.0.1<\/strong>: ekspozycja: <strong>pe\u0142ny nieautoryzowany \u0142a\u0144cuch RCE<\/strong><\/li>\n<\/ul>\n<p class=\"wp-block-paragraph\"><strong>Sprawd\u017a, czy masz zaktualizowan\u0105 wersj\u0119<\/strong> (do 7.0.2).<\/p>\n<h3 class=\"wp-block-heading\">Typowa aktywno\u015b\u0107 po eksploatacji<\/h3>\n<p class=\"wp-block-paragraph\">Po udanej eksploatacji endpointu obserwowano:<\/p>\n<ul class=\"wp-block-list\">\n<li><strong>Wgranie z\u0142o\u015bliwej wtyczki<\/strong>\n<ul class=\"wp-block-list\">\n<li>Dost\u0119p do: <code>\/wp-admin\/plugin-install.php?tab=upload<\/code><\/li>\n<li>Nast\u0119pnie: uruchomienie <code>POST \/wp-admin\/update.php?action=upload-plugin<\/code><\/li>\n<\/ul>\n<\/li>\n<li><strong>Listing u\u017cytkownik\u00f3w<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u017b\u0105dania typu: <code>\/wp-json\/wp\/v2\/users?context=edit<\/code><\/li>\n<li>Cel: pozyskiwanie <strong>nazw u\u017cytkownik\u00f3w administrator\u00f3w i adres\u00f3w e-mail<\/strong><\/li>\n<\/ul>\n<\/li>\n<li><strong>Pr\u00f3by lokalnego do\u0142\u0105czania plik\u00f3w (LFI)<\/strong>\n<ul class=\"wp-block-list\">\n<li>Przyk\u0142adowy wzorzec: <code>admin-ajax.php?template=..\/..\/..\/wp-config<\/code><\/li>\n<li>Cel: dotarcie do <strong>sekret\u00f3w na poziomie <code>wp-config<\/code><\/strong> w celu dalszego przej\u0119cia i\/lub wycieku danych<\/li>\n<\/ul>\n<\/li>\n<li><strong>Dost\u0119p do panelu administracyjnego<\/strong>\n<ul class=\"wp-block-list\">\n<li>Dost\u0119p do <code>\/wp-admin\/<\/code><\/li>\n<li>Obserwowane sygna\u0142y: <strong>odpowiedzi HTTP 200<\/strong> zgodne z pomy\u015blnymi uwierzytelnionymi sesjami<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p class=\"wp-block-paragraph\">Dodatkowo pojawi\u0142y sie informacje o <strong>wysokowolumenowym skanowaniu<\/strong>, gdzie wiele host\u00f3w by\u0142o sprawdzanych bez potwierdzonego przej\u0119cia, co sugeruje oportunistyczne masowe skanowanie podatnych cel\u00f3w.<\/p>\n<p class=\"wp-block-paragraph\">G\u0142\u00f3wna praktyczna obserwacja: eksploatacja wp2shell cz\u0119sto ko\u0144czy si\u0119 <strong>wdro\u017ceniem webshella<\/strong>, a \u0142adunki (payloady) r\u00f3\u017cni\u0105 si\u0119 znacz\u0105co poziomem zaawansowania.<\/p>\n<p class=\"wp-block-paragraph\">Lekki backdoor oparty o PHP <code>eval<\/code>, kt\u00f3ry uruchamia PHP podane przez atakuj\u0105cego w parametrze POST i zwraca <strong>404<\/strong> w celu obej\u015bcia wykrycia. Znacznie wi\u0119kszy jest webshell udaj\u0105cy wtyczk\u0119 WordPress nazwan\u0105 <strong>\u201eCMSmap&#8221;<\/strong>. <\/p>\n<p class=\"wp-block-paragraph\">Inne zaobserwowane podej\u015bcie polega na rejestrowaniu niestandardowego endpointu REST, co umo\u017cliwia atakuj\u0105cym wysy\u0142anie polece\u0144 zakodowanych w base64 przez POST i otrzymywanie wyniku w odpowiedzi JSON &#8212; w praktyce daje to wykonanie polece\u0144.<\/p>\n<h2 class=\"wp-block-heading\">Co zrobi\u0107 ju\u017c teraz?<\/h2>\n<ol class=\"wp-block-list\">\n<li><strong>Natychmiast sprawd\u017a wersj\u0119 WordPressa<\/strong><br \/>Nie zak\u0142adaj, \u017ce automatyczne aktualizacje w pe\u0142ni Ci\u0119 ochroni\u0142y. Zweryfikuj zainstalowan\u0105 wersj\u0119 w panelu.<\/li>\n<li><strong>Uruchom sprawdzanie kompromitacji, a nie tylko \u201esprawdzenie wersji&#8221;<\/strong><br \/>Je\u015bli system m\u00f3g\u0142 zosta\u0107 wystawiony zanim pojawi\u0142y si\u0119 poprawki (albo je\u015bli aktualizacje by\u0142y ograniczone\/wy\u0142\u0105czone), bezpieczniej jest przeskanowa\u0107 pod k\u0105tem dowod\u00f3w.<\/li>\n<li><strong>Je\u015bli podejrzewasz ekspozycj\u0119: zresetuj has\u0142a<\/strong><br \/>Zalecane jest zresetowanie hase\u0142 dla wszystkich u\u017cytkownik\u00f3w &#8212; zaczynaj\u0105c od administrator\u00f3w. Uzasadnienie jest takie, \u017ce komponent SQL injection mo\u017ce odczyta\u0107 <strong><code>wp_users<\/code><\/strong>, co mo\u017ce ujawni\u0107 hashe hase\u0142.<\/li>\n<li><strong>Sprawd\u017a u\u017cytkownik\u00f3w<\/strong> <strong>administrator\u00f3w<\/strong><br \/>Tworzenie u\u017cytkownik\u00f3w z rol\u0105 administratora oznacza utrwalenie dost\u0119pu (atakuj\u0105cy zapewnia sobie kolejny spos\u00f3b wej\u015bcia, nawet je\u015bli pierwotna luka zostanie za\u0142atana). Usu\u0144 wszystkich nietypowych u\u017cytkownik\u00f3w.<\/li>\n<li><strong>Sprawd\u017a pliki w katalogu upload (202607)<\/strong><br \/>Wgrywanie plik\u00f3w do katalogu upload, gdzie pliki b\u0119d\u0105ce obrazami zawieraj\u0105 kod PHP, to mechanizm obej\u015bcia zasad\/filtr\u00f3w (np. \u201emaskowanie&#8221; payloadu jako plik multimedialny) i cz\u0119sto prowadzi do uzyskania webshella albo innego sposobu wykonywania kodu z poziomu publicznie dost\u0119pnych katalog\u00f3w. Usu\u0144 wszystkie takie pliki<\/li>\n<li><strong>Reset\/odtworzenie SALT<\/strong><br \/>i\/lub wygaszenie wszystkich cookies\/sesji, bo atakuj\u0105cy m\u00f3g\u0142 korzysta\u0107 z aktywnych sesji lub token\u00f3w. W WordPressie odpowiadaj\u0105 za to klucze w <code>wp-config.php<\/code> (AUTH_KEY, SECURE_AUTH_KEY, LOGGED_IN_KEY, NONCE_KEY itd. oraz ich wersje \u201eSALT&#8221;). Po wygenerowaniu nowych SALT u\u017cytkownicy zostan\u0105 wylogowani (i wszelkie tokeny\/sesje strac\u0105 wa\u017cno\u015b\u0107). Nowe klucze wygenerujesz tutaj: <a href=\"https:\/\/api.wordpress.org\/secret-key\/1.1\/salt\/\" target=\"_blank\" rel=\"noopener nofollow\" title=\"\">https:\/\/api.wordpress.org\/secret-key\/1.1\/salt\/<\/a><\/li>\n<li><strong>Usu\u0144 nieautoryzowane pliki<\/strong> <br \/>w <code>\/wp-content\/uploads\/<\/code>, <code>\/wp-content\/plugins\/<\/code>, ewentualnie nietypowe pliki w katalogach core, por\u00f3wnaj <code>wp-content<\/code> i (w razie potrzeby) ca\u0142y kod z wersj\u0105 z oficjalnego repozytorium.<\/li>\n<\/ol>\n<p class=\"wp-block-paragraph\">Podej\u015bcie do incydentu wp2shell jest wi\u0119c nastepuj\u0105ce: <strong>aktualizacja, weryfikacja i sprzatanie<\/strong>, poniewa\u017c przy \u0142a\u0144cuchach, gdzie logi mog\u0105 nie wystarczy\u0107, a kluczowe s\u0105 dowody w bazie danych, \u201ezaktualizowali\u015bmy&#8221; nie znaczy \u201ejeste\u015bmy bezpieczni&#8221;.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Krytyczna podatno\u015b\u0107 zdalnego wykonania kodu (RCE) w rdzeniu WordPressa, nazwana wp2shell, zosta\u0142a publicznie ujawniona 17 lipca 2026 r.<\/p>\n","protected":false},"author":1,"featured_media":16626,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-16625","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/blog.quarticon.com\/pl\/wp-json\/wp\/v2\/posts\/16625","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.quarticon.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.quarticon.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.quarticon.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.quarticon.com\/pl\/wp-json\/wp\/v2\/comments?post=16625"}],"version-history":[{"count":0,"href":"https:\/\/blog.quarticon.com\/pl\/wp-json\/wp\/v2\/posts\/16625\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.quarticon.com\/pl\/wp-json\/wp\/v2\/media\/16626"}],"wp:attachment":[{"href":"https:\/\/blog.quarticon.com\/pl\/wp-json\/wp\/v2\/media?parent=16625"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.quarticon.com\/pl\/wp-json\/wp\/v2\/categories?post=16625"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.quarticon.com\/pl\/wp-json\/wp\/v2\/tags?post=16625"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}