Webアプリケーションへの攻撃を意識する
ウェブ攻撃のいろいろ
- 概要
- 被害
- 予防
XSS(Cross Site Scripting)
- 動的なWebページにスクリプトを混入させる。
- 他のページへ誘導、CSRFへの踏み台、秘密情報の窃取、ページ偽装。
- 入力された値にHTMLタグを許可しない。入力された値を直接表示しない。値の出力にはタグを無効化する。
SQL Injection
- 不正にデータベースを操作する。
- 機密情報の漏洩、認証の回避による不正ログイン、情報の改ざん。
- 特殊文字を許可しない。parameterized query(パラメタライズドクエリ)を用いる。できるだけ入力された値を直接使用しない。
second-order SQL injection
- パスワードの再設定時などの対策漏れを狙った攻撃。不正にデータベースを操作する。
- 機密情報の漏洩、認証の回避による不正ログイン、情報の改ざん。
- SQLインジェクション対策漏れによるもの。適切にSQLインジェクション対策を行う。
blind SQL injection
- SQLインジェクションを行い、条件分岐の結果から情報を盗みだす。
- 機密情報の漏洩。
- Yes(真)とNo(偽)の結果からすべての情報を取られる可能性がある。適切にSQLインジェクション対策を行う。
CSRF(Cross Site Request Forgaries)
- 不正なスクリプトやリダイレクトが仕込まれたページから、別のWebサイト上で何らかの操作(掲示板への書き込みなど)を行なわせる攻撃手法。
- 意図しない別サイトへの書き込み。
- サイト外からのリクエストの受信拒否。ヘッダの参照元確認やチェックコードによる一貫性の確認を行う。
ざっくりとした違い
- XSS→不正なスクリプト埋め込み→不正なスクリプトの表示→クライアントでスクリプト実行。(表示されたときに問題になる)
- CRSF→悪意のあるリンクまたはスクリプト→クリック→サーバでスクリプト実行→他の掲示板に書き込み。(表示されなくても問題になる)
Null Byte Atack
- バイナリセーフでない関数にNULL バイト("\x00" や "\0" として表される終端文字)を含めて悪意のコードの実行など誤動作を起こさせる。
- 意図しないスクリプトの実行。
- 入力データからNULLバイト文字の削除。
Directory Traversal
- "../../"と相対的にさかのぼり、システム内の任意ファイルへアクセスする攻撃。
- ルートパスワードなどの窃取。
- ".."をbasename()などで適切に無効化するか"/"を禁止する。
HTTP Response Splitting
- レスポンスヘッダーにCRLF(%0d%0a)を含めて二つのレスポンスに分割し不正なヘッダー内容やボディ内容作り出す攻撃。
- 不正なリダイレクト、セッション情報や情報の窃取、XSS、ページの偽装、キャッシュによる被害拡大。
- ヘッダー内にCRLF(%0d%0a)を許可しない。最近の Apache , Tomcat では改行コードを含むヘッダを禁止している。
Session Hijacking
- sessionIDやsessionCookieを盗んで他人が確立した通信路を横取りする。
- 不正ログイン、機密情報の窃取。
- 類推が難しいセッションIDやクッキーを生成し、セッションIDやクッキーの有効期間を短くする。
Session Fixation
File Upload Attack
OS Command Injection
- 不正なOSコマンドを入力に埋め込むことによりサーバ上のOSを不正に操作する攻撃。
- ルートパスワードなどの窃取。OSコマンドの不正な実行。
- コマンド実行にリクエストされた入力パラメータを直接含めない。入力文字列が正当なものであるかチェックする。
Parameter Manipulation
- Webアプリケーションの期待する値とは別の値を送信し、誤動作をさせる。
- 情報の漏洩。Webアプリケーションの誤作動。
- 入力バリデータに通し検証済みの値を使用する。
Brute force atack
- あらゆる文字の組み合わせて不正ログインを試みる総当たり攻撃。
- 不正ログイン。
- アクセス間隔の監視。スクリプトからのアクセスを禁止する。登録時に画像認証を含める。
Backdoor & Debug Options
- 開発用、管理者用の秘密の入り口を探す。
- 不正ログイン。
- "admin" や "debug=1" など分かりやすい入口を隠す。
Forceful Browsing
おわりに
正式名称かは分かりませんが名称を知っていれば対策も取りやすいはずです。
ユーザの入力を求めるものに特殊文字が必要な場合は少ないと思うので
ホワイトリストで特殊文字を受け入れない(禁止)のが手っ取り早いでしょうか。
よくウェブ攻撃にはサニタイズという言葉が出てきますが、禁止と無効化が混在して
曖昧な表現になっているみたいです。高木浩光さんの記事が参考になります。
http://takagi-hiromitsu.jp/diary/20051227.html
Web攻撃いろいろの詳しくは下の参考を。
参考:順不同
http://www.fortify.com.tw/vulncat/ja/vulncat/sql/header_manipulation.html
http://gihyo.jp/dev/serial/01/php-security/
http://d.hatena.ne.jp/zatsuso/20080209/p1
http://d.hatena.ne.jp/owa-tayo/20100129/1264714595
http://trac.openpne.jp/wiki/pne-spec
http://d.hatena.ne.jp/gallu/20060105/p1
http://www.itmedia.co.jp/enterprise/articles/0506/16/news030.html