XSS(Cross Site Scripting)
ユーザーがWebサイトにアクセスすることで不正に埋め込まれたJavaScriptがブラウザで実行されてしまう脆弱性。
例えば、Cookie内のセッション情報やログインしないと見れないページのHTMLの個人情報が抜き取られ、Ajaxで別サーバーに送信されるなど。
メールなどで対象ページに誘導させることで成立する。
対策としては、ユーザーが任意に送信できるフォームにサニタイズ処理を挟むこと、CookieにHttpOnly属性をつけること、Content-Security-Policy HTTP ヘッダー(あるいはメタタグ)の設定などがある。
またサーバーのWAFによってXSS対策ができることもある(IP制限だけでなく、例えば某レンタルサーバーではiframeタグをPOST送信できないようになっていたりする)。
XSSには以下の3つの種類がある。
反射型XSS(Refrected XSS)
URLのクエリ文字列にスクリプトを埋め込み、そのURLを踏ませることで実行させる。
※ クエリの実行元プログラムはバックエンドプログラムにて処理(HTMLの生成)を行っていることを前提とする
# url例
https://example.com/?q=<script>〜</script>
格納型XSS(Stored XSS)
コメント入力フォームなどに悪意あるデータを書き込み、そのページにアクセスすることで実行させる。
※ 書き込みのプログラムはバックエンドプログラムにて処理(HTMLの生成)を行っていることを前提とする
DOM-based XSS
クライアントサイドのJavaScriptによってHTMLの生成が行われているときに、URLのクエリ文字列やハッシュにスクリプトを埋め込み、そのURLを踏ませることで実行させる。
Dom-based XSSの起点となるAPIは下記のようなものがある。
# url例
https://example.com/#<script>〜</script>
- location.hash
- location.search
- location.href
- document.cookie
- document.referrer
- document.write
- window.name
- Web Storage
- IndexedDB
- XMLHttpRequest.responseText
- eval
- HTMLElement.innerHTML
CSRF(Cross-Site Request Forgeries)
forgeriesは偽装と言う意味。Webサイトのユーザーに対して、意図しない操作を強いる脆弱性。
例えば、本来はログインしたユーザーしか実行できない記事の投稿処理や商品の購入などの処理(リクエスト)を勝手に代行される、など。
XSSとの違いは、XSSは不正プログラムがクライアントサイドで実行され、CSRFは不正プログラムがサーバーで実行される。
XSSでURLやスクリプトを埋め込み、それを踏ませることでCSRFを行うといったコンビネーション攻撃を行うこと場合が多い。
対策としては、偽造した処理が行われないようセッション管理(想定通りの画面遷移となっているかなど)やトークンを発行しPOST時を行うなど正常なリクエストとなっているかどうかを確認するプログラムを導入する必要がある。
トークンの発行はNonce(ノンス)と呼ばれる技術が使われることが多い。
Nonceは認証の過程で使用される使い捨てのランダムな値である。
要は、正規のフォームから入力されたかどうかを判別できるようにすることが大事。
Nonce
意図しないリクエストから保護するためのワンタイムトークン(使い捨てのランダムな値)のこと。
トークンをリクエストに含めて送信することで、Nonceがリクエストのために送られたものかを判断し、安全に進めるか否かを決定する。
これにより必要のない繰り返し、期限切れ、悪意あるリクエストを防ぐことができる。
Nonceは通常、URLに含まれるかhiddenフィールドに用いられる。
※WordPressで用いられるNonceは実際には一度しか使われるわけではないので、通信を傍受されリアルタイムに攻撃された場合は守ることができない
DOS攻撃
大量トラフィックを送信して攻撃対象のサービスを停止させる攻撃。
F5アタックなどが有名。
ブルートフォースアタック
ログイン画面などでIDとパスワードを手当たり次第入力し、パスワードを解析しようとする手法のこと。
※似た言葉で、パスワードリスト攻撃というものがあり、よく使用されるパスワードのリスト(結構ネット上に落ちてる、言語別とかもある)を使用し、それを元にロボットに入力させる手法もある
SQLインジェクション
インジェクションとは注入のこと。
Webサイトが想定しないSQLを注入し(Webブラウザからの入力値をコマンドやクエリに見せかけることで)実行させる攻撃のこと。
検索フォームなどでSQL文を入力することで、機密情報を閲覧できるようになる。
これも対策はフォーム入力内容のサニタイズ。またはプリペアードステートメントを用いて構文を固定させたり、プレースホルダーなどの実装がある。
※OSコマンドインジェクションもあり、これはOSに対する命令文を実行させるもの
ディレクトリ・トラバーサル攻撃
Webサーバーの管理者が公開(許可)していないファイルに攻撃者が不正にアクセスしファイルの閲覧や改ざんをする攻撃。
例えば、PHPだとincludeのパスを変数にしていたりすることで発生する。
対策としては、上記例のような実装をしないこと、どうしても実装しなければいけない場合は、値をサニタイズするなど。また許可していない領域に対してアクセス制限を付与するなどが挙げられる。
ヌルバイト攻撃
PHPで動作しているWebサイトにて、何らかのリクエストされた文字列に%00(ヌルバイト)を含めることで、Webサイトのセキュリティーチェックをくぐり抜ける攻撃のこと。
プログラム側で拡張子を付加している場合でも、ヌルバイトを利用することで任意の拡張子ファイルのアクセスができるようになり、具体的には「../example%00」というファイル名を指定することで、%00(ヌルバイト)が文字列の終端になり、それ以降の拡張子が無視されるというもの。
ディレクトリトラバーサルと一緒に利用されることが多い。
PHP自体はC言語で書かれており、PHPとCのヌルバイトに対する扱いが違う関数の「ねじれ」を利用した攻撃。
PHP5.3.4以降ではこの攻撃が成立しにくくなっており、あまり考慮する必要がない。
セッションハイジャック
その名の通り、セッションを奪い取る。
よくある手法としては、任意のサイトのセッションキーを特定し、セッションバリューを盗むためのサイトを用意し、攻撃対象のユーザーに何らかの方法でそのURLを踏ませる。
セッションバリューを盗むためのサイトにアクセスしたときに、そのセッションバリューを盗み出すことで、攻撃者がユーザーのセッションを奪い取る方法がある。
対策としては、php.iniに下記のような設定を施すこと。
session.use_trans_sid = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.auto_start = 0
他にはセッションキーの定期的な変更などがある。
<?php
session_start();
session_regenerate_id(true);
セッションID固定攻撃
セッションIDの管理原則としては、セッションIDはWebサーバー側で発行する。
発行したセッションIDをブラウザに渡し、Webサーバーにアクセスするたびに与えられたセッションIDをブラウザが返すことでユーザーを識別し、管理するのだが、Webサーバーの中には、ブラウザ側で発行したセッションIDを使用可能とする機能を有効化しているものもある。
これを利用して、攻撃者が生成したセッションIDを含んだURLなどを正規ユーザーに送りつけ、対象のユーザーがそのURLからログインすると、同じセッションIDを使って攻撃者も正規ユーザーと同じようにサイト内を徘徊することが可能となる。
セッションハイジャックとの違いは、セッションID固定化攻撃は、攻撃者が事前に用意したセッションIDをユーザーに利用させることで成立し、セッションハイジャックはユーザーが利用中のセッションIDを奪うことで成立する。
スパムメール踏み台攻撃
メールヘッダ生成部に改行やコンマを含めることで、任意の宛先にメールを送る攻撃。
本文に改行を大量に追加されることでメールを偽装されることもある。
対策としては、メールフォームなどの入力欄で改行やコンマをエスケープする。
クリックジャッキング
リンクやボタンなどの要素を隠蔽・偽装してクリックを誘い、利用者の意図しない動作をさせようとする攻撃。
XSSなどで透明にしたiframeを埋め込まれる場合が多い。
対策としては、HTTPレスポンスヘッダーにX-FRAME-OPTIONSを含めることで、そのページを他のサイトのページのiframeに呼び出さないようにできる。
HTTPレスポンス分割攻撃
リクエスト内に改行コードを含めることで、任意のHTTPレスポンスを受け取る。または受け取らせる攻撃のこと。
対象ユーザーにHTTPレスポンスコードを含んだURLを踏ませ、任意のレスポンスヘッダを使用させる。
セッションID固定攻撃などと一緒に利用される。
対策としては、PHPのheader関数に渡す引数から、改行コードを削除する。
Cross Site Tracing
XSSと一緒に使用され、Basic認証情報を盗む攻撃のこと。
Basic認証はAuthorizationヘッダに含まれており、Traceメソッドを利用することでその情報を入手できるため。
対策としては、http.confなどでTraceメソッドを無効にする必要があるが、ブラウザによっては対策されているため成功しない。
アプリケーション・バッファオーバーフロー
大きいサイズのファイルを送信できるようなWebアプリの場合は、システムバッファが許容量をオーバーしてシステムダウンや予期せぬ動作を起こす可能性がある。
ファイルのアップロード機能がある場合は、ファイルの中身をチェックすることが必要。
XXE(XML外部エンティティ参照)
SSIT(Server Side Template Injection)・CSTI(Client Side Template Injection)
テンプレートエンジンに対して、悪意ある文字列を入力することで意図しない変数の中身を表示したり、LFI(Local File Inclusion – ローカルファイル読み込み)やRCE(Remote Code Execution – リモートコード実行)を引き起こしたりする攻撃方法。
たとえばNode.jsのejsテンプレートエンジンであれば、以下のようにすればRCEを引き起こすことができる。
<%- global.process.mainModule.require('child_process').execSync('cat app.js') %>
参考:https://blog.hamayanhamayan.com/entry/2021/12/15/225142
SSRF(Server Side Request Forgery)
攻撃者から直接到達できないサーバーに対する攻撃手法のひとつで、たとえば公開サーバーと非公開のサーバー(公開サーバーからはアクセス可)があったとき、公開サーバーを操作することで間接的に非公開サーバーを攻撃したり情報を搾取するような手法である。
この攻撃方法は、ディレクトリトラバーサル脆弱性の悪用で外部サーバーを参照したり、OSコマンドインジェクションなどでwgetやcurlを実行するなどから発生する機会が多い。
参考:https://blog.tokumaru.org/2018/12/introduction-to-ssrf-server-side-request-forgery.html