libinjection : sqli から xss へ by ニック・ガルブレス

37
libinjection SQLiからXSSまで Nick Galbreath @ngalbreath Signal Sciences Corp [email protected] Code Blue 東京 2014-02-18 リブインジェクション

Upload: code-blue

Post on 12-Nov-2014

802 views

Category:

Technology


5 download

DESCRIPTION

SQLi攻撃の迅速で正確な検知をする libinjection は Black Hat USA 2012 で紹介された。 2年たった現在、そのアルゴリズムは多くのオープンソースや専用WAFsやハニーポットで利用されている。 本講演では、XSSを検知する新しいアルゴリズムを紹介する。 SQLi 同様、libinjection アルゴリズムは正規表現を使わず、とても速く、誤検出率が少ない。 そして、オリジナルの libinjection アルゴリズムのように、GitHubで無償の使用許諾で入手できる。 ニック・ガルブレス - Nick Galbreath ニック・ガルブレス氏は、オンライン広告取引システム開発の世界的リーディング企業である IPONWEB の技術担当副社長である。 IPONWEB 以前は、セキュリティ・詐欺・認証・その他大企業的機能を扱う監視グループ Etsyの技術部長。 Etsy 以前は彼はソーシャルとeコマース企業に所属し、それらには Right Media、UPromise、Friendster、Open Marketなどがある。 彼の著書に「Cryptography for Internet and Database Applications (Wiley)」がある。 彼は、Black Hat、Def Con、DevOpsDays、OWASP関連イベントでの講演経験を持つ。 ボストン大学の数学修士を保有、現在は東京在住である。 講演歴) 2013年 - LASCON http://lascon.org/about/, 基調講演者, 米国・テキサス州オースティン - DevOpsDays 日本・東京 - Security Development Conference (Microsoft), 米国・カリフォルニア州サンフランシスコ - DevOpsDays 米国・テキサス州オースティン - Positive Hack Days http://phdays.com, ロシア・モスクワ - RSA USA, San Francisco, CA, 講師とパネリスト 2012年 - DefCon 米国・ネバダ州ラスベガス - BlackHat USA 米国・ ネバダ州ラスベガス - その他

TRANSCRIPT

Page 1: libinjection : SQLi から XSS へ by ニック・ガルブレス

libinjection SQLiからXSSまで

Nick Galbreath @ngalbreath!Signal Sciences [email protected]

Code Blue ∙ 東京 ∙ 2014-02-18

リブインジェクション

Page 2: libinjection : SQLi から XSS へ by ニック・ガルブレス

This is also in English!

日本語はこちら↓

https://speakerdeck.com/ngalbreath/ codeblue2014-en-libinjection-from-sqli-to-xss

https://speakerdeck.com/ngalbreath/ codeblue2014-jp-libinjection-from-sqli-to-xss

Page 3: libinjection : SQLi から XSS へ by ニック・ガルブレス

ニック・ガルブレスNick Galbreath @ngalbreath

• ファウンダー/CTO of Signal Sciences Corp

• 前職: IponWeb (モスコワ, 東京)

• その前: Etsy.com (ニューヨーク市)

Page 4: libinjection : SQLi から XSS へ by ニック・ガルブレス

「libinjection」とは?• SQLi攻撃を検出するための小さなライブラリー

• C言語

• Python、lua、phpのAPI

• Black Hat USA 2012で初登場

• オープンソースとBSDライセンス

• https://github.com/client9/libinjection

Page 5: libinjection : SQLi から XSS へ by ニック・ガルブレス

なんでlibinjectionなの?• 既存の検出のほとんどが正規表現で行われる

• ユニットテストがない

• パフォーマンス(速度)テストがない

• ソースコードのカバー領域テストがない

• 正確性のテストがない

• 誤検出のテストがない

Page 6: libinjection : SQLi から XSS へ by ニック・ガルブレス

libinjection SQLiの現在

• Version 3.9.1

• 8000 SQLi 特徴

• 400+ ユニットテスト

• 85,000+ SQLi サンプル

Page 7: libinjection : SQLi から XSS へ by ニック・ガルブレス

現在の使われ方• mod_security WAF http://www.modsecurity.org/• ironbee WAF https://www.ironbee.com/• glastopf honeypot http://glastopf.org/• プライベートなWAFs

• さまざまな企業内で

• サードパーティのJava実装https://github.com/Kanatoko/libinjection-Java

• サードパーティの.NET実装 https://github.com/kochetkov/Libinjection.NetLibinjection.Net

Page 8: libinjection : SQLi から XSS へ by ニック・ガルブレス

XSS

Page 9: libinjection : SQLi から XSS へ by ニック・ガルブレス

SQLiとの類似性

• 標準的なライブラリーがない

• あるとしても限られたテストしか存在しない

• 正規表現に基づいた検出

• もっと良くできないか?

Page 10: libinjection : SQLi から XSS へ by ニック・ガルブレス

2種類のXSS

• HTML インジェクション攻撃

• Javascript インジェクション攻撃

Page 11: libinjection : SQLi から XSS へ by ニック・ガルブレス

XSS Javascript インジェクション

• DOMスタイルの攻撃

• 既存のjavascriptコードへの攻撃

• 本当の検出はクライアントでしかできない

• かなりの難題

Page 12: libinjection : SQLi から XSS へ by ニック・ガルブレス

HTML インジェクション• HTML インジェクションとは、HTMLのトークン化アルゴリズムに対する攻撃 (text “<b>foo</b>” to tags <b>, foo, </b>)

• HTMLのコンテキストをjavascriptに変更し、新しいjavascriptを追加することが目的

• これらの攻撃は検出できるべき

Page 13: libinjection : SQLi から XSS へ by ニック・ガルブレス

HTML インジェクションサンプル

<b>XSS</b> (HTML)

<foo XSS> (tag attribute name)

<foo name=XSS> (tag attribute value)

<foo name='XSS'> (引用符の中)

<foo name="XSS"> (引用符の中)

<foo name=`XSS`> (IEのみ!)

Page 14: libinjection : SQLi から XSS へ by ニック・ガルブレス

HTML トークン化ウェブブラウザ• これまで、すべてのブラウザーはHTMLを異なる方法でトークン化していた

• 壊れたHTMLタグ、想定外の文字やエンコードを使ったあらゆる攻撃が発生してしまっていた

• 現在では、ほぼすべてのブラウザーがHTML5で規定されたアルゴリズムを使用している

• HTML5のアルゴリズムはとても正確

Page 15: libinjection : SQLi から XSS へ by ニック・ガルブレス

すべてのステップhttp://www.w3.org/html/wg/drafts/html/CR/syntax.html#tokenization

Page 16: libinjection : SQLi から XSS へ by ニック・ガルブレス

ステップがかなり明確

Page 17: libinjection : SQLi から XSS へ by ニック・ガルブレス

デスクトップブラウザの60%以上は、HTML5である

http://tnw.co/1cqFueo

IE 9 9%IE 10 11%IE 11 10%Firefox 14%Chrome 13%Safari 5%------------HTML5 62%

Page 18: libinjection : SQLi から XSS へ by ニック・ガルブレス

モバイルブラウザの90%がHTML5である

http://bit.ly/JQSZxb

Page 19: libinjection : SQLi から XSS へ by ニック・ガルブレス

残りが、IE6、IE7、IE8• IE6 が消えるのは時間の問題

• IE7 の市場シェアはたった2%

• IE8 の市場シェアは20%

• ほとんどがWindows XP

• これらの市場シェアがこれ以上増えることはない

Page 20: libinjection : SQLi から XSS へ by ニック・ガルブレス

libinjection XSS

Page 21: libinjection : SQLi から XSS へ by ニック・ガルブレス

HTML5ウェブブラウザ におけるHTML インジェク

ション攻撃 • No: XML / XSLT インジェクション

• No: IE6、IE7、Opera

• FF、Chromeの古いバージョン

• No: DOMスタイルの攻撃

Page 22: libinjection : SQLi から XSS へ by ニック・ガルブレス

libinjection HTML5

• 完全なHTML5トークン化

• ツリーやDOMを構築しない

• いかなるデータもコピーしない

Page 23: libinjection : SQLi から XSS へ by ニック・ガルブレス

トークン化のサンプル

TAG_NAME_OPEN img ATTR_NAME src ATTR_VALUE junk ATTR_NAME onerror ATTR_VALUE alert(1); TAG_NAME_CLOSE >

<img src=“junk” onerror=alert(1);>

Page 24: libinjection : SQLi から XSS へ by ニック・ガルブレス

異なるHTMLコンテキストでチェック

各インプットは、6つの異なるHTMLコンテキストでチェックされる。

<b>XSS</b> (raw HTML)

<foo XSS> (tag attribute name)

<foo name=XSS> (tag attribute value)

<foo name='XSS'> (引用符の中)

<foo name="XSS"> (引用符の中)

<foo name=`XSS`> (IEのみ!)

Page 25: libinjection : SQLi から XSS へ by ニック・ガルブレス

問題のあるトークンを除外• 問題のあるタグ、アトリビュート、バリューが除外される。

• タグ:<script>、XMLまたはSVGに関連するすべて

• アトリビュートの名前: on*など

• アトリビュートのバリュー:javascriptのURL

• などなど

Page 26: libinjection : SQLi から XSS へ by ニック・ガルブレス

トレーニングデータ

Page 27: libinjection : SQLi から XSS へ by ニック・ガルブレス

XSS Cheat Sheets

• ほとんどが時効(Firefox 3! )

• 古い攻撃が除去される

Page 28: libinjection : SQLi から XSS へ by ニック・ガルブレス

HTML5SEC.org

• 素晴らしい情報資源

• 一部古い攻撃など最新ではないものも

Page 29: libinjection : SQLi から XSS へ by ニック・ガルブレス

@soaj1664ashar• 新しい攻撃を定期的に開発してる

• XSSが好きなら、彼をフォローしよう

• http://bit.ly/1bwXTgn

• http://pastebin.com/u6FY1xDA

• http://bit.ly/1iXODkW

Page 30: libinjection : SQLi から XSS へ by ニック・ガルブレス

攻撃 /スキャナー

• XSSスキャナーのアウトプットを活用

• Shazzer fuzzのデータベースhttp://shazzer.co.uk/ (ModSecurityチームのおかげ)

Page 31: libinjection : SQLi から XSS へ by ニック・ガルブレス

現在の状況

Page 32: libinjection : SQLi から XSS へ by ニック・ガルブレス

既に活用できます

• githubhttps://github.com/client9/libinjection

• ウェブサイトhttps://libinjection.client9.com/

• まだアルファ段階

Page 33: libinjection : SQLi から XSS へ by ニック・ガルブレス

$ make test-xss ./reader -t -i -x -m 10 ../data/xss* ../data/xss-html5secorg.txt 149 False test 62_1 <x '="foo"><x foo='><img src=x onerror=alert(1)//'> ../data/xss-html5secorg.txt 151 False test 62_2 <! '="foo"><x foo='><img src=x onerror=alert(2)//'> ../data/xss-html5secorg.txt 153 False test 62_3 <? '="foo"><x foo='><img src=x onerror=alert(3)//'> ../data/xss-html5secorg.txt 352 False test 102 <img src="x` `<script>alert(1)</script>"` `> ../data/xss-soaj1664ashar-pastebin-u6FY1xDA.txt 96 False 92) <--`<img/src=` onerror=alert(1)> --!> ../data/xss-soaj1664ashar.txt 21 False <form/action=ja&Tab;vascr&Tab;ipt&colon;confirm(document.cookie)> <button/type=submit> ../data/xss-xenotix.txt 17 False "'`><?img src=xxx:x onerror=javascript:alert(1)> ../data/xss-xenotix.txt 19 False '`"><?script>javascript:alert(1)</script> ../data/xss-xenotix.txt 610 False ̀ "'><img src=xxx:x ?onerror=javascript:alert(1)> ../data/xss-xenotix.txt 613 False ̀ "'><img src=xxx:x ?onerror=javascript:alert(1)> ../data/xss-xenotix.txt 615 False ̀ "'><img src=xxx:x ?onerror=javascript:alert(1)> !XSS : 1628 SAFE : 11 TOTAL : 1639 !Threshold is 10, got 11, failing.

1639件の総サンプル数 1628件が正しいXSS検出数 11件の検出漏れ

Page 34: libinjection : SQLi から XSS へ by ニック・ガルブレス

IE:引用符に関する問題

• IE 8は、英語でいうところの‘unbalanced quotes’ (引用符が正しく閉じていないなど)に対する動作がおかしい

• この問題に関しては現在対応が進行中

<img src="x` `<script>alert(1)</script>"` `>

Page 35: libinjection : SQLi から XSS へ by ニック・ガルブレス

パフォーマンス

500,000件以上を 1秒でチェック

Page 36: libinjection : SQLi から XSS へ by ニック・ガルブレス

2014-02-18のTO DO• まだアルファ段階 — 現時点では素晴らしいミスが隠されている可能性はある

• 検出漏れに関するQAは未完成

• 一部のIEインジェクションには未対応

• 実験のためのテストベッドがない(今週後半にでも)

• QAの充実、コードのカバレッジの強化が必要

• スクリプト言語の対応はまだ(近いうち)

Page 37: libinjection : SQLi から XSS へ by ニック・ガルブレス

[email protected]

ありがとうございました。