本当にあったフロントエンドセキュリティ怖い話
自己紹介
@kyo_ago
本当にあったフロントエンドセキュリティ怖い話
第一話
「さまよえるlocation.href」
「そのlocation.hrefとは一体どこのことなんだい?」
「location.hrefが信用出来ない問題」
http://hoge.com%2F@example.com/へアクセスした場合にlocation.hrefがhttp://hoge.com/@example.com/を返す
(勝手にデコードされている)
location.href = location.hrefで別のページに飛ぶ
iOS 6.0未満、Android4.1未満の標準ブラウザで再現
Masato Kinugawa Security Blog: location.hrefの盲点
「location.hrefが信用出来ない問題」
location.hrefに@使ってなにか入れるのは普通にできる
(http://hoge:huga@example.com/のlocation.hrefはhttp://hoge:huga@example.com/)
location.hrefを独自解析するのはおすすめできない
(location objectのpropertyを使う)
第二話
「もう一つの\r\n」
「/./が\r\n以外に一致する?」
「正規表現内の"."に\r\n以外にも一致しない文字がある問題」
U+2028/U+2029はlocation.hashに含めることができる
正規表現での文字列解析、ユーザ入力値の出力に注意
ECMAScriptの標準仕様なので正常動作
Masato Kinugawa Security Blog: U+2028/2029とDOM based XSS
ここで怪談風に書くの挫折
$.get('/'+location.hash.substring(1))
$.get('/'+location.hash.substring(1))
ブラウザはschemeが省略された場合「現在のschemeと同じ」と解釈する
(httpでも、httpsでもサポートしたい場合に使われる事が多い)
「#/example.com」で普通に外部ドメインにつながる
<script src="//example.com/lib.js"></script>
「では.も消しましょう!」
つ「Long IP address」
「Long IP address」
「//3232235521」で「//192.168.0.1/」につながる
外部から直接ajaxのURLを受け取らない
(ホワイトリストで制御する)
どうしても受け取るならできるだけ制限をきつくする
CORS ajax
CORS ajax
$.getの問題と同じ
最近のブラウザは普通に外部ドメイン接続できる
接続できるかどうかは相手のサーバ設定による
こちらのサーバ設定では制御するのは難しい
(一応CSP使えばできるが、ちゃんと管理するの結構大変)
jQuery MobileのXSSについての解説 - 金利0無利息キャッシング – キャッシングできます - subtech
$(location.hash)
$(location.hash)
危険
#<img onerror="alert(1)" src>で再現
「$(location.hash)なんてやんねーよwwwwwwwwww」
$("a[name=" + anchor + "]") (実話)
RDoc で生成した HTML ドキュメントにおける XSS 脆弱性 (CVE-2013-0256)
jQueryにおけるXSSを引き起こしやすい問題について - 金利0無利息キャッシング – キャッシングできます - subtech
ApplicationCache poisoning
ApplicationCache poisoning
危険といえば危険だけど、そもそも論的にあんまり気にしない方がいい
Attack and Defense Labs: Chrome and Safari users open to stealth HTML5 AppCache attack
ご清聴ありがとうございました