Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-87902 — CVE-2026-87902 の Python PoC。get_page_template() を介した認証不要の WordPress パストラバーサル RCE で、バージョンフィンガープリンティング、テーマチェック、オプションのファイルインクルードを備えています。 | Kitploit
ツール/GitHubGitHub/vulpecuna/cve-2026-87902
脆弱性スキャナー脆弱性分析エクスプロイトウェブアプリケーション悪用ウェブセキュリティペネトレーションテストリモートアクセスツールラボと実践
GitHubvulpecuna/cve-2026-87902

CVE-2026-87902

CVE-2026-87902 の Python PoC。get_page_template() を介した認証不要の WordPress パストラバーサル RCE で、バージョンフィンガープリンティング、テーマチェック、オプションのファイルインクルードを備えています。

リポジトリを見る
942323日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
要求された言語のコンテンツは利用できません。英語版を表示しています。

CVE-2026-87902

AdvisoryGHSA-7hp8-65ch-5whp
ProductWordPress <= 7.1.1, fixed in 7.1.2; both versions tested
Sinkwp-includes/template.php, get_page_template()
Causethe candidate built from pagename is not passed through validate_file()
Actoranonymous, no account, no cookie, no CSRF token
Methodsingle POST, two query parameters, empty body
Effectarbitrary on-disk .php included and executed in the WordPress process
Escalationremote command execution where the PEAR gadget is exploitable, see PHP and escalation
Writes to targetnone, unless --function is asked for by name
Reproduced here6 releases, 7 themes, 4 PHP versions

Themes

The 200 most-installed themes on wordpress.org. 26 ship a page-* directory and are affected, together 765,500 of 9,027,090 active installs. The other 174 fail precondition 1.

ThemeVersionInstallspage-*StatusConfirmed
neve4.2.11200,000page-templates🔴 affectedlab
sydney2.7180,000page-templates🔴 affectedlab
hestia3.3.670,000page-templates🔴 affectedlab
inspiro2.2.360,000page-templates🔴 affectedsurvey
colibri-wp1.0.16950,000page-templates🔴 affectedsurvey
twentyfourteen4.650,000page-templates🔴 affectedlab
twentytwelve4.950,000page-templates🔴 affectedlab
colormag4.2.540,000page-templates🔴 affectedlab
zakra4.3.330,000page-templates🔴 affectedsurvey
spacious1.9.1220,000page-templates🔴 affectedsurvey
hueman3.7.2720,000page-templates🔴 affectedsurvey
bloghash1.0.3010,000page-templates🔴 affectedlab
botiga2.4.910,000page-templates🔴 affectedsurvey
tutorstarter4.0.310,000page-templates🔴 affectedsurvey
mesmerize1.6.18710,000page-templates🔴 affectedsurvey
flash1.4.1210,000page-templates🔴 affectedsurvey
shapely1.3.610,000page-templates🔴 affectedsurvey
silverstorm1.0.368,000page-templates🔴 affectedsurvey
prespa1.7.88,000page-templates🔴 affectedsurvey
hybridmag1.1.46,000page-templates🔴 affectedsurvey
chromenews6.2.105,000page-templates🔴 affectedsurvey
morenews4.3.105,000page-templates🔴 affectedsurvey
newsexo9.12,000page-templates🔴 affectedsurvey
reviewnews2.0.51,000page-templates🔴 affectedsurvey
the8-shop-dark1.0.5400page-templates🔴 affectedsurvey
newsonline0.6100page-templates🔴 affectedsurvey

Tested and unaffected, none of them carrying a page-* directory: astra, kadence, twentysixteen, twentyseventeen, twentytwentythree, twentytwentyfive.

front-page.php does not change affectedness. It only rules out the front page's id for the request, and 4 of the 26 ship one: colormag, hestia, morenews, reviewnews. themes.json records it per theme, and poc.py demotes the front page id only for those four.

Versions

ReleaseImage default themeWith an affected themeConfirmed
7.1.2🟢 not affected, twentytwentyfive🟢 not affected, nevelab
7.1.1🟢 not affected, twentytwentyfive🔴 affected, nevelab
7.1.0🟢 not affected, twentytwentyfive🔴 affected, nevelab
7.0.4🟢 not affected, twentytwentyfive🔴 affected, nevelab
6.8.3🟢 not affected, twentytwentyfive🔴 affected, nevelab
6.1.0🟢 not affected, twentytwentythree🔴 affected, twentytwelvelab
4.9.8🟢 not affected, twentyseventeen🔴 affected, twentytwelvelab
the 105 other releasesnot measurednot measurednot measured

PHP variants published per release, which decide the escalation below:

WordPress releasesPHP variants published as -apache
4.1.x to 4.5.xnone, plain tag only, 5.6
4.6.x to 5.0.x5.6 7.0 7.1 7.2 7.3
5.1.x to 5.5.x7.1 7.2 7.3 7.4
5.6.x to 6.0.x7.2 7.3 7.4 8.0 8.1
6.1.x to 6.6.x7.4 8.0 8.1 8.2 8.3
6.7.x8.1 8.2 8.3 8.4
6.8.x and 6.9.x8.1 8.2 8.3 8.4 8.5
7.0.x and 7.1.x8.2 8.3 8.4 8.5

Request

POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded

page_id=<any published page>&pagename=<payload>

<payload> is the page- directory, the traversal and the target, with every dot and slash doubly encoded:

templates%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252fwp-admin%252finstall
FieldRole
pagenamethe payload. WP_Query runs it through sanitize_title_for_query(), which rewrites a literal dot to a dash but preserves percent-encoded octets. get_page_template() then calls urldecode() to decode the result into a path
page_idany published page, so the query matches a post instead of returning a 404. Without it the page template is never loaded
POSTredirect_canonical() returns untouched for any method other than GET and HEAD, and a body is what carries the two fields. See below

Core builds page-{urldecode($pagename)}.php and resolves it with locate_template(), against the stylesheet directory and then the template one.

Why POST

On a site with pretty permalinks, redirect_canonical() answers the GET with a 301 to /<slug>/?pagename=<payload>. page_id is dropped on the way, so the query matches no post, handle_404() fires, and get_page_template() is never reached.

A POST also has somewhere to put the two fields: WP::parse_request() reads $_POST first, so the body works exactly as the query string did and the URL is left a bare /. Only the gadget's arguments cannot move, because PHP fills $_SERVER['argv'] from the query string and nowhere else.

ツールをダウンロード