SlideShare una empresa de Scribd logo
1 de 28
Copyright©2013 JPCERT/CC All rights reserved.
「Javaアプリケーション脆弱性事例調査資料」について
この資料は、Javaプログラマである皆様に、脆弱性を身
近な問題として感じてもらい、セキュアコーディングの
重要性を認識していただくことを目指して作成していま
す。
「Javaセキュアコーディングスタンダード
CERT/Oracle版」と合わせて、セキュアコーディングに
関する理解を深めるためにご利用ください。
JPCERTコーディネーションセンター
セキュアコーディングプロジェクト
secure-coding@jpcert.or.jp
1
Japan Computer Emergency Response
Team Coordination Center
電子署名者 : Japan Computer Emergency Response Team Coordination Center
DN : c=JP, st=Tokyo, l=Chiyoda-ku, email=office@jpcert.or.jp, o=Japan Computer
Emergency Response Team Coordination Center, cn=Japan Computer Emergency
Response Team Coordination Center
日付 : 2013.06.27 11:23:15 +09'00'
Blojsom におけるクロスサイト
スクリプティングの脆弱性
CVE-2006-4829
JVNDB-2006-001260
2
Copyright©2013 JPCERT/CC All rights reserved.
Blojsomとは
BlojsomはJavaで書かれたブログシステム
AppleのMac OS X Server 10.4 TigerのWeblog Serverは
blojsomがベースとなっている
3
Copyright©2013 JPCERT/CC All rights reserved.
脆弱性の概要
4
•Blojsom は入力された文字列の処理に不備があり、
クロスサイトスクリプティング攻撃が可能
•攻撃者の用意したリンクをクリックするだけでク
ロスサイトスクリプティング攻撃が成立する
•クロスサイトスクリプティングにより、アカウン
ト乗っ取り等の被害が発生する
Copyright©2013 JPCERT/CC All rights reserved.
クロスサイトスクリプティングとは
クロスサイトスクリプティングとは、ユーザの
入力値を元にHTMLやURLなどを動的に生成し
ているWebサイトにおいて、攻撃者によって
ユーザのブラウザに表示されるコンテンツに任
意のHTMLやJavaScriptを埋め込む攻撃。
クロスサイトスクリプティングにより下記のよ
うな被害が発生する。
—不正なサイトへの誘導
—Cookieの搾取によるセッションの乗っ取り
—不正プログラムの埋め込み・実行
—機密情報の漏えい(HTTPSページの情報搾取や
HTMLフォームの偽装等)
5
Copyright©2013 JPCERT/CC All rights reserved.
クロスサイトスクリプティング攻撃例
6
①ユーザーを攻撃者のWebサイトに誘導
②攻撃者のWebサイトにアクセス
③攻撃コードを含むレスポンス
④攻撃コードを
含むリクエスト① 攻撃者はユーザーを攻撃者のWebサイトに誘導
する。
② ユーザーは攻撃者のサイトにアクセスする。
③ 攻撃者のサイトから、攻撃対象サイトに対する
攻撃コードを含むレスポンスが返される。
④ ユーザーは攻撃対象サイトに対して攻撃コード
を含むリクエストを送信する。
⑤ ユーザーは攻撃コードを含むレスポンスを受信
し、攻撃対象サイトのページ上で攻撃コードが
実行される。
攻撃対象サイト
攻撃の流れ
⑤攻撃コードを
含むレスポンス
攻撃実行!!
攻撃者
ユーザ
Copyright©2013 JPCERT/CC All rights reserved.
クロスサイトスクリプティング攻撃例
7
⑥セッションIDが奪われる
⑥ 攻撃コードが実行され、セッションIDが奪われる。
⑦ 攻撃者は奪ったセッションIDを利用して、ユーザーになりすまして攻撃対
象サイトにアクセスする。
⑧ 攻撃対象サイト上のユーザー情報を奪うことが可能となる。
攻撃対象サイト
攻撃の流れ
攻撃実行!!
⑦ユーザーになりすまし
⑧機密情報の漏えい
攻撃者
ユーザ
Copyright©2013 JPCERT/CC All rights reserved.
Blojsom の処理内容
8
ブログに新しい書き込みを実施した場合の処理フロー
① クライアントのブラウザからリクエストが送信され、アプリケーションが受
信する。
② リクエストからパラメータを取り出し、処理(ブログの書き込み)を実施。
③ アプリケーションは書き込み結果とともに、書き込み内容をクライアントに
レスポンスとして送信し、クライアントのブラウザに表示される
①
②③
8
Copyright©2013 JPCERT/CC All rights reserved.
Blojsomの処理: ①クライアントからリクエストを受信する
9
POST /blojsom/blog/default/ HTTP/1.1
Host: 192.168.xxx.xxx
Content-Length: 370
action=add-blog-entry&flavor=….&rss-enclosure-url=test&…&submit=Add+blog+entry
<form action=‘/blojsom/blog/default/’ method=‘POST’>
:
<input type=‘text’ name=‘rss-enclosure-url’ value=‘test’>
:
<input type=‘submit’ name=‘post’ value=‘Add blog entry’>
</form>
クライアントから送信されるリクエストは下記のようになる。
※ここではパラメータ “rss-enclosure-url” に注目する。
HTTPリクエスト
上記HTTPリクエストを送信するためのHTML
ここではパラメータ
rss-enclosure-url の値は test
Copyright©2013 JPCERT/CC All rights reserved.
ブログ書き込み画面
パラメータ rss-enclosure-url
の入力フォーム
10
Blojsomの処理: ①クライアントからリクエストを受信する
Copyright©2013 JPCERT/CC All rights reserved.
Blojsomの処理: ②リクエストの処理とブログへの書き込み処理
11
public class RSSEnclosurePlugin implements BlojsomPlugin, BlojsomListener {
:
public static final String RSS_ENCLOSURE_URL = "rss-enclosure-url";
:
public void processEvent(BlojsomEvent event) {
:
ProcessBlogEntryEvent processBlogEntryEvent =
(ProcessBlogEntryEvent) event;
:
//リクエストからパラメータrss-enclosure-urlの値を取り出す
String rssEnclosureURL =
BlojsomUtils.getRequestValue(RSS_ENCLOSURE_URL,
processBlogEntryEvent.getHttpServletRequest());
:
(ブログへの書き込み処理)
:
RSSEnclosurePlugin.java
リクエストからパラメータ rss-enclosure-url の値を変数 rssEnclosureURL に格納
し、ブログへの書き込み処理を実施する。
Copyright©2013 JPCERT/CC All rights reserved.
Blojsomの処理: ③処理結果をクライアントへ返す
12
public class RSSEnclosurePlugin implements BlojsomPlugin, BlojsomListener {
:
public void processEvent(BlojsomEvent event) {
:
//クライアントに値を返す
processBlogEntryEvent.getContext().put(RSS_ENCLOSURE_URL_ITEM,
rssEnclosureURL);
RSSEnclosurePlugin.java
書き込み処理を実施後、変数rssEnclosureURLの値をレスポンスとしてクライ
アントに返す。
Copyright©2013 JPCERT/CC All rights reserved.13
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Pragma: no-cache
Content-Type: text/html;charset=UTF-8
Date: Fri, 05 Oct 2012 07:29:17 GMT
Content-Length: 26881
<html>
<head>
:
<tr>
<td>URL to enclosure</td>
<td><input type="text" name="rss-enclosure-url" value="test" size="60" /></td>
</tr>
:
HTTPレスポンス
アプリケーションからクライアントへ送信されるHTTPレスポンスは下記のよう
な内容になる。
Blojsomの処理: ③処理結果をクライアントへ返す
Copyright©2013 JPCERT/CC All rights reserved.14
処理完了画面
書き込み完了の結果を表示
POSTした内容がそのまま表
示される。
Blojsomの処理: ③処理結果をクライアントへ返す
Copyright©2013 JPCERT/CC All rights reserved.
攻撃コード
15
POST /blojsom/blog/default/ HTTP/1.1
Host: 192.168.xxx.xxx
Content-Length: 370
action=add-blog-entry&flavor=….&
rss-enclosure-url="><script>alert(123)</script>&…&submit=Add+blog+entry
攻撃コードのHTTPリクエスト
■攻撃コードのポイント
• パラメータ rss-enclosure-url にスクリプトタグを含む値を送信する。
Copyright©2013 JPCERT/CC All rights reserved.
攻撃コード
16
<form action=‘/blojsom/blog/default/’ method=‘POST’>
:
<input type=‘hidden’ name=‘rss-enclosure-url’
value=‘"><script>alert(123)</script>’>
:
<input type=‘submit’ name=‘post’ value=‘Add blog entry’>
</form>
攻撃コードのHTTPリクエストを送信するためのHTML
被害者にこのフォームのリクエストを送信させることでクロスサイトスクリ
プティング攻撃が成立する。
Click me!!
魅惑のコンテンツ
Copyright©2013 JPCERT/CC All rights reserved.
攻撃コードが実行された際の処理
17
ブログに新しい書き込みを実施した場合の処理フロー
① クライアントのブラウザからリクエストが送信され、アプリケーションが受
信する。
② リクエストからパラメータを取り出し、処理(ブログの書き込み)を実施。
③ アプリケーションは書き込み結果とともに、書き込み内容をクライアントに
レスポンスとして送信し、クライアントのブラウザに表示される
攻撃が実施された際の処理フローは正常な処理とまったく変わらない。
③のアプリケーションから送信されるレスポンス内容に注目する。
Copyright©2013 JPCERT/CC All rights reserved.
<td>URL to enclosure</td>
<td><input type="text" name="rss-enclosure-url" value=“test” size="60" /></td>
</tr>
攻撃コードが実行された際の処理
18
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
:
<html>
<head>
:
<tr>
<td>URL to enclosure</td>
<td><input type="text" name="rss-enclosure-url" value=""><script>alert(123)</script>”
size="60" /></td>
</tr>
アプリケーションからクライアントに返されるHTTPレスポンス
HTTPレスポンス
通常の処理の際のレスポンス
挿入された文字列により、input タグが閉じられ script タグが
挿入された形になる。そのため、ブラウザは script タグ内の
Javascript を実行してしまう。
Copyright©2013 JPCERT/CC All rights reserved.
問題点
今回のアプリケーションにおける具体的な問題点
HTMLへ出力する際に、Javascriptとして解釈される文字列
を無害化していないために脆弱性が発生している。
以下のコーティングガイドに違反している
「 IDS00-J. 信頼境界を越えて渡される信頼できない
データは無害化する」
上記の問題点に対してどうすべきだったか
Javascriptとして解釈される文字列を無害化してから
HTMLに出力すべきであった。
19
Copyright©2013 JPCERT/CC All rights reserved.
ブログに新しい書き込みを実施した場合の処理フロー
① クライアントのブラウザからリクエストが送信され、アプリケーションが受
信する。
② リクエストからパラメータを取り出し、処理(ブログの書き込み)を実施。
③ アプリケーションは書き込み結果とともに、書き込み内容をクライアントに
レスポンスとして送信し、クライアントのブラウザに表示される
修正版コード
20
この処理のコードに
修正が入っている
本脆弱性はバージョン2.32で修正されている
Copyright©2013 JPCERT/CC All rights reserved.
public class RSSEnclosurePlugin implements BlojsomPlugin, BlojsomListener {
:
public void processEvent(BlojsomEvent event) {
:
processBlogEntryEvent.getContext().put(RSS_ENCLOSURE_URL_ITEM,
BlojsomUtils.escapeBrackets(rssEnclosureURL));
修正版コード
21
public class RSSEnclosurePlugin implements BlojsomPlugin, BlojsomListener {
:
public void processEvent(BlojsomEvent event) {
:
processBlogEntryEvent.getContext().put(RSS_ENCLOSURE_URL_ITEM,
rssEnclosureURL);
RSSEnclosurePlugin.java(修正前)
RSSEnclosurePlugin.java(修正後)
クライアントに値を返す際
BlojsomUtilsクラスの
escapeBracketsメソッドを
呼び出している。
Copyright©2013 JPCERT/CC All rights reserved.
修正版コード
22
public static String escapeBrackets(String input) {
if (input == null) {
return null;
}
String unescaped = replace(input, "<", "&lt;");
unescaped = replace(unescaped, ">", "&gt;");
return unescaped;
}
無害化処理として、引数inputの値に含まれる値をエスケープ処理している。
BlojsomUtilsクラスのescapeBracketsメソッド
エスケープ対象文字列 エスケープ処理後文字列
< &lt;
> &gt;
Copyright©2013 JPCERT/CC All rights reserved.
修正版コード
23
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
:
<html>
<head>
:
<tr>
<td>URL to enclosure</td>
<td><input type="text" name="rss-enclosure-url"
value=""&gt;&lt;script&gt;alert(123)&lt;/script&gt; size="60" /></td>
</tr>
HTTPレスポンス
修正版コードに対して先ほどの攻撃コードを実行すると、下記のようなHTTP
レスポンスになり、スクリプトが実行されなくなる。
エスケープ処理により
スクリプトが実行されなくなる。
Copyright©2013 JPCERT/CC All rights reserved.
実はこの修正では不十分!!
クロスサイトスクリプティングに対する無害化を行う際
に、前述の処理だけでは完全に無害化できないケースが
存在する。
具体的にはHTMLのタグ内への文字列の出力。
パラメータrss-enclosure-urlに
「“ onfocus=”javascript:alert(1)」という値を挿入するこ
とで、入力フォームにマウスカーソルを持っていくと
Javascriptが動作する。
24
<td>URL to enclosure</td>
<td>
<input type=“text” name=“rss-enclosure-url” value=“" onfocus="javascript:alert(1)”
size="60" /></td>
</tr>
パラメータrss-enclosure-urlに「 " onfocus="javascript:alert(1) 」を挿入した際のHTTPレスポンス
BlojsomUtilsクラスのescapeBracketsメソッドによる
エスケープ処理をバイパスできてしまう。
Copyright©2013 JPCERT/CC All rights reserved.
さらに修正
次の5種類の文字をHTMLエンコードする
さらにユーザからの入力値をタグの属性値に埋め込む場合は、値全
体を「“(ダブルクオート)」文字で括る。
それにより、「a“ onmouseover=”alert(1);」という文字列を挿入さ
せられた場合でも、次のようなHTMLが生成されるためJavaScript
は実行されない。
25
エスケープ対象文字列 エスケープ処理後文字列
< &lt;
> &gt;
& &amp;
“ &quot;
‘ &#39;
<input type="text" value="a&quot; onmouseover=&quot;alert(1);">
Copyright©2013 JPCERT/CC All rights reserved.
さらに修正
26
public static String escapeBrackets(String input) {
if (input == null) {
return null;
}
String unescaped = replace(input, "<", "&lt;");
unescaped = replace(unescaped, ">", "&gt;");
unescaped = replace(unescaped, " & ", "&amp;");
unescaped = replace(unescaped, " ¥" ", "&quot;");
unescaped = replace(unescaped, " ’ ", "&#39;");
return unescaped;
}
BlojsomUtilsクラスのescapeBracketsメソッド(追加修正版)
前述を踏まえてescapeBracketsメソッドを修正すると下記のようになる。
追加されたコード。
3つの特殊記号に対する
エスケープ処理を追記する。
Copyright©2013 JPCERT/CC All rights reserved.
まとめ
27
■この脆弱性から学べるプログラミングの注意点
•アプリケーションの外部にデータを出力する場合、出力
先でデータがどのように使用されるかを考慮すべきだっ
た
■上記への対策
• データの出力先がWebブラウザの場合、想定外の個所に
HTML のメタ文字が含まれている場合に備えてHTMLエン
コーディングを施す
【参考】
OWASP XSS Filter Evasion Cheat Sheet
https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
XSS (Cross Site Scripting) Prevention Cheat Sheet
https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
Copyright©2013 JPCERT/CC All rights reserved.
著作権・引用や二次利用について
本資料の著作権はJPCERT/CCに帰属します。
本資料あるいはその一部を引用・転載・再配布する際は、引用元名、資料名および URL の明示をお
願いします。
記載例
引用元:一般社団法人JPCERTコーディネーションセンター
Java アプリケーション脆弱性事例解説資料
Blojsom におけるクロスサイトスクリプティングの脆弱性
https://www.jpcert.or.jp/research/materials-java-casestudies/No.3_Blojsom.pdf
本資料を引用・転載・再配布をする際は、引用先文書、時期、内容等の情報を、JPCERT コーディ
ネーションセンター広報(office@jpcert.or.jp)までメールにてお知らせください。なお、この連絡に
より取得した個人情報は、別途定めるJPCERT コーディネーションセンターの「プライバシーポリ
シー」に則って取り扱います。
本資料の利用方法等に関するお問い合わせ
JPCERTコーディネーションセンター
広報担当
E-mail:office@jpcert.or.jp
28
本資料の技術的な内容に関するお問い合わせ
JPCERTコーディネーションセンター
セキュアコーディング担当
E-mail:secure-coding@jpcert.or.jp

Más contenido relacionado

Destacado

Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性JPCERT Coordination Center
 
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性JPCERT Coordination Center
 
MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性JPCERT Coordination Center
 
Advanced SQL Injection Attack & Defenses
Advanced SQL Injection Attack & DefensesAdvanced SQL Injection Attack & Defenses
Advanced SQL Injection Attack & DefensesTiago Mendo
 
Advanced sql injection
Advanced sql injectionAdvanced sql injection
Advanced sql injectionbadhanbd
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)JPCERT Coordination Center
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JPCERT Coordination Center
 
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
Lessons (to be) Learned from Handling OpenSSL VulnerabilitiesLessons (to be) Learned from Handling OpenSSL Vulnerabilities
Lessons (to be) Learned from Handling OpenSSL VulnerabilitiesJPCERT Coordination Center
 
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JPCERT Coordination Center
 
OWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCONOWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCONJun Matsumoto
 
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)JPCERT Coordination Center
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)JPCERT Coordination Center
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性JPCERT Coordination Center
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)JPCERT Coordination Center
 
It all starts with the ' (SQL injection from attacker's point of view)
It all starts with the ' (SQL injection from attacker's point of view)It all starts with the ' (SQL injection from attacker's point of view)
It all starts with the ' (SQL injection from attacker's point of view)Miroslav Stampar
 
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...JPCERT Coordination Center
 
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)JPCERT Coordination Center
 
自分よりも技術力の高い会社に入社して感じたこと
自分よりも技術力の高い会社に入社して感じたこと自分よりも技術力の高い会社に入社して感じたこと
自分よりも技術力の高い会社に入社して感じたことSuzuki Masayuki
 

Destacado (20)

Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
Spacewalkにおけるクロスサイト リクエストフォージェリ(CSRF)の脆弱性
 
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
Apache Tomcat における クロスサイトリクエストフォージェリ (CSRF) 保護メカニズム回避の脆弱性
 
MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性
 
Advanced SQL Injection Attack & Defenses
Advanced SQL Injection Attack & DefensesAdvanced SQL Injection Attack & Defenses
Advanced SQL Injection Attack & Defenses
 
Advanced sql injection
Advanced sql injectionAdvanced sql injection
Advanced sql injection
 
Apache Axis2におけるXML署名検証不備
Apache Axis2におけるXML署名検証不備Apache Axis2におけるXML署名検証不備
Apache Axis2におけるXML署名検証不備
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
 
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性JBoss Application Server におけるディレクトリトラバーサルの脆弱性
JBoss Application Server におけるディレクトリトラバーサルの脆弱性
 
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
Lessons (to be) Learned from Handling OpenSSL VulnerabilitiesLessons (to be) Learned from Handling OpenSSL Vulnerabilities
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
 
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
 
OWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCONOWASP ZAP(など)で挑む SECCON
OWASP ZAP(など)で挑む SECCON
 
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
Apache ActiveMQにおける認証処理不備の脆弱性(AMQ-1272)
 
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
 
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
 
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
 
It all starts with the ' (SQL injection from attacker's point of view)
It all starts with the ' (SQL injection from attacker's point of view)It all starts with the ' (SQL injection from attacker's point of view)
It all starts with the ' (SQL injection from attacker's point of view)
 
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
Case Studies and Lessons Learned from SSL/TLS Certificate Verification Vulner...
 
脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる脆弱性情報はこうしてやってくる
脆弱性情報はこうしてやってくる
 
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
OWASP ASVS と Cheat Sheet シリーズ (日本語版) のご紹介 (OSC2016Hokkaido)
 
自分よりも技術力の高い会社に入社して感じたこと
自分よりも技術力の高い会社に入社して感じたこと自分よりも技術力の高い会社に入社して感じたこと
自分よりも技術力の高い会社に入社して感じたこと
 

Similar a Blojsom におけるクロスサイトスクリプティングの脆弱性

Web applicationpenetrationtest その4
Web applicationpenetrationtest その4Web applicationpenetrationtest その4
Web applicationpenetrationtest その4Tetsuya Hasegawa
 
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternAtsushi Kambara
 
ライブコーディングとデモで理解するWebセキュリティの基礎
ライブコーディングとデモで理解するWebセキュリティの基礎ライブコーディングとデモで理解するWebセキュリティの基礎
ライブコーディングとデモで理解するWebセキュリティの基礎Takahisa Kishiya
 
Redmineの情報を自分好みに見える化した話
Redmineの情報を自分好みに見える化した話Redmineの情報を自分好みに見える化した話
Redmineの情報を自分好みに見える化した話ToshiharuSakai
 
次世代の企業ITインフラを支えるエンジニアとは
次世代の企業ITインフラを支えるエンジニアとは次世代の企業ITインフラを支えるエンジニアとは
次世代の企業ITインフラを支えるエンジニアとはTrainocate Japan, Ltd.
 
TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介bitbank, Inc. Tokyo, Japan
 
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015ichikaway
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るGo Miyasaka
 
Browser andsecurity2015
Browser andsecurity2015Browser andsecurity2015
Browser andsecurity2015彰 村地
 
webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法
webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法
webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法hiroya
 
HTML5 Web アプリケーションのセキュリティ
HTML5 Web アプリケーションのセキュリティHTML5 Web アプリケーションのセキュリティ
HTML5 Web アプリケーションのセキュリティ彰 村地
 
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)JPCERT Coordination Center
 
機械学習でWebアプリの脆弱性を見つける - Reflected XSS 編 -
機械学習でWebアプリの脆弱性を見つける - Reflected XSS 編 -機械学習でWebアプリの脆弱性を見つける - Reflected XSS 編 -
機械学習でWebアプリの脆弱性を見つける - Reflected XSS 編 -Isao Takaesu
 
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発Yuta Matsumura
 
Essentials of container
Essentials of containerEssentials of container
Essentials of containerToru Makabe
 
継続的デリバリーとサービス仮想化で変わる、エンタープライズアジャイル開発
継続的デリバリーとサービス仮想化で変わる、エンタープライズアジャイル開発継続的デリバリーとサービス仮想化で変わる、エンタープライズアジャイル開発
継続的デリバリーとサービス仮想化で変わる、エンタープライズアジャイル開発Takashi Watanabe
 
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」Hiroyuki Ohnaka
 

Similar a Blojsom におけるクロスサイトスクリプティングの脆弱性 (20)

Web applicationpenetrationtest その4
Web applicationpenetrationtest その4Web applicationpenetrationtest その4
Web applicationpenetrationtest その4
 
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
 
ライブコーディングとデモで理解するWebセキュリティの基礎
ライブコーディングとデモで理解するWebセキュリティの基礎ライブコーディングとデモで理解するWebセキュリティの基礎
ライブコーディングとデモで理解するWebセキュリティの基礎
 
Redmineの情報を自分好みに見える化した話
Redmineの情報を自分好みに見える化した話Redmineの情報を自分好みに見える化した話
Redmineの情報を自分好みに見える化した話
 
Angularreflex20141210
Angularreflex20141210Angularreflex20141210
Angularreflex20141210
 
次世代の企業ITインフラを支えるエンジニアとは
次世代の企業ITインフラを支えるエンジニアとは次世代の企業ITインフラを支えるエンジニアとは
次世代の企業ITインフラを支えるエンジニアとは
 
TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介
 
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
Browser andsecurity2015
Browser andsecurity2015Browser andsecurity2015
Browser andsecurity2015
 
webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法
webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法
webstart-maven-pugin + 無償で正統?なコード署名証明書を入手する方法
 
HTML5 Web アプリケーションのセキュリティ
HTML5 Web アプリケーションのセキュリティHTML5 Web アプリケーションのセキュリティ
HTML5 Web アプリケーションのセキュリティ
 
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
安全なプラグインに必要なこと: 脆弱性届出状況に見る傾向と対策 (WordCampTokyo 2017)
 
機械学習でWebアプリの脆弱性を見つける - Reflected XSS 編 -
機械学習でWebアプリの脆弱性を見つける - Reflected XSS 編 -機械学習でWebアプリの脆弱性を見つける - Reflected XSS 編 -
機械学習でWebアプリの脆弱性を見つける - Reflected XSS 編 -
 
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発
 
Backbone.js入門
Backbone.js入門Backbone.js入門
Backbone.js入門
 
Web Intents入門
Web Intents入門Web Intents入門
Web Intents入門
 
Essentials of container
Essentials of containerEssentials of container
Essentials of container
 
継続的デリバリーとサービス仮想化で変わる、エンタープライズアジャイル開発
継続的デリバリーとサービス仮想化で変わる、エンタープライズアジャイル開発継続的デリバリーとサービス仮想化で変わる、エンタープライズアジャイル開発
継続的デリバリーとサービス仮想化で変わる、エンタープライズアジャイル開発
 
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
 

Más de JPCERT Coordination Center

いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~JPCERT Coordination Center
 
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』JPCERT Coordination Center
 
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルJPCERT Coordination Center
 
Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性JPCERT Coordination Center
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第4回演習の解説
Javaセキュアコーディングセミナー東京第4回演習の解説Javaセキュアコーディングセミナー東京第4回演習の解説
Javaセキュアコーディングセミナー東京第4回演習の解説JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習JPCERT Coordination Center
 

Más de JPCERT Coordination Center (11)

いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
いま改めて製品開発者の脆弱性対応について考える ~情報セキュリティ早期警戒パートナーシップを運用する調整機関の視点から~
 
DLL読み込みの問題を読み解く
DLL読み込みの問題を読み解くDLL読み込みの問題を読み解く
DLL読み込みの問題を読み解く
 
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
WordBench東京 7月勉強会「夏のLT大会!」『WordPress とバックアップの話』
 
ソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデルソフトウェアセキュリティ保証成熟度モデル
ソフトウェアセキュリティ保証成熟度モデル
 
Android Secure Coding
Android Secure CodingAndroid Secure Coding
Android Secure Coding
 
Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性Apache Struts2 における任意の Java メソッド実行の脆弱性
Apache Struts2 における任意の Java メソッド実行の脆弱性
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
 
Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説Javaセキュアコーディングセミナー東京第2回演習の解説
Javaセキュアコーディングセミナー東京第2回演習の解説
 
Javaセキュアコーディングセミナー東京第4回演習の解説
Javaセキュアコーディングセミナー東京第4回演習の解説Javaセキュアコーディングセミナー東京第4回演習の解説
Javaセキュアコーディングセミナー東京第4回演習の解説
 
Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習
 

Blojsom におけるクロスサイトスクリプティングの脆弱性

  • 1. Copyright©2013 JPCERT/CC All rights reserved. 「Javaアプリケーション脆弱性事例調査資料」について この資料は、Javaプログラマである皆様に、脆弱性を身 近な問題として感じてもらい、セキュアコーディングの 重要性を認識していただくことを目指して作成していま す。 「Javaセキュアコーディングスタンダード CERT/Oracle版」と合わせて、セキュアコーディングに 関する理解を深めるためにご利用ください。 JPCERTコーディネーションセンター セキュアコーディングプロジェクト secure-coding@jpcert.or.jp 1 Japan Computer Emergency Response Team Coordination Center 電子署名者 : Japan Computer Emergency Response Team Coordination Center DN : c=JP, st=Tokyo, l=Chiyoda-ku, email=office@jpcert.or.jp, o=Japan Computer Emergency Response Team Coordination Center, cn=Japan Computer Emergency Response Team Coordination Center 日付 : 2013.06.27 11:23:15 +09'00'
  • 3. Copyright©2013 JPCERT/CC All rights reserved. Blojsomとは BlojsomはJavaで書かれたブログシステム AppleのMac OS X Server 10.4 TigerのWeblog Serverは blojsomがベースとなっている 3
  • 4. Copyright©2013 JPCERT/CC All rights reserved. 脆弱性の概要 4 •Blojsom は入力された文字列の処理に不備があり、 クロスサイトスクリプティング攻撃が可能 •攻撃者の用意したリンクをクリックするだけでク ロスサイトスクリプティング攻撃が成立する •クロスサイトスクリプティングにより、アカウン ト乗っ取り等の被害が発生する
  • 5. Copyright©2013 JPCERT/CC All rights reserved. クロスサイトスクリプティングとは クロスサイトスクリプティングとは、ユーザの 入力値を元にHTMLやURLなどを動的に生成し ているWebサイトにおいて、攻撃者によって ユーザのブラウザに表示されるコンテンツに任 意のHTMLやJavaScriptを埋め込む攻撃。 クロスサイトスクリプティングにより下記のよ うな被害が発生する。 —不正なサイトへの誘導 —Cookieの搾取によるセッションの乗っ取り —不正プログラムの埋め込み・実行 —機密情報の漏えい(HTTPSページの情報搾取や HTMLフォームの偽装等) 5
  • 6. Copyright©2013 JPCERT/CC All rights reserved. クロスサイトスクリプティング攻撃例 6 ①ユーザーを攻撃者のWebサイトに誘導 ②攻撃者のWebサイトにアクセス ③攻撃コードを含むレスポンス ④攻撃コードを 含むリクエスト① 攻撃者はユーザーを攻撃者のWebサイトに誘導 する。 ② ユーザーは攻撃者のサイトにアクセスする。 ③ 攻撃者のサイトから、攻撃対象サイトに対する 攻撃コードを含むレスポンスが返される。 ④ ユーザーは攻撃対象サイトに対して攻撃コード を含むリクエストを送信する。 ⑤ ユーザーは攻撃コードを含むレスポンスを受信 し、攻撃対象サイトのページ上で攻撃コードが 実行される。 攻撃対象サイト 攻撃の流れ ⑤攻撃コードを 含むレスポンス 攻撃実行!! 攻撃者 ユーザ
  • 7. Copyright©2013 JPCERT/CC All rights reserved. クロスサイトスクリプティング攻撃例 7 ⑥セッションIDが奪われる ⑥ 攻撃コードが実行され、セッションIDが奪われる。 ⑦ 攻撃者は奪ったセッションIDを利用して、ユーザーになりすまして攻撃対 象サイトにアクセスする。 ⑧ 攻撃対象サイト上のユーザー情報を奪うことが可能となる。 攻撃対象サイト 攻撃の流れ 攻撃実行!! ⑦ユーザーになりすまし ⑧機密情報の漏えい 攻撃者 ユーザ
  • 8. Copyright©2013 JPCERT/CC All rights reserved. Blojsom の処理内容 8 ブログに新しい書き込みを実施した場合の処理フロー ① クライアントのブラウザからリクエストが送信され、アプリケーションが受 信する。 ② リクエストからパラメータを取り出し、処理(ブログの書き込み)を実施。 ③ アプリケーションは書き込み結果とともに、書き込み内容をクライアントに レスポンスとして送信し、クライアントのブラウザに表示される ① ②③ 8
  • 9. Copyright©2013 JPCERT/CC All rights reserved. Blojsomの処理: ①クライアントからリクエストを受信する 9 POST /blojsom/blog/default/ HTTP/1.1 Host: 192.168.xxx.xxx Content-Length: 370 action=add-blog-entry&flavor=….&rss-enclosure-url=test&…&submit=Add+blog+entry <form action=‘/blojsom/blog/default/’ method=‘POST’> : <input type=‘text’ name=‘rss-enclosure-url’ value=‘test’> : <input type=‘submit’ name=‘post’ value=‘Add blog entry’> </form> クライアントから送信されるリクエストは下記のようになる。 ※ここではパラメータ “rss-enclosure-url” に注目する。 HTTPリクエスト 上記HTTPリクエストを送信するためのHTML ここではパラメータ rss-enclosure-url の値は test
  • 10. Copyright©2013 JPCERT/CC All rights reserved. ブログ書き込み画面 パラメータ rss-enclosure-url の入力フォーム 10 Blojsomの処理: ①クライアントからリクエストを受信する
  • 11. Copyright©2013 JPCERT/CC All rights reserved. Blojsomの処理: ②リクエストの処理とブログへの書き込み処理 11 public class RSSEnclosurePlugin implements BlojsomPlugin, BlojsomListener { : public static final String RSS_ENCLOSURE_URL = "rss-enclosure-url"; : public void processEvent(BlojsomEvent event) { : ProcessBlogEntryEvent processBlogEntryEvent = (ProcessBlogEntryEvent) event; : //リクエストからパラメータrss-enclosure-urlの値を取り出す String rssEnclosureURL = BlojsomUtils.getRequestValue(RSS_ENCLOSURE_URL, processBlogEntryEvent.getHttpServletRequest()); : (ブログへの書き込み処理) : RSSEnclosurePlugin.java リクエストからパラメータ rss-enclosure-url の値を変数 rssEnclosureURL に格納 し、ブログへの書き込み処理を実施する。
  • 12. Copyright©2013 JPCERT/CC All rights reserved. Blojsomの処理: ③処理結果をクライアントへ返す 12 public class RSSEnclosurePlugin implements BlojsomPlugin, BlojsomListener { : public void processEvent(BlojsomEvent event) { : //クライアントに値を返す processBlogEntryEvent.getContext().put(RSS_ENCLOSURE_URL_ITEM, rssEnclosureURL); RSSEnclosurePlugin.java 書き込み処理を実施後、変数rssEnclosureURLの値をレスポンスとしてクライ アントに返す。
  • 13. Copyright©2013 JPCERT/CC All rights reserved.13 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Pragma: no-cache Content-Type: text/html;charset=UTF-8 Date: Fri, 05 Oct 2012 07:29:17 GMT Content-Length: 26881 <html> <head> : <tr> <td>URL to enclosure</td> <td><input type="text" name="rss-enclosure-url" value="test" size="60" /></td> </tr> : HTTPレスポンス アプリケーションからクライアントへ送信されるHTTPレスポンスは下記のよう な内容になる。 Blojsomの処理: ③処理結果をクライアントへ返す
  • 14. Copyright©2013 JPCERT/CC All rights reserved.14 処理完了画面 書き込み完了の結果を表示 POSTした内容がそのまま表 示される。 Blojsomの処理: ③処理結果をクライアントへ返す
  • 15. Copyright©2013 JPCERT/CC All rights reserved. 攻撃コード 15 POST /blojsom/blog/default/ HTTP/1.1 Host: 192.168.xxx.xxx Content-Length: 370 action=add-blog-entry&flavor=….& rss-enclosure-url="><script>alert(123)</script>&…&submit=Add+blog+entry 攻撃コードのHTTPリクエスト ■攻撃コードのポイント • パラメータ rss-enclosure-url にスクリプトタグを含む値を送信する。
  • 16. Copyright©2013 JPCERT/CC All rights reserved. 攻撃コード 16 <form action=‘/blojsom/blog/default/’ method=‘POST’> : <input type=‘hidden’ name=‘rss-enclosure-url’ value=‘"><script>alert(123)</script>’> : <input type=‘submit’ name=‘post’ value=‘Add blog entry’> </form> 攻撃コードのHTTPリクエストを送信するためのHTML 被害者にこのフォームのリクエストを送信させることでクロスサイトスクリ プティング攻撃が成立する。 Click me!! 魅惑のコンテンツ
  • 17. Copyright©2013 JPCERT/CC All rights reserved. 攻撃コードが実行された際の処理 17 ブログに新しい書き込みを実施した場合の処理フロー ① クライアントのブラウザからリクエストが送信され、アプリケーションが受 信する。 ② リクエストからパラメータを取り出し、処理(ブログの書き込み)を実施。 ③ アプリケーションは書き込み結果とともに、書き込み内容をクライアントに レスポンスとして送信し、クライアントのブラウザに表示される 攻撃が実施された際の処理フローは正常な処理とまったく変わらない。 ③のアプリケーションから送信されるレスポンス内容に注目する。
  • 18. Copyright©2013 JPCERT/CC All rights reserved. <td>URL to enclosure</td> <td><input type="text" name="rss-enclosure-url" value=“test” size="60" /></td> </tr> 攻撃コードが実行された際の処理 18 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 : <html> <head> : <tr> <td>URL to enclosure</td> <td><input type="text" name="rss-enclosure-url" value=""><script>alert(123)</script>” size="60" /></td> </tr> アプリケーションからクライアントに返されるHTTPレスポンス HTTPレスポンス 通常の処理の際のレスポンス 挿入された文字列により、input タグが閉じられ script タグが 挿入された形になる。そのため、ブラウザは script タグ内の Javascript を実行してしまう。
  • 19. Copyright©2013 JPCERT/CC All rights reserved. 問題点 今回のアプリケーションにおける具体的な問題点 HTMLへ出力する際に、Javascriptとして解釈される文字列 を無害化していないために脆弱性が発生している。 以下のコーティングガイドに違反している 「 IDS00-J. 信頼境界を越えて渡される信頼できない データは無害化する」 上記の問題点に対してどうすべきだったか Javascriptとして解釈される文字列を無害化してから HTMLに出力すべきであった。 19
  • 20. Copyright©2013 JPCERT/CC All rights reserved. ブログに新しい書き込みを実施した場合の処理フロー ① クライアントのブラウザからリクエストが送信され、アプリケーションが受 信する。 ② リクエストからパラメータを取り出し、処理(ブログの書き込み)を実施。 ③ アプリケーションは書き込み結果とともに、書き込み内容をクライアントに レスポンスとして送信し、クライアントのブラウザに表示される 修正版コード 20 この処理のコードに 修正が入っている 本脆弱性はバージョン2.32で修正されている
  • 21. Copyright©2013 JPCERT/CC All rights reserved. public class RSSEnclosurePlugin implements BlojsomPlugin, BlojsomListener { : public void processEvent(BlojsomEvent event) { : processBlogEntryEvent.getContext().put(RSS_ENCLOSURE_URL_ITEM, BlojsomUtils.escapeBrackets(rssEnclosureURL)); 修正版コード 21 public class RSSEnclosurePlugin implements BlojsomPlugin, BlojsomListener { : public void processEvent(BlojsomEvent event) { : processBlogEntryEvent.getContext().put(RSS_ENCLOSURE_URL_ITEM, rssEnclosureURL); RSSEnclosurePlugin.java(修正前) RSSEnclosurePlugin.java(修正後) クライアントに値を返す際 BlojsomUtilsクラスの escapeBracketsメソッドを 呼び出している。
  • 22. Copyright©2013 JPCERT/CC All rights reserved. 修正版コード 22 public static String escapeBrackets(String input) { if (input == null) { return null; } String unescaped = replace(input, "<", "&lt;"); unescaped = replace(unescaped, ">", "&gt;"); return unescaped; } 無害化処理として、引数inputの値に含まれる値をエスケープ処理している。 BlojsomUtilsクラスのescapeBracketsメソッド エスケープ対象文字列 エスケープ処理後文字列 < &lt; > &gt;
  • 23. Copyright©2013 JPCERT/CC All rights reserved. 修正版コード 23 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 : <html> <head> : <tr> <td>URL to enclosure</td> <td><input type="text" name="rss-enclosure-url" value=""&gt;&lt;script&gt;alert(123)&lt;/script&gt; size="60" /></td> </tr> HTTPレスポンス 修正版コードに対して先ほどの攻撃コードを実行すると、下記のようなHTTP レスポンスになり、スクリプトが実行されなくなる。 エスケープ処理により スクリプトが実行されなくなる。
  • 24. Copyright©2013 JPCERT/CC All rights reserved. 実はこの修正では不十分!! クロスサイトスクリプティングに対する無害化を行う際 に、前述の処理だけでは完全に無害化できないケースが 存在する。 具体的にはHTMLのタグ内への文字列の出力。 パラメータrss-enclosure-urlに 「“ onfocus=”javascript:alert(1)」という値を挿入するこ とで、入力フォームにマウスカーソルを持っていくと Javascriptが動作する。 24 <td>URL to enclosure</td> <td> <input type=“text” name=“rss-enclosure-url” value=“" onfocus="javascript:alert(1)” size="60" /></td> </tr> パラメータrss-enclosure-urlに「 " onfocus="javascript:alert(1) 」を挿入した際のHTTPレスポンス BlojsomUtilsクラスのescapeBracketsメソッドによる エスケープ処理をバイパスできてしまう。
  • 25. Copyright©2013 JPCERT/CC All rights reserved. さらに修正 次の5種類の文字をHTMLエンコードする さらにユーザからの入力値をタグの属性値に埋め込む場合は、値全 体を「“(ダブルクオート)」文字で括る。 それにより、「a“ onmouseover=”alert(1);」という文字列を挿入さ せられた場合でも、次のようなHTMLが生成されるためJavaScript は実行されない。 25 エスケープ対象文字列 エスケープ処理後文字列 < &lt; > &gt; & &amp; “ &quot; ‘ &#39; <input type="text" value="a&quot; onmouseover=&quot;alert(1);">
  • 26. Copyright©2013 JPCERT/CC All rights reserved. さらに修正 26 public static String escapeBrackets(String input) { if (input == null) { return null; } String unescaped = replace(input, "<", "&lt;"); unescaped = replace(unescaped, ">", "&gt;"); unescaped = replace(unescaped, " & ", "&amp;"); unescaped = replace(unescaped, " ¥" ", "&quot;"); unescaped = replace(unescaped, " ’ ", "&#39;"); return unescaped; } BlojsomUtilsクラスのescapeBracketsメソッド(追加修正版) 前述を踏まえてescapeBracketsメソッドを修正すると下記のようになる。 追加されたコード。 3つの特殊記号に対する エスケープ処理を追記する。
  • 27. Copyright©2013 JPCERT/CC All rights reserved. まとめ 27 ■この脆弱性から学べるプログラミングの注意点 •アプリケーションの外部にデータを出力する場合、出力 先でデータがどのように使用されるかを考慮すべきだっ た ■上記への対策 • データの出力先がWebブラウザの場合、想定外の個所に HTML のメタ文字が含まれている場合に備えてHTMLエン コーディングを施す 【参考】 OWASP XSS Filter Evasion Cheat Sheet https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet XSS (Cross Site Scripting) Prevention Cheat Sheet https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
  • 28. Copyright©2013 JPCERT/CC All rights reserved. 著作権・引用や二次利用について 本資料の著作権はJPCERT/CCに帰属します。 本資料あるいはその一部を引用・転載・再配布する際は、引用元名、資料名および URL の明示をお 願いします。 記載例 引用元:一般社団法人JPCERTコーディネーションセンター Java アプリケーション脆弱性事例解説資料 Blojsom におけるクロスサイトスクリプティングの脆弱性 https://www.jpcert.or.jp/research/materials-java-casestudies/No.3_Blojsom.pdf 本資料を引用・転載・再配布をする際は、引用先文書、時期、内容等の情報を、JPCERT コーディ ネーションセンター広報(office@jpcert.or.jp)までメールにてお知らせください。なお、この連絡に より取得した個人情報は、別途定めるJPCERT コーディネーションセンターの「プライバシーポリ シー」に則って取り扱います。 本資料の利用方法等に関するお問い合わせ JPCERTコーディネーションセンター 広報担当 E-mail:office@jpcert.or.jp 28 本資料の技術的な内容に関するお問い合わせ JPCERTコーディネーションセンター セキュアコーディング担当 E-mail:secure-coding@jpcert.or.jp