🛡️ バックドア防御設計書

二度と仕込まれないための多層防御システム設計と実装 | MediFace Security 2026-08-13
対象: 21ドメイン / CORESERVER 攻撃手口: PHP Webシェル型バックドア 防御レイヤー: 6層 実装ファイル: 5種
1
バックドア(PHPウェブシェル)の仕組み

📖 Webシェルとは何か

Webシェルとは、攻撃者がサーバーに設置する「遠隔操作用PHPファイル」です。ブラウザ経由でサーバー上のあらゆる操作(ファイル閲覧・編集・削除・OSコマンド実行・他ドメインへの横断)が行えます。今回の fgh.php はその典型的な「ファイルマネージャ型」です。

🔬 今回設置されたWebシェル(fgh.php)のコード構造

ファイルマネージャ型Webシェルの典型的な構造:

// ① 認証チェック(パスワードが合えば全機能が使える)
if($_POST['pass'] !== 'attacker_password') die();

// ② action パラメータで機能を切り替え
switch($_GET['action']) {
  case '9':  // OSコマンド実行(攻撃ログ: ?action=9&shell_form=1)
    if($_POST['shell_form']) {
      echo shell_exec($_POST['cmd']);  // POSTされたコマンドをサーバーで実行
    }
    break;

  case 'get_node':  // ディレクトリツリー取得
    // fm_current_root=/home/mediface/ → アカウント全体を掌握
    $root = $_GET['fm_current_root'];
    echo json_encode(scandir($root));
    break;

  case 'delete':  // ファイル削除(攻撃ログで確認)
    unlink($_GET['dir'] . '/' . $_GET['files']);
    break;
}
攻撃ログで実際に観測されたリクエスト: GET /fgh.php?frame=2&fm_current_root=%2Fhome%2Fmediface%2F&operation=get_node
→ これ1行でCORESERVER上の全21ドメインのファイル構造が攻撃者に丸見えになった

🎭 3種類のWebシェル(今回全て確認)

① ファイルマネージャ型
fgh.php / get.php
GUIライクなUIでファイル操作・コマンド実行が可能。市販品(FilesMan等)がベース。
② コマンド実行型
borneo.php / ea.php
system()/shell_exec()でOSコマンドを実行。シンプルで小さく検出が難しい。
③ ドロッパー型
sshy.php / info.php
自分自身が小さく、アクセスされると追加のシェルを生成・展開する。

🕵️ 検出回避の手口(今回確認された5技法)

// 手口① WordPressコアファイル名への偽装
/wp-admin/js/widgets/media-widgets.php   ← 正規: media-widgets.js
/wp-includes/images/image-data.php        ← 正規: .png/.webp のみ存在するはず
/wp-includes/js/tinymce/skins/lightgray/fonts/tinymce.php  ← フォントディレクトリに偽装

// 手口② 画像・CSSディレクトリへの偽装
/css/kint.php   ← CSS名ディレクトリにPHPを配置
/images/gallery/Frame_v2_4.php  ← 画像ファイル名に偽装
/images/doctor1.php  ← doctorの画像ファイルに見せかける

// 手口③ Base64による難読化(コード解読を妨害)
eval(base64_decode('cGhwaW5mbygpOw=='));  ← デコードするとphpinfo();等

// 手口④ 変数名・関数名のランダム化
$x9f2a = str_rot13('flfgrz');  ← 'system'をROT13でエンコード
$x9f2a($_POST['c']);

// 手口⑤ CGI・レアPHPフラグの利用(.php5等)
self-portrait-1886.php  ← 有名絵画名で目視確認を欺く

⏱️ 今回の攻撃フロー(5段階)

1

初期侵入

~Aug 5以前
fgh.phpをkikuchi-law.comに設置
(方法不明・ログ外)

2

起動

Aug 12 19:33
IPから直接URLを叩いて起動
(偵察なし・URLを知っていた)

3

横展開

19:33〜20:06
/home/mediface/全21ドメインを掌握
40個のバックドアを設置

4

汚染

20:00〜05:03
130URLにカジノスパムを注入
Googleに強制インデックス

5

収益化

注入済み
SEO操作で検索順位を上げ
アフィリエイト収益を得る

CORESERVERの「1アカウント = 全ドメイン共有」構成が、1ファイルで全21ドメインの陥落を可能にした最大の脆弱点です。
2
多層防御アーキテクチャ(城塞型6レイヤー)
L5

Cloudflare WAF(推奨追加)

Cloudflareプロキシを有効化してWAF・DDoS保護・IP国別ブロックを追加。CORESERVER直接公開を廃止しオリジンIPを隠蔽。

推奨
未実施
L4

ファイル完全性監視

全PHPファイルのMD5ハッシュをベースラインとして記録。6時間毎に自動比較し、新規・変更ファイルを即時メール通知。

実装
予定
L3

国別IP・攻撃者IPブロック

.htaccess で確認済み攻撃者IP(8件)+インドネシア・イラン主要ISPレンジをブロック。wp-adminはホワイトリストIPのみ許可。

FTP
要適用
L2

Webシェルシグネチャブロック

.htaccess RewriteRule で shell_form=1 / action=9 / fm_current_root / eval(base64 等のリクエストパターンを403 Forbiddenで直接拒否。

FTP
要適用
L1

PHP実行ディレクトリ制限

uploads/ images/ css/ js/ fonts/ ディレクトリ配下のPHP実行を完全禁止。攻撃者が画像・CSS名でPHPを偽装しても実行不可能にする。

FTP
要適用
L0

認証・侵入口強化(最重要)

FTPパスワード変更(長く複雑に)+FTP接続元IP制限(CORESERVER管理画面)。WordPress管理者パスワード変更+2FA有効化。SSH鍵認証化。

管理画面
で設定
上から下へ順に外側の防壁。攻撃者がL5(Cloudflare)を突破しても、L0(認証)で止まるように設計します。1層が破られても次の層が守る「縦深防御」です。
3
実装ファイル一覧(FTPで各サイトにアップロード)
htaccess_WordPress共通.txt
WordPress全サイト共通の .htaccess セキュリティルール。13項目のブロック設定を含む。
→ 各サイト public_html/.htaccess に追記
htaccess_uploads禁止.txt
アップロードディレクトリ専用。PHP・スクリプト実行を完全無効化。
→ wp-content/uploads/.htaccess として配置
wp-config-security追記.php
wp-config.php へのセキュリティ設定追記。ファイル編集禁止・SSL強制・自動更新など。
→ wp-config.php の「stop editing」行の上に追記
backdoor_scanner.sh
PHPバックドア自動スキャナー。既知シェル名・シグネチャ・疑わしいディレクトリを6手法で検索。
→ CORESERVER SSH または管理コンソールで実行
integrity_monitor.sh
MD5ベースのファイル完全性監視。変更・新規ファイルを検知してメール通知。cron登録推奨。
→ SSH後: bash integrity_monitor.sh --init
robots_txt_medi-face.co.jp.txt
medi-face.co.jp 用 robots.txt。wp-admin・バックドアパスのクロール禁止。
→ medi-face.co.jp public_html/robots.txt として配置
全ファイルは ハッキング対応/実装ファイル/ フォルダに保存済みです。FTPクライアント(FileZilla等)でCORESERVERに接続してアップロードしてください。
4
.htaccess セキュリティ設定詳細解説

① PHP実行禁止(uploads / images / js / css ディレクトリ)

攻撃者が /css/kint.php / /images/doctor1.php のようにPHPを画像・静的ファイルディレクトリに偽装して設置しても、実行が不可能になります。

# wp-content/uploads/.htaccess に配置
<FilesMatch> "\.(php|php5|phtml|phar|pl|py|sh)$"
  Order Deny,Allow
  Deny from all
</FilesMatch>

<IfModule mod_php.c>
  php_flag engine off  # PHPエンジン自体を無効化
</IfModule>

② Webシェルシグネチャブロック(攻撃ログ実証済みパターン)

今回の攻撃で実際に使われたURLパラメータを直接ブロックします:

<IfModule mod_rewrite.c>
  RewriteEngine On
  # fgh.php 型のシェル操作シグネチャ
  RewriteCond %{QUERY_STRING} (action=9|shell_form=1|fm_current_root|fm_current_dir) [NC,OR]
  RewriteCond %{QUERY_STRING} (action=delete.*dir=|action=upload|operation=get_node) [NC,OR]
  RewriteCond %{QUERY_STRING} (eval\(|base64_decode|shell_exec|system\(|passthru) [NC]
  RewriteRule .* - [F,L]  # 403 Forbidden
</IfModule>
攻撃ログで確認: GET /fgh.php?action=9&shell_form=1 → このルールで403になります

③ wp-admin をIPホワイトリストで保護

管理画面へのアクセスを特定IPのみに制限。日本以外からの不正ログイン試行を根本的に排除します。

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_URI} ^/wp-admin
  RewriteCond %{REQUEST_URI} !^/wp-admin/admin-ajax\.php  # フロントエンドAJAXは除外
  RewriteCond %{REMOTE_ADDR} !^203.0.113.1  ← あなたのIPに変更
  RewriteRule ^ - [F,L]
</IfModule>

# ★ 自分のIPを確認: https://ifconfig.me/
# ★ 複数IPの場合: RewriteCond %{REMOTE_ADDR} !^(IP1|IP2) [NC]
このルールを設定する前に必ず自分のIPアドレスを確認してください。誤設定すると自分も管理画面に入れなくなります。

④ XML-RPC 完全無効化

XML-RPCはWordPressのリモートAPI機能ですが、ブルートフォース攻撃の入り口として悪用されます。今回の攻撃者IPは xmlrpc.php へのアクセスが0件でしたが、fraise-clinic.comで稼働確認済みのため閉鎖します。

<Files xmlrpc.php>
  Order Deny,Allow
  Deny from all
</Files>
5
WordPress セキュリティ強化

wp-config.php への追記(最重要3行)

// ファイル編集・プラグインインストールを管理画面から禁止
define('DISALLOW_FILE_EDIT', true);
define('DISALLOW_FILE_MODS', true);

// HTTPS強制
define('FORCE_SSL_ADMIN', true);

// コア自動更新を有効化
define('WP_AUTO_UPDATE_CORE', true);

// デバッグ情報を非表示(エラーメッセージからバージョン・パス情報を隠す)
define('WP_DEBUG', false);
DISALLOW_FILE_MODS=true にすると、仮に攻撃者がWordPress管理者アカウントを乗っ取っても、プラグインやテーマのPHPファイルを変更できなくなります。

推奨セキュリティプラグイン(優先順位順)

プラグイン優先度主な機能注意
Wordfence Security 最優先 WAF・マルウェアスキャン・ログイン試行制限・ファイル変更検知 無料版で十分。インストール後すぐにスキャンを実行
WPS Hide Login 最優先 wp-login.php のURLをカスタムURLに変更(例: /mediface-login) URLを忘れると自分もログインできなくなる。メモ必須
WP Activity Log 管理画面での全操作を記録。不審なログイン・変更を検知 今回の攻撃では管理画面ログが残っていなかった。必須
Limit Login Attempts Reloaded ログイン失敗回数を制限してブルートフォース攻撃を防止 5回失敗でロックアウト推奨
iThemes Security 2FA・ファイルアクセス制限・データベースプレフィックス変更など総合強化 Wordfenceと機能重複あり。どちらか一方で十分

管理者アカウント強化チェックリスト

  • □ 管理者ユーザー名を admin から変更(adminは最もよく狙われる)
  • □ 管理者パスワードを20文字以上のランダム文字列に変更
  • □ 2段階認証(2FA)を有効化(Google Authenticatorアプリと連携)
  • □ 不審な管理者ユーザーが追加されていないか確認・削除
  • □ メールアドレスが攻撃者のものに変更されていないか確認
6
ファイル完全性監視システム(MD5ベースライン)

仕組みの概要

クリーンな状態でPHPファイル全てのMD5ハッシュを記録(ベースライン)。定期的に現状と比較し、変更・追加されたファイルがあれば即座に通知します。

# STEP 1: クリーンな状態でベースラインを作成(一度だけ実行)
bash integrity_monitor.sh --init
# → /home/mediface/.security/php_baseline.md5 に全PHPのMD5を保存

# STEP 2: cronで定期チェック(6時間ごと自動実行)
# crontab -e で以下を追加:
0 */6 * * * /home/mediface/security/integrity_monitor.sh --check

# STEP 3: 変更検知時の出力例
⚠️  変更検知: /home/mediface/domains/medi-face.co.jp/public_html/wp-includes/images/image-data.php
   ベースライン MD5: a1b2c3d4...
   現在の MD5:       99f8e7d6...  ← ハッシュが変わった = ファイル改ざん

🆕 新規ファイル: /home/mediface/domains/fraise-clinic.com/public_html/css/kint.php
# → CSSディレクトリに新しいPHPが出現 = バックドアの疑い

緊急スキャンコマンド(SSH接続後に即実行)

# バックドアスキャナー実行(全ドメインを一気にスキャン)
bash backdoor_scanner.sh /home/mediface

# 今日変更されたPHPファイルを探す(最速確認)
find /home/mediface -name "*.php" -newer /home/mediface/domains/medi-face.co.jp/public_html/index.php -mtime -1 2>/dev/null

# eval(base64_decode を含むPHPを全ドメインから検索
grep -rl "eval.*base64_decode" /home/mediface --include="*.php"

# 画像・CSS・JSディレクトリにPHPがないか確認
find /home/mediface -type f -name "*.php" | grep -E "/(images?|img|css|js|fonts|uploads)/"
7
インシデント発生時 初動プレイブック

🚨 検知インジケーター(これが起きたら即対応)

  • • Google Search Console に「セキュリティの問題」アラートが届いた
  • • ページファイルサイズが突然2倍以上になった(今回: 6KB → 80KB等)
  • • 見覚えのない .php ファイルがディレクトリに出現した
  • • アクセスログに ?action=9&shell_form=1fm_current_root が出現した
  • • インドネシア・イランIPから短時間に大量のPOSTリクエストが来た
  • • Telegramリファラー(https://web.telegram.org/)からのPHP直接アクセスがあった

⚡ 初動対応(発見から60分以内)

  1. メンテナンスモード有効化 — サイトを一時停止してユーザーへの影響を遮断
  2. CORESERVERのIPフィルタリング — 管理画面でインドネシア・イランIPブロックを即時設定
  3. FTPパスワードを即時変更 — 新たなバックドア設置を防ぐ
  4. ログ保全 — アクセスログ・エラーログをすぐにダウンロード(上書きされる前に)
  5. backdoor_scanner.sh 実行 — 全バックドアをリストアップ
  6. エンジニアに連絡 — ログを共有してバックドア削除・改ざんページ修正を依頼

📞 連絡先一覧

連絡先用途連絡方法
CORESERVER サポートログ保全・IP緊急ブロック依頼管理画面チケットまたは電話
警視庁サイバー犯罪対策課被害申告・ログ保全要請03-3581-4321
JPCERT/CCインシデント報告・技術支援https://www.jpcert.or.jp/form/
Cloudflare trust@cloudflare.comPages不正利用報告メール(本件は送信済み)
NetcraftフィッシングURL報告https://report.netcraft.com/
8
優先実施スケジュール
🔴 今日(2026-08-13)
trust@cloudflare.com にメール送信(完了)
Google Safe Browsing 5件報告
Netcraft報告(完了)
FTPパスワード全サイト変更
WordPress全サイトのパスワード変更
.htaccess(基本版)をFTPで全サイトに配置
htaccess_uploads禁止.txt を全WPサイトに配置
wp-admin 旧ユーザーを削除し管理者を再作成
🟡 今週(8/14〜8/17)
Wordfence を全WPサイトにインストール・スキャン
WPS Hide Login を全WPサイトに設定
wp-config-security追記.php を全WPサイトに適用
XML-RPC を全WPサイトで無効化
GSC: セキュリティ問題解除・再インデックス申請
medi-face.co.jp robots.txt + sitemap.xml 作成・送信
integrity_monitor.sh --init(SSH後に実行)
CORESERVER FTPログの保全依頼(fgh.php 設置日特定)
🔵 今月(8月中)
主要サイトをCloudflareプロキシ有効化(WAF追加)
CORESERVERアカウントを分離(ドメイン別アカウント)
WP Activity Log で全操作ログを記録開始
integrity_monitor.sh を cron に登録(6時間毎)
全プラグイン・テーマを最新バージョンに更新
警視庁サイバー犯罪対策課 被害申告
NameCheap に攻撃者ドメイン悪用報告
定期セキュリティ監査スケジュール策定(月1回)
最優先事項: CORESERVERアカウントの分離(ドメイン別アカウント化)。現在の「1アカウント21ドメイン」構成では、1サイトが侵害されると全サイトが同時に陥落します。これが今回の被害を最大化した根本原因です。費用はかかりますが、アカウント分離が最も重要なアーキテクチャ変更です。

バックドア防御設計書 | 作成: 2026-08-13 | 株式会社メディフェイス セキュリティチーム

実装ファイル保存先: ハッキング対応/実装ファイル/