じこしょーかい
•影白 @KageShiron
•主にC#、Web、セキュリティ関係
をやってるフレンズ
•セキュリティキャンプ2016 全国大会
参加してきました
WEBセキュリティ入門
Do you know XSS
Cross Site Scripting
||
悪意のあるスクリプトを埋め込む攻撃
持続型/蓄積型XSS
•サーバーに書き込まれてほかのユーザーもス
クリプトを実行してしまう
•例:掲示板、コメント欄etc…
•イメージ
http://codepen.io/anon/pen/dvKzGa
反射型XSS
•HTTPリクエストに含まれる攻撃コードが
実行されてしまうタイプ
•URLに埋め込むのが一番ポピュラー
•サンプル(ほかの方のを借用)
http://bogus.jp/xsssample/xsssample_01.php
反射型XSS
もっともシンプルなタイプ。
「〇〇の検索結果」のような
表示をしているサイトは多い
ダブルクォーテーションの中で油断するタイプ
[次のページ]ボタンのhref属性とかでも
入力されたURLが出現することはおおい
(余談)反射型XSS
•XSSフィルタ
• さっきのページで赤くなっていたところ
•ブラウザが反射型XSSっぽいものを防いでくれる
•バイパスして攻撃する方法は山のようにあるのでた
よってはいけない
• いたずらぐらいは防げるかな?
•参考 http://masatokinugawa.l0.cm/
DOM Based XSS
•主にjavascript側に原因があるXSS攻撃
•http://codepen.io/anon/pen/dvKzGa
•さっきの奴は正しくはDOM Based XSSに分類
されるものでした
•jQueryやinnerHTMLを操作する際に適切な処
理を行わないことによってスクリプトを埋め
込んでしまう。
XSSによる被害
•サイトを改ざんされる
•偽コンテンツの表示
•偽フォームを使い、パスワードやクレ
ジットカード情報の盗難
•ウイルスをダウンロードさせるようなサ
イトへ誘導
•ワームの拡散
XSSによる被害
•ログインしていないとできないような操
作をされる
•Cookie・セッションを盗まれる
•情報の漏えい
•勝手に本人として投稿
•データの削除
回避策
①徹底的にエスケープ
• サーバー側では必ず専用関数が用意されているのでこれを使う
• PHP : htmlspecialchars
• Rails : escape
• Rails3以降は<%= ~ %>では勝手にエスケープされる
<script>alert("xss")</sc
ript>
&lt;script&gt;alert(&quot;xss&quot;)&lt;/script
&gt; =&gt;
& “ ‘ < > の5文字を文字実体参照に変換
②ユーザーからの入力に警戒
•あらゆるリクエストの内容
•リクエストの本文、パラメータCookie、User-Agent
•あらゆるユーザーが入力可能な箇所
•ユーザー名、メールアドレス、URL…
③そもそも危険なことをしない
• ×element.innerHTML = "~"
• 〇element.textContent = "~"
• ×$("body").html("~")
• 〇$("body").text("~")
• React.jsやAngularはエスケー
プしてくれる・・・はず
*** Rails ***
•Rawメソッド
• <%= raw “~" %>
•==ヘルパー
• <%== “~" %>
•html_safe
• <%= “~“.html_safe %>
④適切にバリデーションする
•一部の安全なタグのみ入力可能にしたい・・・
•安全なURLかどうかを正規表現で判定したい・・・
マウスオーバーで発動
<a onmouseover="~
画像のonerror属性
<img onerror="~
パーセントエンコード
%EF%BC%9Cscript%EF%BC%9Ealert(123)%E
F%BC%9C/script%EF%BC%9Eiframe+base64
<iframe
src='data:text/html;base64,PHNjcmlwdD5hb
GVydCgnWFNTJyk8L3NjcmlwdD4='></iframe
>
svgに埋め込み
<svg><script >~ 文字コードの誤判定を利用
dataURL
data:text/html,<script>alert(0)</script>
コメントに正規のURL
javascript:alert('XSS');//http://bitarts.jp/
ポート番号
http://example.com:8080/
#や?の後ろに正規のURL
http://unsafe_.com#http://example.com
@を利用
http://example.com@unsafe__.com/
Unicodeの特殊文字
•GemやPEARを利用する
•ReactやAngularなどに任せる
•バリデーションに失敗しても
大丈夫な対策をする
•無理しすぎない・・・
⑤自分でプログラムを書かない
セキュリティを
意識して楽しく
Web開発!

Webセキュリティ入門(xss)