【知らない人は開発しないで】セキュリティの基本: 主要な攻撃タイプとその対策

ブルートフォースアタック

攻撃内容

ブルートフォースアタックは、ユーザー名やパスワードなどの認証データを、総当たり(すべての可能性を試す)方式で推測し、不正にシステムへのアクセスを試みる攻撃です。

攻撃者は、一般的なパスワードや辞書に載っているような単語を用いることが多く、弱いパスワードを持つアカウントは特に危険に晒されます。

対策

  • 強力なパスワードポリシー: ユーザーに対して、複雑で予測しにくいパスワードの使用を義務付けます。
  • アカウントロックアウト: 一定回数以上のログイン失敗を検出した場合、アカウントを一時的にロックします。
  • 二要素認証の導入: パスワードに加えて、別の認証手段(例えば、SMSによるコード認証)を用いることで、セキュリティを強化します。

SQLインジェクション

攻撃内容

SQLインジェクションは、攻撃者が不正なSQLクエリをWebアプリケーションの入力フォームなどに注入し、バックエンドのデータベースを操作する攻撃です。これにより、機密情報の漏洩、データの改ざん、不正な操作などが可能になります。

対策

  • パラメータ化されたクエリ: SQLクエリを安全に実行するために、ユーザー入力をパラメータとして扱います。
  • ORMツールの利用: オブジェクト関係マッピング(ORM)ツールを使用することで、SQLインジェクションのリスクを低減します。
  • 入力検証: ユーザーからの入力に対して、厳格な検証を行い、不正なデータを排除します。

    クロスサイトスクリプティング

    攻撃内容

    クロスサイトスクリプティング(XSS)は、攻撃者が悪意のあるスクリプトをWebページに注入し、他のユーザーのブラウザで実行させる攻撃です。これにより、ユーザーのセッション情報の盗難や、不正な操作が行われることがあります。

    XSS攻撃例

    秘匿データや踏み台にされる可能性
    ## 悪意のあるリンクを注入される
    http://example.com/search?query=<script>alert('XSS')</script>
    
    ## 悪意のある値を入力される
    こんにちは! <script>alert('XSS');</script>

    対策

    • 入力のサニタイズ: ユーザーからの入力を適切にクリーニングし、スクリプトの実行を防ぎます。
    • Content Security Policy (CSP): CSPを実装することで、信頼できるソースからのスクリプトのみを許可します。
    • セキュアなクッキーの使用: HTTPOnlyやSecure属性をクッキーに設定することで、クッキーの盗難を防ぎます。

    cspの設定はJSの制御ができるのでまじでおすすめ。

    ディレクトリトラバーサル

    攻撃内容

    ディレクトリトラバーサル攻撃は、攻撃者がウェブアプリケーションのセキュリティを回避して、サーバー上のファイルシステムにアクセスし、ファイルを読み出したり、操作したりする攻撃です。通常は、ウェブアプリケーションに渡されるファイル名やパスの入力を操作することで実行されます。例えば、「../」を使用してアプリケーションのルートディレクトリを越えて不正にアクセスすることがあります。

    注意

    ubuntu 等では、 `/var/www/domain.com` にソースが配置されることが多々ある。
    domain.com 内のファイルから `../../` のような形で domain.com より上の階層(wwwディレクトリやvarディレクトリ)のデータを盗まれる可能性あり

    対策

    • ユーザー入力の検証とサニタイズ: ファイル名やパスに関するユーザーからの入力を厳密に検証し、不正な入力を排除します。
    • アクセス権限の制限: ウェブサーバーのアクセス権限を最小限に設定し、必要なファイルやディレクトリのみにアクセスを許可します。
    • 使用するファイルのホワイトリスト: 予め許可されたファイルのみアクセスできるようにし、それ以外のファイルへのアクセスをブロックします。

    URLエンコード攻撃

    攻撃内容

    URLエンコード攻撃は、ウェブアプリケーションがURLエンコードされた入力を適切に処理しないことを利用した攻撃です。攻撃者は、URLエンコードを利用して、ウェブアプリケーションに悪意のあるデータを注入しようと試みます。これは、クロスサイトスクリプティングやSQLインジェクションなど、他の攻撃手法と組み合わせて使用されることがあります。

    ユーザーは気づかない

    - オリジナルのスクリプト: <script>alert('XSS');</script>
    - URLエンコードされたスクリプト: %3Cscript%3Ealert%28%27XSS%27%29%3B%3C%2Fscript%3E

    上記のエンコードの文字列がクエリパラメータに渡されて実行されたら大変だな〜

    対策

    • 入力のデコードと検証: ウェブアプリケーションは、URLエンコードされた入力をデコードし、厳格な入力検証を行う必要があります。
    • サニタイズ: ユーザーからの入力をサーバーに渡す前に、サニタイズ(消毒)して、悪意のあるコードを排除します。
    • セキュリティ対策の強化: クロスサイトスクリプティングやSQLインジェクションなど、他の攻撃に対するセキュリティ対策を強化することで、URLエンコード攻撃のリスクも低減されます。

    クロスサイトリクエストフォージェリ

    攻撃内容

    クロスサイトリクエストフォージェリ(CSRF)は、攻撃者がユーザーのブラウザを利用して、ユーザーの知らないうちに悪意のある操作を行わせる攻撃です。この攻撃は、ユーザーが既に認証済みのウェブサイト(例えば、オンラインバンキング、ソーシャルメディア等)にログインしている状態で、別の悪意のあるウェブサイトにアクセスした場合に発生します。

    攻撃者は、悪意のあるリンクやフォームを通じて、ユーザーのブラウザから信頼されたサイトに対して意図しないリクエストを送信させます。これにより、パスワードの変更、送金操作、メッセージの送信などが行われる可能性があります。

    対策

    • トークンの使用: セッション毎に一意のトークン(CSRFトークン)を生成し、フォームやリクエストに含めます。サーバー側では、リクエストを処理する前にこのトークンを検証します。
    • SameSiteクッキー属性の利用: SameSite クッキー属性を設定することで、ブラウザが異なるオリジン間のリクエストに対してクッキーを送信することを防ぎます。例えば、SameSite=Lax または SameSite=Strict を設定します。
    • リファラーの検証: リクエストのリファラーをチェックして、リクエストが信頼できるソースから送られているかを確認します。
    • ログアウトメカニズム: ユーザーがアクティブでない時に自動的にログアウトする機能を実装します。
    • CORSポリシーの適用: クロスオリジンリソース共有(CORS)ポリシーを適切に設定し、異なるオリジンからのリクエストを厳格に制御します。

    CSRFは、ウェブアプリケーションにとって重要な脅威であり、上記のような対策を組み合わせることで、そのリスクを大幅に低減することが可能です。ユーザーのセキュリティを保護するためにも、これらの対策を適切に実装することが重要です。

    セッションハイジャック

    攻撃内容

    WEBシステムのログイン後にセッションIDを盗み、ログイン者として該当のシステムを操作する「なりすまし行為」です。

    システムで扱う内容にもよりますが、以下のことが可能です。

    • 不正送金
    • 不正購入

     

    他人の運転免許(名義)で契約したり他人のパスポートで海外で悪さするなどが似ている犯罪になります。

    そのため自分の情報は守りましょうね!というのが非常に大切になってきます。

    セッションとは?

    アクセス開始から終了までの一連の通信の事を指します。
    例えばシステムにログインして検索をしてデータを登録するという処理をしたとします。
    上記の例では2つの処理を行っているのですが、検索と登録の2処理を1回のアクセスで行っているので1セッションとカウントします。

    HTTP通信では状態を保持することが出来ないので、セッションという値を用いて状態を保持すると覚えましょ。

    対策

    攻撃する人にセッションIDを推測されないことが鉄則です。

    まず最初にやることは見える位置にセッションIDを配置しないでください。

    • URLにセッションを含まない
    • hiddenにセッション値を設定しない(やる人いないと思いますが、一応)

     

    その上でなりすましを防ぐためにログイン後にセッションIDを書き換えましょう。

    PHPの場合は組み込み関数のsession_regenerate_id();を使用します。

    上記関数を使用することで使用しているセッションIDを書き換える事が可能です。ログイン処理の関数を作って最後にsession_regenerate_id()関数を記述すれば安全にセッションIDを管理できます。

    echo session_id(); //①
    session_regenerate_id(); //セッションID書き換え
    echo session_id(); //②

     

    また仕組み上、セッションIDはCookieに保存されるのでHTTPS通信にのみCookieを有効化するように設定します。

    //Apacheでの設定方法
    Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
    
    //php.iniでの設定方法
    session.cookie_httponly = 1

    Hostヘッダフォージェリ

    攻撃内容

    Hostヘッダフォージェリは、攻撃者がHTTPリクエストのHostヘッダを偽造して、ウェブアプリケーションを誤ったサイトに向けさせる攻撃です。これにより、パスワードリセット機能などを悪用し、リダイレクトやメールヘッダの注入などを行うことができます。

    対策

    • Hostヘッダの検証: サーバーは、受信したHostヘッダが予期されるものであるかを検証し、不正なものであれば拒否する必要があります。
    • ホワイトリスト: 信頼できるHost名のホワイトリストを用いて、許可されたもののみを受け入れます。
    • セキュアなリダイレクトの実装: リダイレクトを行う際は、ヘッダの内容に基づかずに、事前に定義されたURLを使用します。

    クリックジャッキング

    攻撃内容

    クリックジャッキングは、攻撃者が透明または見えないフレームを用いて、ユーザーに知らず知らずのうちに別のページ上のボタンやリンクをクリックさせる攻撃です。これにより、ユーザーは自分の意図とは異なる操作を行うことになります。

    対策

    • X-Frame-Optionsヘッダ: このヘッダを使用して、ウェブページが他のページのフレーム内で表示されることを防ぎます。
    • Content Security Policy: CSPのframe-ancestorsディレクティブを設定することで、ページが埋め込まれることを制限します。
    • JavaScriptベースの防御: ウェブページにJavaScriptを実装し、フレーム内での表示を検出し、防ぐことができます。

    DDoS攻撃

    攻撃内容

    分散型サービス妨害攻撃(DDoS)は、膨大な量のトラフィックをターゲットのサーバーまたはネットワークに送り込み、それを圧倒する攻撃です。これにより、正当なユーザーがサービスにアクセスできなくなります。

    対策

    • トラフィックの監視とフィルタリング: 異常なトラフィックパターンを検出し、フィルタリングすることが重要です。
    • クラウドベースのDDoS保護サービス: 専門のDDoS保護サービスを利用して、攻撃を軽減します。
    • 帯域幅の増加: 物理的な帯域幅を増やすことで、一定量の攻撃トラフィックを吸収することができます。
    • レートリミットの設定: リクエストの数を制限することで、サーバーへの負荷を軽減します。

    LDAPインジェクション

    攻撃内容

    LDAPインジェクションは、LDAPクエリに不正な入力を挿入して、認証やディレクトリ情報の不正取得を図る攻撃です。この攻撃により、攻撃者は機密情報を盗み出したり、不正なアクセスを実現することが可能です。

    LDAPクエリとは

    LDAPクエリとは、LDAP(Lightweight Directory Access Protocol、軽量ディレクトリアクセスプロトコル)を使用してディレクトリサービスから情報を検索または操作するための命令や式のこと

    対策

    • 入力のサニタイズとエスケープ: 入力データを適切に処理し、危険な文字を無効化します。
    • ホワイトリストによる入力検証: 信頼できる入力のみを受け付けるようにします。
    • アクセス権限の最小化: 必要最小限のアクセス権限を与えることで、万一の攻撃時の被害を最小限に抑えます。

    コマンドインジェクション

    攻撃内容

    コマンドインジェクションは、攻撃者がウェブアプリケーションを通じて、サーバー上で任意のシステムコマンドを実行する攻撃です。これは通常、ウェブアプリケーションがユーザーからの入力を適切に処理しない場合に発生し、システムレベルでの操作が可能になるため、非常に危険です。

    対策

    • 外部コマンドの実行を避ける: 可能であれば、システムコマンドを実行する代わりに、アプリケーションレベルの機能を使用します。
    • 入力の厳格な検証: システムコマンドに渡す前に、ユーザー入力を厳格に検証し、不正なコマンドの実行を防ぎます。
    • 最小限の権限での実行: システムコマンドを実行する際には、必要最小限の権限で実行することが重要です。

    ファイルインクルード

    攻撃内容

    ファイルインクルード攻撃は、攻撃者がウェブアプリケーションに対して、外部または内部のファイルを不正に読み込ませる攻撃です。これにより、攻撃者はサーバー上のファイルにアクセスしたり、リモートファイルを実行したりすることができます。

    対策

    • 入力検証: ファイルをインクルードする際のユーザー入力を厳密に検証し、不正な入力を排除します。
    • ローカルファイルのみの制限: 可能であれば、ローカルファイルのみをインクルードするように制限し、リモートファイルのインクルードを禁止します。
    • アクセス権限の制御: ウェブアプリケーションがアクセスできるファイルを制限し、不要なファイルへのアクセスを防ぎます。

    HTTPヘッダインジェクション

    攻撃内容

    HTTPヘッダインジェクションは、攻撃者がウェブアプリケーションのHTTPレスポンスヘッダーに不正な内容を注入する攻撃です。これは通常、ウェブアプリケーションがユーザー入力を適切に検証しないことを利用します。

    攻撃者は改行文字を含む入力を行うことで、新たなHTTPヘッダーを注入したり、既存のヘッダーを改変することができます。

    これにより、クロスサイトスクリプティング(XSS)、リダイレクト攻撃、セッションハイジャックなどが可能になる場合があります。

    対策

    • 入力の検証とサニタイズ: ユーザーからの入力を適切に検証し、特に改行文字や制御文字などのサニタイズを徹底します。
    • セキュリティヘッダーの設定: セキュリティ関連のHTTPヘッダー(例:Content-Security-Policy、X-Frame-Options)を設定し、ブラウザによる追加のセキュリティ保護を提供します。
    • フレームワークとライブラリの活用: セキュリティが考慮されたフレームワークやライブラリを使用することで、自動的に多くのセキュリティ対策を適用することができます。

       

      Twitterでフォローしよう

      読んでみーな
      おすすめの記事