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

Security基礎研修

techtekt
August 23, 2023

 Security基礎研修

パーソルキャリア株式会社 テクノロジー本部 エンジニアリング統括部 サービス開発部
※本資料は2023年3月時点の情報であり、当該部門における2023年新卒の研修教材です。

techtekt

August 23, 2023
Tweet

More Decks by techtekt

Other Decks in Programming

Transcript

  1. Security Training for new graduates in 2023 パーソルキャリア株式会社 テクノロジー本部 エンジニアリング統括部

    サービス開発部 ※本資料は2023年3月時点の情報であり、2023年新卒の研修教材です。
  2. 準備 ワークでHTTP通信をインターセプトするツールが必要になります。 本研修では、Burp Suite(Community Edition)を利用します。 下記リンクからインストールしてください。 PortSwigger. Professional / Community

    2023.2.3. https://portswigger.net/burp/releases/professional-community-2023-2-3?requestededition=community ご自身のMacOSを確認してインストー ルしてください。 左上の🍎アイコンから「このMacにつ いて」をクリックして、プロセッサを 確認。
  3. 目次 • Mindset • Web basics ◦ Same-origin policy ◦

    Cross-origin resource sharing(CORS) ◦ Cookie & Session • Web vulnerabilities ◦ Cross-site request forgeries(CSRF) ◦ Cross-site scripting(XSS) ◦ SQL injection ◦ OS command injection ◦ Directory traversal • Conclusion 6
  4. オリジン 16 オリジンとは URL のスキーム (プロトコル)、 ホスト (ドメイン)、 ポート で定義されま

    す。 つまり、スキーム、ホスト、ポートがすべて一致すると同一オリジンと言えます。
  5. URIの仕様 17 http://example.com:80/blog?date=20220407&q=hoge#huga • URIスキーム: http • ホスト名: example.com •

    ポート番号: 80 • パス: /blog • クエリパラメータ: date=20220407&q=hoge • URIフラグメント: #huga
  6. 同一オリジンではない例 19 // ポートが異なるので同一オリジンではない http://example.com http://example.com:3000 // スキームが異なるので同一オリジンではない http://example.com https://example.com

    // サブドメインではあるが、ホストが異なるので同一オリジンではない http://example.com http://www.example.com http://myapp.example.com
  7. イメージ 25 url: /api/user method: OPTIONS Client Server プリフライトリクエスト Mozilla.「Preflight

    request (プリフライトリクエスト)」. https://developer.mozilla.org/ja/docs/Glossary/Preflight_request メインリクエスト url: /api/user method: POST
  8. HTTPのステートレス性 HTTPは状態を持たないプロトコルとして設計されています。それぞれのリクエストは独立したものとし て扱われます。 そのため、毎回リクエストに全ての情報を送信しなければいけません。 27 Aです。ハンバーガーの配達をお願いします。 かしこまりました。住所はどちらでしょうか? 東京都千代田区千代田1-1です。 かしこまりました。お届けします。 ステートフルな会話

    Aです。ハンバーガーの配達をお願いします。 かしこまりました。住所はどちらでしょうか? 東京都千代田区千代田1-1です。 あなたは誰ですか?何を注文されますか? ステートレスな会話 この会話成立させるには 「Aです。東京都千代田区千代 田1-1にハンバーガーの配達をお 願いします」 とリクエストする必要がある。
  9. イメージ 30 url: /api/user method: GET Client Server Set-Cookie: SESSIONID=12345678

    url: /api/hamburgers method: GET cookie: SESSIONID=12345678
  10. Domain属性 理由がなければ設定しない。 • Cookie を受信することができるドメインを指定する属性 • 未設定の場合は、Cookieを生成したサーバーにのみ送信されるので、セキュリティ上ではこれが最 も安全 • 複数のドメインに対して有効なCookieを生成したい場合等が利用シーンにあげられる

    ◦ ただし、Windows7、Windows8.1のIEについてはeTLDに該当する一部のドメインが設定できて しまうクッキモンスターバグがある。(PSLを各ベンダ毎に管理していたのが根本原因)例え ばexample.tokyo.jpに対して指定する場合は、example.tokyo.jpですが、tokyo.jpのクッキーが 作れてしまう問題。モダンブラウザでは対策されていますが、セッション固定化攻撃のリス クが増加するため注意が必要です。 Jxck. 「Public Suffix List の用途と今起こっている問題について」.   https://blog.jxck.io/entries/2021-04-21/public-suffix-list.html 32
  11. SameSite属性 利用シーンに応じた適切な設定をする • 設定値は、None(なし)、Lax(緩い)、Strict(厳しい)の3種類 ◦ 未設定の場合は、Laxが設定される(一部のモダンブラウザ, safari,firefoxはNoneっぽい) ▪ 徳丸浩の日記. 「2022年1月においてCSRF未対策のサイトはどの条件で被害を受けるか」.

    https://blog.tokumaru.org/2022/01/ ◦ Noneを設定する場合は、Secure属性の有効化が必須(一部のモダンブラウザ) ◦ 後述するCSRF脆弱性に有効 35 Mozilla. Set-Cookie. https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Set-Cookie Google. 「新しい SameSite=None; Secure Cookie 設定への対応準備」. https://developers.google.com/search/blog/2020/01/get-ready-for-new-samesitenone-secure?hl=ja e-Words. SameSite属性 【SameSite Cookie】. https://e-words.jp/w/SameSite%E5%B1%9E%E6%80%A7.html
  12. リタゲ広告のイメージ 38 https://ecA.com https://ecB.com ecA.comを 閲覧した ecB.comを 閲覧した 1. ecA.comにアクセス

    https://ad.com 2. ecA.comに設置されたad.com の広告からリクエスト 3. ad.comからサードパーティ クッキーが生成される 5. ecB.comに設置されたad.com の広告からリクエスト 6. このクッキーを所有する ユーザーはecA.com,ecB.comの サイトを閲覧したという履歴が 広告サイトに蓄積される 4. ecB.comにアクセス
  13. イメージ 正規サイトA 5. 正規サイトからのリクエストなので 正規リクエストとして 処理される 2. 悪意のあるユーザーが作成したサイトに 正規サイトAに対する リクエストが埋め込まれている

    偽サイトA’ 4. ユーザーは気づかず リクエストが送信される 6. ユーザーが意図しない結果が 反映される 1. 正規サイトAに ログイン済 3. ユーザーが 偽サイトA’にアクセス
  14. CSRF脆弱性を探してみよう🔍 CSRF 攻撃を使用してユーザーの電子メールアドレスを変更する HTML を作成し、それをエクスプロイト サーバーにアップロードしてください。 PortSwigger. Lab: CSRF vulnerability

    with no defenses. https://portswigger.net/web-security/csrf/lab-no-defenses ※注意: Solution, Community solutionsは開かないようにしてください。 💡ヒント • まずはメールアドレス変更のリクエストを探してみましょう。 • 攻撃サイトでユーザーは操作を行いません。ユーザーがアクセスした瞬間にリクエストが送信され るようにしてください。 • スクリプトが完成したら「Deliver exploit to victim」をクリックするのを忘れずに・ 45 分かりにくいですが、画面上部のGo to exploit serverからHTMLが 作成できます。
  15. XSSを探してみよう🔍① ブログの検索機能にXSS脆弱性が隠されています。XSS攻撃を仕掛けてalert()を実行してください。 PortSwigger. Lab: Reflected XSS into HTML context with

    nothing encoded. https://portswigger.net/web-security/cross-site-scripting/reflected/lab-html-context-nothing-encoded 💡ヒント • Reflected-XSS 59
  16. 解説 60 URLクエリに含まれる文字列をそのまま出力してしまっている。 PortSwigger. Lab: Reflected XSS into HTML context

    with nothing encoded. https://portswigger.net/web-security/cross-site-scripting/reflected/lab-html-context-nothing-encoded
  17. XSSを探してみよう🔍② ブログのコメント機能にXSS脆弱性が隠されています。XSS攻撃を仕掛けてalert()` を実行してください。 PortSwigger. Lab: Stored XSS into HTML context

    with nothing encoded. https://portswigger.net/web-security/cross-site-scripting/stored/lab-html-context-nothing-encoded 💡ヒント • Stored-XSS 61
  18. XSSを探してみよう🔍③ ブログの検索機能にXSS脆弱性が隠されています。XSS攻撃を仕掛けてalert()` を実行してください。 PortSwigger. Lab: DOM XSS in document.write sink

    using source location.search. https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-document-write-sink 💡ヒント • DOM-Based XSS 63
  19. 解説 64 document.writeで書き込んでいるため、HTMLのリテラルが 破壊された。 PortSwigger. Lab: DOM XSS in document.write

    sink using source location.search. https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-document-write-sink
  20. XSSを探してみよう🔍④ ブログの検索機能にXSS脆弱性が隠されています。XSS攻撃を仕掛けてalert()` を実行してください。 PortSwigger. Lab: DOM XSS in innerHTML sink

    using source location.search. https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-innerhtml-sink 💡ヒント • scriptタグ以外の方法でJavaScriptを実行する方法を考えてみてください。 • DOM-Based XSS • ロード時にアラートが出ないとダメかも? 65
  21. XSSを探してみよう🔍⑤ フィードバック送信ページにXSS脆弱性が含まれています。「Back」をクリックした時にクライアントに 保存されているCookieをalertしてください。 PortSwigger. Lab: DOM XSS in jQuery anchor

    href attribute sink using location.search source. https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-jquery-href-attribute-sink 💡ヒント • Anchorタグからjavascriptを発火させるにはどのようにしたら良いでしょうか。 • Reflected-XSS 67
  22. XSSを探してみよう🔍⑥ ブログの検索機能にXSS脆弱性が隠されています。検索ワード入力ボックスにマウスオーバーしたら alert()を実行するようにしてください。 PortSwigger. Lab: Reflected XSS into attribute with

    angle brackets HTML-encoded. https://portswigger.net/web-security/cross-site-scripting/contexts/lab-attribute-angle-brackets-html-encoded 💡ヒント • ここまで進んだ人達であれば自力で解けるはず。。。! 69
  23. 解説 70 PortSwigger. Lab: Reflected XSS into attribute with angle

    brackets HTML-encoded. https://portswigger.net/web-security/cross-site-scripting/contexts/lab-attribute-angle-brackets-html-encoded
  24. XSSを探してみよう🔍⑦ ブログのコメント機能にXSS脆弱性があります。コメント作成者名がクリックされた時にalert()が実行さ れるようにしてください。(コメントの「Website」を入力しないと作成者名がリンクにならないので注 意!) PortSwigger. Lab: Stored XSS into anchor

    href attribute with double quotes HTML-encoded. https://portswigger.net/web-security/cross-site-scripting/contexts/lab-href-attribute-double-quotes-html-encoded 💡ヒント • ここまで進んだ人達であれば自力で解けるはず。。。! 71
  25. 解説 72 PortSwigger. Lab: Stored XSS into anchor href attribute

    with double quotes HTML-encoded. https://portswigger.net/web-security/cross-site-scripting/contexts/lab-href-attribute-double-quotes-html-encoded
  26. XSSを探してみよう🔍⑧ ブログの検索機能にXSS脆弱性が隠されています。検索を実行した時にalert()が実行されるようにしてく ださい。 PortSwigger. Lab: Reflected XSS into a JavaScript

    string with angle brackets HTML encoded. https://portswigger.net/web-security/cross-site-scripting/contexts/lab-javascript-string-angle-brackets-html-encoded 💡ヒント • JavaScriptのコードリテラルを破壊してください。 73
  27. 解説 74 サーバでHTMLを生成する際にURLクエリの内容をエスケープせず、HTMLに書き出してしまっている。 PortSwigger. Lab: Reflected XSS into a JavaScript

    string with angle brackets HTML encoded. https://portswigger.net/web-security/cross-site-scripting/contexts/lab-javascript-string-angle-brackets-html-encoded
  28. XSSの緩和対策 また、その他に緩和策として以下の方法が取られます。 • ユーザーからの入力値の検証 • Content-security Policyの設定 ※1 • X-XSS-Protectionの設定(レガシーブラウザのサポートが必要な場合のみ)

    • CookieのHttpOnly属性の有効化(セッションハイジャックのみ) ※1 Mozilla. コンテンツセキュリティポリシー (CSP). https://developer.mozilla.org/ja/docs/Web/HTTP/CSP 76
  29. イメージ メールアドレス、パスワードが一致したらログインできる。 内部的には以下のようなクエリが発行される。 SELECT * FROM users WHERE email =

    [email protected]’ and password = ‘password’; // OR 1 = 1で必ずtrueが返る SELECT * FROM users WHERE email = '[email protected]' OR 1 = 1 --' and password = ''; メールアドレスに[email protected]’ OR 1 = 1 –-と入力することで パスワードの認証を突破できてしまう。
  30. SQL injectionを探してみよう①🔍 商品カテゴリの検索機能に SQL インジェクションの脆弱性があります。脆弱性を見つけ、未リリースも 含んだ全ての商品の一覧を表示してください。 PortSwigger. Lab: SQL injection

    vulnerability in WHERE clause allowing retrieval of hidden data. https://portswigger.net/web-security/sql-injection/lab-retrieve-hidden-data 💡 ヒント • ソースコードの内部では受け取ったパラメータからどのようにクエリを作成するのか想像してみま しょう。
  31. 解説 82 const db = new DB(); db.open(); const sql

    = `SELECT * FROM products WHERE category_name = '${category}' AND release = 1`; db.query(sql); db.close(); 以下のようなスクリプトが組まれているのではないか、と推 測できる。 categoryに’+OR+1=1+--に書き換えてリクエストすると以 下のクエリが発行される。(+はスペースの代わり) SELECT * FROM products WHERE categories = '' OR 1=1 --' AND release = 1
  32. SQL injectionを探してみよう②🔍 商品カテゴリの検索機能に SQL インジェクションの脆弱性があります。 データベースにはusersという別のテーブルがあり、usernameとpasswordというカラムが存在します。すべての ユーザー名とパスワードを取得し、その情報を使用して管理者ユーザーとしてログインしてください。 PortSwigger. Lab: SQL

    injection UNION attack, retrieving data from other tables. https://portswigger.net/web-security/sql-injection/union-attacks/lab-retrieve-data-from-other-tables 💡ヒント • まず、ユーザーから受け取った値でクエリを生成している箇所を見つけてください。 • そのクエリを利用してusersテーブルからデータを取得する方法を考えてください。(UNION) ◦ 脆弱性のあるクエリのカラム数を探索してみてください。 ◦ カラム数が特定できたらカラムのデータ型を探索してみてください。 ◦ カラム数とデータ型が特定できたらusersテーブルと結合してみてください。
  33. OS command injectionを探してみよう🔍 商品の在庫確認機能にOSコマンドインジェクションの脆弱性が存在します。パラメータで渡された商品 IDと店舗IDをもとにシェルスクリプトを実行して、標準出力された内容を返却します。 whoamiコマンドを実行して、現在のユーザ名を出力してください。 PortSwigger. Lab: OS command

    injection, simple case. https://portswigger.net/web-security/os-command-injection/lab-simple 💡 ヒント • whoamiはunix系列の現在のユーザーを表示するコマンドです。 • リクエストのパラメータが直接シェルスクリプトに引数として渡されると想定してください。 • ディレクトリの中身の参照やファイルの追加、削除等も行ってみてください。
  34. Directory traversalを探してみよう🔍 商品の詳細ページの画像表示にDirectory traversalの脆弱性があります。/etc/passwdのファイル内容を表 示してください。 PortSwigger. Lab: File path traversal,

    simple case. https://portswigger.net/web-security/file-path-traversal/lab-simple 💡 ヒント • HTTP Historyから通信の内容を確認してみてください。 • パス指定には絶対パスの他に、相対パス指定もある。 リクエストの内容を変更した場合は、HTTP History のOriginal requestからEdited requestを選択すると変 更後のリクエストの内容を確認できます。
  35. End