Slide 1

Slide 1 text

入門XSS SECCON Beginners Live 2022 2022/09/11 @task4233

Slide 2

Slide 2 text

本発表の3つのゴール 1. よくあるWebアプリケーション構成の理解 2. 3タイプのXSSの動作原理の理解 3. XSSの動作原理に基づく防御手法の理解 ・技巧的なXSSペイロードの解説 ・XSSを他の脆弱性と組み合わせる場合のお話 2 本発表で扱わないこと

Slide 3

Slide 3 text

自己紹介 ・task4233 ・芝浦工業大学 M2 ・マルウェア検知システムの研究 ・脆弱性スキャナの開発 ・SECCON Beginners CTF 2022で  Web問を2/5作問 3

Slide 4

Slide 4 text

よくあるWebアプリケーション構成(検索機能) 4 ブラウザ Webサーバ (サーバ) データベース GET /?title=CTF HTTP/1.1 カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド

Slide 5

Slide 5 text

よくあるWebアプリケーション構成(検索機能) 5 ブラウザ (クライアント) Webサーバ (サーバ) データベース SELECT * FROM posts  WHERE title LIKE ‘%CTF%’ カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド

Slide 6

Slide 6 text

よくあるWebアプリケーション構成(検索機能) 6 ブラウザ (クライアント) Webサーバ (サーバ) データベース []{{2, “CTF4b 2022 Writeup”, “...”}, ...} カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド

Slide 7

Slide 7 text

よくあるWebアプリケーション構成(検索機能) 7 ブラウザ (クライアント) Webサーバ (サーバ) データベース HTTP/1.1 200 Content-Type: text/html

Result for CTF:

2 CTF4b 2022 Writeup ... カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド

Slide 8

Slide 8 text

XSS(Cross-site Scripting)とは ・Web サイトの範囲を超えて、外部から任意のコードを実行  できるコードインジェクション攻撃 ・インジェクトされた文字列がクライアント側でスクリプト  として認識されることで発生する 8 1. 攻撃者がXSSの脆弱性を利用して、  Cookieを窃取するスクリプトを設置 2. 一般ユーザがそのページにアクセス 3. 設置されたスクリプトによって  Cookieが窃取される XSSによる被害の一例

Slide 9

Slide 9 text

あのGoogle検索も...! Googleのkinugawaさんのやつとか 9 ref: XSS on Google Search - Sanitizing HTML in The Client?

Slide 10

Slide 10 text

Webアプリケーションに XSSの脆弱性があることを どのように示せば良いのか?🤔

Slide 11

Slide 11 text

XSSの概念検証(PoC: Proof of Concept) ・ブラウザで任意のJavaScriptを実行させるペイロードを挿入し、  実行されることを視認性が高く、非破壊的な方法で確認したい → window.alert()がよく利用されている ・Chromeのバージョン92以上ではCross-origin iframeでalert()  を呼び出せなくなった →代用としてwindow.print()が利用されることもある ref: alert() is dead, long live print() 11

Slide 12

Slide 12 text

XSSの3タイプ クライアント側のコードが問題で発生するXSS DOM-based XSS クライアント側で実行されるJavaScriptに問題があり、クライアント側で 発生するXSS サーバ側のコードが問題で発生する2つのXSS Reflected XSS リクエストに含まれるスクリプトと解釈可能な文字列が一時的に レスポンスに含まれることで、クライアント側で発生するXSS Stored XSS DBなどに保存されているスクリプトと解釈可能な文字列が永続的に レスポンスに含まれることで、クライアント側で発生するXSS 12

Slide 13

Slide 13 text

DOM-based XSS ・クライアント側のコードが問題で発生するXSS ・クライアント側のDOM操作によって発生 ・URLフラグメント(#)を利用したDOM-based XSSは  サーバ側にペイロードが送信されないので検知できない 13 ①発火

Slide 14

Slide 14 text

DOM(Document Object Model) ・HTMLやXML文書を取り扱うためのAPI ・WebページはDOMツリーという階層構造で構成される ・これをページ遷移ごとに構築すると時間がかかるので、  一部だけ変更するライブラリや実装が最近増えている e.g.) Reactの仮想DOM(Virtual DOM)

Slide 15

Slide 15 text

DOM-based XSS ・クライアント側のコードが問題で発生するXSS ・クライアント側のDOM操作によって発生 ・URLフラグメント(#)を利用したDOM-based XSSは  サーバ側にペイロードが送信されないので検知できない 15 ①発火

Slide 16

Slide 16 text

XSS(DOM-based) 16 Webフロント (ブラウザ) Webサーバ データベース カラム名 型 id int title string body string postsテーブル
// ... 何らかの処理 const resultElem = document.getElementById(“result”); resultElem.innerHTML = gotText;

Slide 17

Slide 17 text

XSS(DOM-based) 17 Webフロント (ブラウザ) Webサーバ データベース カラム名 型 id int title string body string postsテーブル
// ... 何らかの処理 const resultElem = document.getElementById(“result”); resultElem.innerHTML = “...<script>print()...”

Slide 18

Slide 18 text

XSS(DOM-based) 18 Webフロント (ブラウザ) Webサーバ データベース カラム名 型 id int title string body string postsテーブル
...print()...
// ... 何らかの処理 const resultElem = document.getElementById(“result”); resultElem.innerHTML = “...<script>print()...”

Slide 19

Slide 19 text

Reflected XSS ・サーバ側のコードが問題で一時的に発生するXSS ・リクエストに含まれるスクリプトがレスポンスにそのまま  含まれるために、クライアント側で発生するXSS ・リクエストの一部がそのまま返って来ることから、  反射型(Reflected) XSSと呼ばれる 19 ① ② ③発火

Slide 20

Slide 20 text

記事の検索機能に絞って考える 20 ブラウザ Webサーバ データベース GET /?title=print() カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド

Slide 21

Slide 21 text

記事の検索機能に絞って考える 21 ブラウザ Webサーバ データベース SELECT * FROM posts  WHERE title   LIKE ‘%print()%’ カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド

Slide 22

Slide 22 text

記事の検索機能に絞って考える 22 ブラウザ Webサーバ データベース []{} カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド

Slide 23

Slide 23 text

記事の検索機能に絞って考える 23 ブラウザ Webサーバ データベース HTTP/1.1 200 Content-Type: text/html

Result for “print()”:

カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド

Slide 24

Slide 24 text

Reflected XSS ・サーバ側のコードが問題で一時的に発生するXSS ・リクエストに含まれるスクリプトがレスポンスにそのまま  含まれるために、クライアント側で発生するXSS ・リクエストの一部がそのまま返って来ることから、  反射型(Reflected) XSSと呼ばれる 24 ① ② ③発火 自分で自分の環境に影響を及ぼすリクエストを わざわざ送らないのでは?🤔

Slide 25

Slide 25 text

余談: 意図せず送信されるリクエスト メール・SNSに貼られているリンクを利用 ・表示されている文字列とリンクが異なるケース ・長いリンクの末尾が...などで省略されているケース ・短縮URLによって変換されているケース

Slide 26

Slide 26 text

Stored XSS ・サーバ側のコードが問題で永続的に発生するXSS ・DBなどで永続化されたデータがレスポンスにそのまま  含まれるために、クライアント側で発生するXSS ・Storeされたデータが利用されるのでStored XSSと呼ばれる 26 ① ⑤発火 ② ③ ④

Slide 27

Slide 27 text

XSS(Stored) 27 Webフロント (ブラウザ) Webサーバ データベース (DB) XSSを引き起こすデータがDBに格納されている場合 例) id: 1   title: print() ↑クライアントサイド ↓サーバサイド

Slide 28

Slide 28 text

XSS(Stored) 28 Webフロント (ブラウザ) Webサーバ データベース GET /?title= カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド

Slide 29

Slide 29 text

XSS(Stored) 29 Webフロント (ブラウザ) Webサーバ データベース SELECT * FROM posts  WHERE title LIKE ‘%%’ カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド

Slide 30

Slide 30 text

XSS(Stored) 30 Webフロント (ブラウザ) Webサーバ データベース []{3, “print()”, “...”}, ...} カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド

Slide 31

Slide 31 text

XSS(Stored) 31 Webフロント (ブラウザ) Webサーバ データベース HTTP/2 200 Content-Type: text/html

Result for “”:

1 hoge print() ↑クライアントサイド ↓サーバサイド

Slide 32

Slide 32 text

どう防御すれば良いのか?🤔

Slide 33

Slide 33 text

XSSの対策 ・大原則はユーザが操作可能な文字列を一切信用しないこと ・サーバ側でレスポンスのエスケープ処理を入れる →JavaScriptとして解釈されない文字列にする ・サーバ側で適切なレスポンスヘッダを付与する →レスポンスにHTML/JavaScriptが含まれない想定の場合、  Content-TypeヘッダやX-Content-Type-Optionsヘッダで  レスポンスの形式を指定して想定外の挙動をなくす ・サーバ側でリクエストのバリデーションをする 33

Slide 34

Slide 34 text

まとめ XSS(Cross-site Scripting)はWeb サイトの範囲を超えて、 外部から任意のコードを実行できるインジェクション攻撃 クライアント側のコードが問題で発生するXSS DOM-based XSS クライアント側で実行されるJavaScriptに問題があり、クライアント側で 発火するXSS サーバ側のコードが問題で発生する2つのXSS Reflected XSS リクエストに含まれるスクリプトと解釈可能な文字列が一時的に レスポンスに含まれることで、クライアント側で発火するXSS Stored XSS DBなどに保存されているスクリプトと解釈可能な文字列が永続的に レスポンスに含まれることで、クライアント側で発火するXSS 34

Slide 35

Slide 35 text

XSSの演習に使えるサイトたち PortSwigger Lab https://portswigger.net/web-security/all-labs XSS game https://xss-game.appspot.com/ alert(1) to win http://alf.nu/alert1 prompt(1) to win https://prompt.ml/0 35 Let’s try!