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. よくあるWebアプリケーション構成(検索機能) 4 ブラウザ Webサーバ (サーバ) データベース GET /?title=CTF HTTP/1.1 カラム名

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

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

    Writeup”, “...”}, ...} カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド
  4. よくある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テーブル ↑クライアントサイド ↓サーバサイド
  5. XSSの3タイプ クライアント側のコードが問題で発生するXSS DOM-based XSS クライアント側で実行されるJavaScriptに問題があり、クライアント側で 発生するXSS サーバ側のコードが問題で発生する2つのXSS Reflected XSS リクエストに含まれるスクリプトと解釈可能な文字列が一時的に

    レスポンスに含まれることで、クライアント側で発生するXSS Stored XSS DBなどに保存されているスクリプトと解釈可能な文字列が永続的に レスポンスに含まれることで、クライアント側で発生するXSS 12
  6. 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>
  7. 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>
  8. 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>
  9. 記事の検索機能に絞って考える 20 ブラウザ Webサーバ データベース GET /?title=<script>print()</script> カラム名 型 id

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

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

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

    Result for “<script>print()</script>”: </h1> カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド
  13. XSS(Stored) 28 Webフロント (ブラウザ) Webサーバ データベース GET /?title= カラム名 型

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

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

    カラム名 型 id int title string body string postsテーブル ↑クライアントサイド ↓サーバサイド
  16. 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> ↑クライアントサイド ↓サーバサイド
  17. まとめ XSS(Cross-site Scripting)はWeb サイトの範囲を超えて、 外部から任意のコードを実行できるインジェクション攻撃 クライアント側のコードが問題で発生するXSS DOM-based XSS クライアント側で実行されるJavaScriptに問題があり、クライアント側で 発火するXSS

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