Webアプリケーションの脆弱性、攻撃手法とその対策
今回はWebアプリケーションにおける脆弱性についてまとめる。フレームワークが当たり前の時代とはいえ、脆弱性を生む場面を理解し、正しい処理をしておかなければ必ずウィークポイントを産んでしまう。脆弱性を突かれる突かれない以前に、これは普通に恥ずかしいことである。恥ずかしいことなので、IPAの「セキュア・プログラミング講座」や「安全なウェブサイトの作り方」には一度目を通しておくべき。
http://www.ipa.go.jp/security/awareness/vendor/programmingv2/index.html http://www.ipa.go.jp/security/vuln/documents/website_security.pdf
Webアプリケーションの主たる脆弱性
どのような脆弱性が存在するのか列挙していく。基本的にはこんなものだと思う。
- SQLインジェクション
- OSコマンドインジェクション
- 公共領域への意図しないファイル配置
- ディレクトリトラバーサル
- URLクエリパラメータ推測
- XSS攻撃(クロスサイト・スクリプティング)
- CSRF攻撃(クロスサイト・リクエスト・フォージェリ)
- エラー画面表示・デバッグモード有効状態
- Cookieの改竄
- ヌルバイト文字列
- HTTP ヘッダ・インジェクション
- バッファ・オーバーフロー
攻撃と対策
主要な脆弱性の概要、具体的な攻撃手法とその対策についてまとめる。
SQLインジェクション
- 概要
説明するまでもないと思うけど、SQLインジェクションはフォームやパラメータを通じてSQL文やその一部を入力することで、DBに意図しないクエリを投げられ得る脆弱性。
- 攻撃手法
こんな感じのシーンが考えられる
// 件数設定 var lim = $('input#text').attr('value'); var sql = "SELECT * FROM table ORDER BY id LIMIT lim";
ユーザーの入力値およびSQLクエリに対してvalidationが掛けられていない場合にSQLインジェクションが起こる。もしそのようだとここで仮定したとして、変数limにこんな値を入れてみたい。
var lim = 100000000000000000000000000000000000000; とか var lim = "1'; DROP TABLE table"; など
上はレコードの上限をとにかく増やして負荷をかけることが可能になる。したはクエリを一度切ってしまうことでまた新しく任意のクエリをユーザーが入力できてしまう。最悪データベースが吹っ飛ばされる。「このサイト怪しいなー」とか思ったら、シングルクオートやセミコロンなどで挙動を確認...けど犯罪なのでやめましょう。
- 対策
SQL注入攻撃の対策には、次の4つがある。validation,特殊記号のエスケープ,プレースホルダ採用,ストアドプロシジャによる実装である。採用を考慮する順序は、ストアドプロシジャ、プレースホルダ、特殊記号エスケープの順である。validationは常に行う。
XSS攻撃
CSRF攻撃
未完。徐々にまとめてきます。