First CH Appsサーバー処理を伴う小さなアプリ置き場

EN

First CH Apps / WordPress簡易診断

WordPress簡易診断

URLを入れると、そのサイトが WordPress かどうかテーマ名名乗っている範囲のバージョンと、よくある露出(REST APIのユーザー名列挙・xmlrpc.php・著者アーカイブ・既定のログインURL・readme.html・デバッグログ)を診断します。当社が自社サイトへ毎週かけているセキュリティ監査の、汎用部分をそのまま移植したものです。

見に行くのはWordPressの既定パス7本だけで、攻撃的な列挙はしません(総当たり・POST・プラグインの全数走査はしない=当社の監査と同じ方針)。CMSの判定だけが要るなら「技術スタック検出」、ヘッダーの採点は「セキュリティヘッダー採点」が担当します。

自社サイト・管理を引き継いだサイトのURLを入れてください。サブディレクトリ設置(example.com/blog/)も、トップページのURLから自動で判別します。

自分が管理しているサイト、または管理の許可を得ているサイトにだけ使ってください。 公開GETだけを行う読み取り専用の診断ですが、他人のサイトを無断で調べる用途は想定していません。

見ているもの(GETのみ・7本)

トップページを1回取得したうえで、WordPressの痕跡があった場合にだけ次の既定パスをGETします(並列・各8秒上限)。パラメータの改変も総当たりもしません。

  • /wp-json/wp/v2/usersユーザー名の列挙(REST API)
  • /?author=1ユーザー名の露出(著者アーカイブ)
  • /xmlrpc.phpxmlrpc.php
  • /wp-login.php既定のログインページ
  • /readme.htmlreadme.html(バージョンの露出)
  • /wp-content/debug.logデバッグログ
  • /wp-json/REST API の入口

この結果の読み方

「露出」は即座に危険という意味ではありません。 既定のままなら普通に出る項目(REST API・ログインページ)も含めて、保守の打ち合わせで論点になるものを並べています。優先度は「要対応」「要確認」「参考」で示しています。

バージョンは自己申告だけを表示します。 meta generator・コア資産の ?ver=・readme.html のいずれかで名乗っている値で、推測はしません。ここに出るということは、攻撃側にも同じ値が見えているということです。

「塞がれている」は完全な安全を意味しません。 前段のCDN・WAFが遮っているだけで、オリジンには残っていることがあります。逆に「判定できず」は、接続できなかった・応答が読めなかった場合です。

見るのは入力された1つのサイトの既定パスだけです。プラグインの脆弱性の有無・テーマの改造・管理画面の設定までは分かりません(それらは実際にサイトを触らないと分かりません)。

WordPressの痕跡が1つも無いサイトには、露出チェックを実行しません。無関係なサイトへ既定パスのリクエストを送らないためです。

SERVER PROCESSING — サーバーへ送るもの・保存するもの

送るもの: 入力されたURLだけ。当社サーバー(Cloudflare Workers)がそのURLを公開GETで1回取得し、WordPressの痕跡があった場合にのみ既定パス7本を追加でGETします(合計8回・Cookieもログイン情報も送りません)。

保存するもの: ありません。診断はリクエストの中だけで完結し、URL・結果ともデータベース(KV/D1)へ書き込みません。処理が終わった時点でメモリから消えます。

返すもの: 判定・テーマ名・バージョン・各チェックのHTTPステータスと合致した短い断片だけです。取得したページの原文もヘッダー一覧も再配信しません(このアプリは他サイトを閲覧するための中継として使えません)。

ユーザー名は返しません。 REST APIでユーザー一覧が読めてしまう場合も、画面とAPIに出すのは「露出している」ことと件数だけです。読み取った名前はサーバー内で数えた時点で捨てます。

Cookie: Set-Cookie は名前だけを判定に使い、値には触れません。ログイン不要の公開ページをそのまま取得するだけです。

注意: 取得は公開GETのみで、社内ネットワーク・localhost・プライベートIP宛のURLは受け付けません。

APIとして使う

POST /wp-check/api/check に JSON({"url": "https://example.com/"})またはフォームを送ると、同じ診断結果が JSON で返ります。