Upgrade to Pro — share decks privately, control downloads, hide ads and more …

入門XSS / Introduction of XSS

task4233
September 11, 2022

入門XSS / Introduction of XSS

SECCON Beginners Live 2022での登壇資料です。
https://connpass.com/event/258217/

XSS(Cross-site Scripting)の概要とXSSの3つのタイプ(Reflected/Stored/DOM-based)について、具体例を提示しつつ解説します。

説明に利用したリポジトリ: https://github.com/task4233/xss-demo

## Links
XSS on Google Search - Sanitizing HTML in The Client?: https://youtu.be/lG7U3fuNw3A
window.alert(): https://developer.mozilla.org/en-US/docs/Web/API/Window/alert
window.print(): https://developer.mozilla.org/en-US/docs/Web/API/Window/print
alert() is dead, long live print(): https://portswigger.net/research/alert-is-dead-long-live-print
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

task4233

September 11, 2022
Tweet

More Decks by task4233

Other Decks in Technology

Transcript

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

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

    本発表で扱わないこと
  3. 自己紹介 ・task4233 ・芝浦工業大学 M2 ・マルウェア検知システムの研究 ・脆弱性スキャナの開発 ・SECCON Beginners CTF 2022で

     Web問を2/5作問 3
  4. よくあるWebアプリケーション構成(検索機能) 4 ブラウザ Webサーバ (サーバ) データベース GET /?title=CTF HTTP/1.1 カラム名

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

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

    Writeup”, “...”}, ...} カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド
  7. よくあるWebアプリケーション構成(検索機能) 7 ブラウザ (クライアント) Webサーバ (サーバ) データベース HTTP/1.1 200 Content-Type:

    text/html <h1> Result for CTF: </h1> <table> <tr> <td>2</td> <td>CTF4b 2022 Writeup</td> <td>...</td> </tr> </table> カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド
  8. XSS(Cross-site Scripting)とは ・Web サイトの範囲を超えて、外部から任意のコードを実行  できるコードインジェクション攻撃 ・インジェクトされた文字列がクライアント側でスクリプト  として認識されることで発生する 8 1. 攻撃者がXSSの脆弱性を利用して、

     Cookieを窃取するスクリプトを設置 2. 一般ユーザがそのページにアクセス 3. 設置されたスクリプトによって  Cookieが窃取される XSSによる被害の一例
  9. あのGoogle検索も...! Googleのkinugawaさんのやつとか 9 ref: XSS on Google Search - Sanitizing

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

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

     を呼び出せなくなった →代用としてwindow.print()が利用されることもある ref: alert() is dead, long live print() 11
  12. XSSの3タイプ クライアント側のコードが問題で発生するXSS DOM-based XSS クライアント側で実行されるJavaScriptに問題があり、クライアント側で 発生するXSS サーバ側のコードが問題で発生する2つのXSS Reflected XSS リクエストに含まれるスクリプトと解釈可能な文字列が一時的に

    レスポンスに含まれることで、クライアント側で発生するXSS Stored XSS DBなどに保存されているスクリプトと解釈可能な文字列が永続的に レスポンスに含まれることで、クライアント側で発生するXSS 12
  13. DOM-based XSS ・クライアント側のコードが問題で発生するXSS ・クライアント側のDOM操作によって発生 ・URLフラグメント(#)を利用したDOM-based XSSは  サーバ側にペイロードが送信されないので検知できない 13 ①発火

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

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

  16. XSS(DOM-based) 16 Webフロント (ブラウザ) Webサーバ データベース カラム名 型 id int

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

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

    title string body string postsテーブル <html> <div id=”result”>...<script>print()</script>...</div> <script> // ... 何らかの処理 const resultElem = document.getElementById(“result”); resultElem.innerHTML = “...<script>print()</script>...” </script> </html>
  19. Reflected XSS ・サーバ側のコードが問題で一時的に発生するXSS ・リクエストに含まれるスクリプトがレスポンスにそのまま  含まれるために、クライアント側で発生するXSS ・リクエストの一部がそのまま返って来ることから、  反射型(Reflected) XSSと呼ばれる 19 ①

    ② ③発火
  20. 記事の検索機能に絞って考える 20 ブラウザ Webサーバ データベース GET /?title=<script>print()</script> カラム名 型 id

    int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド
  21. 記事の検索機能に絞って考える 21 ブラウザ Webサーバ データベース SELECT * FROM posts  WHERE

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

    title string body string postsテーブル ↑クライアントサイド ↓サーバサイド
  23. 記事の検索機能に絞って考える 23 ブラウザ Webサーバ データベース HTTP/1.1 200 Content-Type: text/html <h1>

    Result for “<script>print()</script>”: </h1> カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド
  24. Reflected XSS ・サーバ側のコードが問題で一時的に発生するXSS ・リクエストに含まれるスクリプトがレスポンスにそのまま  含まれるために、クライアント側で発生するXSS ・リクエストの一部がそのまま返って来ることから、  反射型(Reflected) XSSと呼ばれる 24 ①

    ② ③発火 自分で自分の環境に影響を及ぼすリクエストを わざわざ送らないのでは?🤔
  25. 余談: 意図せず送信されるリクエスト メール・SNSに貼られているリンクを利用 ・表示されている文字列とリンクが異なるケース ・長いリンクの末尾が...などで省略されているケース ・短縮URLによって変換されているケース

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

    ② ③ ④
  27. XSS(Stored) 27 Webフロント (ブラウザ) Webサーバ データベース (DB) XSSを引き起こすデータがDBに格納されている場合 例) id:

    1   title: <script>print()</script> ↑クライアントサイド ↓サーバサイド
  28. XSS(Stored) 28 Webフロント (ブラウザ) Webサーバ データベース GET /?title= カラム名 型

    id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド
  29. XSS(Stored) 29 Webフロント (ブラウザ) Webサーバ データベース SELECT * FROM posts

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

    カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド
  31. XSS(Stored) 31 Webフロント (ブラウザ) Webサーバ データベース HTTP/2 200 Content-Type: text/html

    <h1> Result for “”: </h1> <table> <tr> <td>1</td> <td>hoge</td> <td><script>print()</script></td> </tr> </table> ↑クライアントサイド ↓サーバサイド
  32. どう防御すれば良いのか?🤔

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

  34. まとめ XSS(Cross-site Scripting)はWeb サイトの範囲を超えて、 外部から任意のコードを実行できるインジェクション攻撃 クライアント側のコードが問題で発生するXSS DOM-based XSS クライアント側で実行されるJavaScriptに問題があり、クライアント側で 発火するXSS

    サーバ側のコードが問題で発生する2つのXSS Reflected XSS リクエストに含まれるスクリプトと解釈可能な文字列が一時的に レスポンスに含まれることで、クライアント側で発火するXSS Stored XSS DBなどに保存されているスクリプトと解釈可能な文字列が永続的に レスポンスに含まれることで、クライアント側で発火するXSS 34
  35. 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!