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

攻撃と防御で実践するプロダクトセキュリティ演習_2024(導入編)

Recruit
August 09, 2024

 攻撃と防御で実践するプロダクトセキュリティ演習_2024(導入編)

2024年度リクルート エンジニアコース新人研修の講義資料です

Recruit

August 09, 2024
Tweet

More Decks by Recruit

Other Decks in Technology

Transcript

  1. 3 ग़Ո༞و / Yuki Ideya • ೥݄ʙ 3&%5&".ॴଐ • ͦΕҎલ͸ۚ༥ܥͷ4*FS΍ɺηΩϡϦςΟϕϯμʔͰ׭ެி΁ͷڭҭࣄ

    ۀͳͲ΍͍ͬͯ·ͨ͠ ʲ࠷ۙϋϚ͍ͬͯΔ͜ͱɾࠓޙ΍Γ͍ͨ͜ͱʳ • ੜ੒"*ͷηΩϡϦςΟपΓษڧͨ͠Γͱ͔ ηΩϡϦςΟҎ֎ͷ஌ࣝ ͸՝୊ײʜʂ • ޴ͷௐࢠ͕ຫੑతʹѱ͍ͷͰɺͣ˓ͩ΋Μͱ͔ͱੜ੒"*Ͱ஻ΓΛ୅Θ Γʹ΍ͬͯ͘ΕΔ࢓૊ΈΛ໛ࡧத • ๺ւಓ͔ΒϦϞʔτͰಇ͍ͯͯग़ࣾ΄΅ͳ͍ͷͰ߈ΊͨαϒΧϧͬΆ ͍෰ΛങͬͨΓ͢ΔͷͰ͕͢ɺணΔ৔໘͕ͳ͍ͯͭ͘΋ޙչ͠·͢ ௕ظͷ࣋පͰ޴ͷௐࢠ͕ѱΊͳͷͰ֏෷͍ͳͲͰ͓ฉ͖͍ۤ͠৔໘͕͋Δ͔΋͠Ε·ͤΜɻ ͪΌΜͱ࠷ޙ·ͰίϯςϯπΛ͓ಧ͚Ͱ͖ΔΑ͏४උສ୺ͳͷͰ҆͝৺͍ͩ͘͞ʜʂ
  2. 4 ஥੢ ๎໵ / Tomoya Nakanishi • ೥य़ʙ 3&%5&".ॴଐ •

    ϦΫϧʔτ৽ଔೖࣾ ʲ࠷ۙϋϚ͍ͬͯΔ͜ͱɾࠓޙ΍Γ͍ͨ͜ͱʳ • ϖωτϨʔγϣϯςετͷࢿ֨ษڧɺҰ൪࠷ۙऔͬͨͷ͸04&1 • μΠϏϯάʹߦ͘ճ਺͕૿͍͑ͯΔ
  3. ͲΜͳ੡඼ʹ੬ऑੑ͕ใࠂ͞Ε͍ͯΔʁ • Linux΍WindowsɺAndroidɺiOSͳͲͷOS • ϓϩάϥϛϯάݴޠͷඪ४ϥΠϒϥϦ • ήʔϜػͳͲͷ૊ΈࠐΈػث • Chrome΍FirefoxͳͲͷϒϥ΢β ྫ͑͹ɾɾɾ

    ਎ͷճΓͰ޿͘ར༻͞ΕΔ༗໊ͳιϑτ΢ΣΞʹ΋੬ऑੑ͕ൃݟ͞Ε͍ͯΔ զʑ΋੬ऑੑΛ࡞ΓࠐΜͰ͠·͏Մೳੑ͸े෼ʹ͋Δ 22
  4. ຊηΫγϣϯͷΞδΣϯμ 24 1. ຊηΫγϣϯͰऔΓѻ͏੬ऑੑͷ঺հ 2. XSS (Cross-Site Scripting) 3. IDORʢInsecure

    Direct Object Reference) 4. CSRF (Cross-Site Request Forgery) 5. SQL Injection 6. Path Traversal 7. DoS (Denial-of-Service) 8. OS Command Injection
  5. XSSͷݪཧ 33 ϖϯΪϯ͘Μͷ ηογϣϯήοτʂ 攻撃者 ΞΫηε͢Δͱ $PPLJF͕ൈ͔ΕΔ +BWBTDSJQU 被害者 ඃ֐ऀ͸ϖʔδΛ

    Ӿཡ͚ͨͩ͠Ͱ $PPLJF͕ൈ͔Εͯ͠·͏ ͜ͷਓͷϓϩϑΟʔϧؾʹͳΔʂ ΞΫηε࣌ʹ࣮ߦ
  6. XSSʹΑΔ߈ܸྫ 36 https:// ...のページ window.document.body window.localStorage Cookie(※) https://evil.example.com/...のページ ※originより制限が緩いsite単位での管理 ѱҙͷ͋Δ+BWB4DSJQU

    ブラウザ Origin ͕ҟͳΔϖʔδ ͜͜ͷ෦෼Λ 0SJHJOͱ͍͏ ຊདྷϒϥ΢β্Ͱ͸ɺ͋Δ63-ʹΑͬͯϩʔυ͞ΕΔϦιʔεʢ+BWB4DSJQUͷίʔυͳͲʣ͔Β͸ ผαΠτͷϦιʔε΁ΞΫηε͢Δ͜ͱ͕Ͱ͖ͳ͍ ˠಉҰΦϦδϯϙϦγʔʢ4BNF0SJHJO 1PMJDZ 401ʣʹΑΔอޢ
  7. XSSʹΑΔ߈ܸྫ ຊདྷϒϥ΢β্Ͱ͸ɺ͋Δ63-ʹΑͬͯϩʔυ͞ΕΔϦιʔεʢ+BWB4DSJQUͷίʔυͳͲʣ͔Β͸ ผαΠτͷϦιʔε΁ΞΫηε͢Δ͜ͱ͕Ͱ͖ͳ͍ ˠ ಉҰΦϦδϯϙϦγʔʢ4BNF0SJHJO 1PMJDZ 401ʣʹΑΔอޢ 37 https:// ...のページ

    window.document.body window.localStorage Cookie(※) https://evil.example.com/...のページ ※originより制限が緩いsite単位での管理 ѱҙͷ͋Δ+BWB4DSJQU ブラウザ Origin ͕ҟͳΔϖʔδ GFUDI ʹΑΔϨεϙϯεಡΈऔΓ
  8. 38 XSSʹͭͳ͕Δةݥͳ࣮૷ྫ +BWB4DSJQUͷίϯςΩετͰղऍ͞ΕΔ෦෼ <img onload=“ユーザーの入力”> document.body.innerHTML = “ユーザーの入力” document.write(“ユーザーの入力”) ʹ

    Ϣʔβʔͷೖྗ͕͋Δ ˠ ةݥͳίʔυʹͳΔ K2VFSZͷK2VFSZBQQFOE ΍ 3FBDUKTͷEBOHFSPVTMZ4FU*OOFS)5.- ͳͲ ϥΠϒϥϦΛ࢖͍ͬͯͯ΋஫ҙ͕ඞཁͳ෦෼΋͋Δɻ ࣮૷ྫ ࣮૷ྫ ࣮૷ྫ note
  9. 43 IDORͷݪཧ POST /posts/ comment=今⽇はいい天気☀ ID: 1ͷ౤ߘΛߋ৽͢ΔϦΫΤετ POST /posts/ comment=こんにちは︕

    ID: 2ͷ౤ߘΛߋ৽͢ΔϦΫΤετ ౤ߘ͝ͱʹ*%ΛׂΓ౰ͯͯαʔόʔଆͰࣝผ ฤूର৅ͷ౤ߘΛϦΫΤετ࣌ʹ*%Ͱࢦఆ A͞Μ͕ࣗ਎ͷ ౤ߘʢID: 1ʣΛߋ৽ ߈ܸऀ͕ࣗ਎ͷ ౤ߘʢID: 2ʣΛߋ৽ "͞Μ ʮࠓ೔͸͍͍ఱؾ‗ʯ ߈ܸऀ ʮ͜Μʹͪ͸ʯ ౤ߘ ౤ߘ
  10. 44 IDORͷݪཧ POST /posts/ comment=私はお⾦持ちです︕ ID: 2ͷ౤ߘΛߋ৽͢ΔϦΫΤετ ߈ܸऀ͕ࣗ਎ͷ ౤ߘʢID: 2ʣΛߋ৽

    他⼈の投稿IDに 変更して更新 "͞Μ ʮࢲ͸͓ۚ࣋ͪͰ͢ʂʯ ߈ܸऀ ʮ͜Μʹͪ͸ʯ ౤ߘ ౤ߘ
  11. αʔόʔ͸ɺʮͲͷϢʔβʔʹΑΔϦΫΤετ͔ʯͱ͍ͬͨηογϣϯ؅ཧΛϦΫΤετ࣌ʹ෇ Ճ͞ΕΔ$PPLJFϔομͷ஋Ͱߦ͏ ϒϥ΢βଆͰ͸ɺϦΫΤετൃੜ࣌ʹαΠτผʹอଘ͞Ε͍ͯͨ$PPLJFΛࣗಈతʹ෇༩͢Δ 49 CSRFͷݪཧ ϩάΠϯ Set-Cookie: sessionid=sdfhaiew ౤ߘ΁ͷ͍͍Ͷ ౤ߘͷฤू

    Cookie: sessionid=sdfhaiew Cookieͷ஋͔Β Ϣʔβʔhoge͔ΒͷϦΫΤετ ͱͯ͠ॲཧ ϒϥ΢β͔Β https://example.com ΁ͷϦΫΤετૹ৴ Ϣʔβʔhoge https://example.com ϒϥ΢βʹ CookieΛอଘ Cookie: sessionid=sdfhaiew ϦΫΤετʹ ࣗಈతʹ$PPLJF෇༩
  12. ࣗಈͰ$PPLJFૹ৴͞ΕΔੑ࣭Λར༻ͯ͠ ଞͷϢʔβʔ͕ҙਤ͠ͳ͍ϦΫΤετૹ৴͢Δ63-ΞΫηεͤͨ͞ΒͲ͏ͳΔʁ 50 CSRFͷݪཧ Ϣʔβʔͷ࡟আ ʮϢʔβʔͷ࡟আʯͷϦΫΤετ ͱಉ͡63-Λૹ৴ ϩάΠϯࡁΈͷϒϥ΢βͰ ϦϯΫΛ։͘ Ϣʔβʔhoge

    Cookieͷ஋͔Β Ϣʔβʔhoge͔ΒͷϦΫΤετ ͱͯ͠ॲཧ ˠ Ϣʔβʔͷҙਤʹ൓ͯ͠উखʹΞΧ΢ϯτ͕࡟আ͞Εͯ͠·͏ Cookie: sessionid=sdfhaiew ϦΫΤετʹ ࣗಈతʹ$PPLJF෇༩ ϒϥ΢β͔Β IUUQTFYBNQMFDPN ΁ͷϦΫΤετૹ৴
  13. 73 OS Command Injectionͷ࣮૷ྫ ίϚϯυΛ࣮ߦ͢Δؔ਺ʹϢʔβʔೖྗΛར༻͢Δέʔε ʢจࣈྻ݁߹ͳͲʣ system(“ユーザーの入力”) exec(“ユーザーの入力”) passthru(“ユーザーの入力”) Runtime.getRuntime().exec(“ユーザーの入力”)

    child_process.spawn(“ユーザーの入力”) child_process.exec(“ユーザーの入力”) 1)1 +BWB /PEFKT exec(“ユーザーの入力”) system(“ユーザーの入力”) 3VCZ
  14. ຊηΫγϣϯͷΞδΣϯμ 75 1. Path Traversalରࡦ 2. OS Command Injectionରࡦ 3.

    ੬ऑੑରࡦͷϙΠϯτʢࠓճͷԋश΍ࠓޙͷۀ຿Ͱ࣮ ફͯ͠΄͍͜͠ͱ
  15. ../../../etc/passwd 77 Path Traversalରࡦ filenameʹ1্ͭͷ֊૚Λࣔ͢ “../” ͕ར༻Ͱ͖Δ͜ͱ͕໰୊͔ͩΒɾɾɾ filename͔Β “../” ΛऔΓআ͘ॲཧΛͯ͠ରࡦ

    etc/passwd /app/uploads/etc/passwd “/app/uploads/” + filename ࡉ޻Λͯ͠΋ BQQVQMPBET഑Լ͕ಡΈग़͠ର৅ͷύεʹͳΔ ˠ ೚ҙͷύεͷϑΝΠϧΛಡΈग़͢͜ͱ͕Ͱ͖ͳ͘ͳͬͨ ˞͜ͷमਖ਼ํ๏͸ਖ਼͋͘͠Γ·ͤΜʂ
  16. 81 Path Traversalରࡦ ରࡦྫ ύεͷਖ਼نԽͷྫɿ /app/uploads/./././etc/passwd → /app/uploads/etc/passwd /app/uploads/././../uploads/../etc/././passwd →

    /etc/passwd ύεΛਖ਼نԽͯ͠ɺҙਤͨ͠σΟϨΫτϦ഑Լ͕ࢦఆ͞Ε͍ͯΔ͔Λ ݕূ /app/uploads/ Ͱ࢝·Δʁ
  17. • PortSwigger WebSecurity Academy ʢ https://portswigger.net/web-security ʣ • ମܥతʹֶͿ ҆શͳWebΞϓϦέʔγϣϯͷ࡞Γํ

    ʢ https://www.sbcr.jp/product/4797393163/ ʣ 97 WebΞϓϦέʔγϣϯʹର͢Δ߈ܸख๏ΛΑΓৄ͘͠ษڧ͍ͨ͠ํ͸
  18. 107 ໰୊ʹ͍ͭͯ ü෇༩ϙΠϯτ͸Լهͷ௨ΓͰ͢ attack: 100 pts defense: मਖ਼͕׬ᘳͳ৔߹: 100 pts

    मਖ਼͕ෆ׬શͳ৔߹: 50 pts üChallenge͝ͱʹ൪߸͕ৼΒΕ͍ͯ·͕͢Ͳͷॱ൪Ͱղ͍ͯ΋ߏ͍·ͤΜ üChallenge಺ͷattack΍defenseʹ΋ղ͘΂͖ॱ൪ʹࢦఆ͸͋Γ·ͤΜ ü֤໰୊Ͱͦͷ໰୊͕ղ͚ͨνʔϜ਺Λ֬ೝͰ͖·͢ ଟ͘ͷνʔϜ͕ղ͚ͨ໰୊ͷํ͕೉қ౓͕௿͍͔΋͠Ε·ͤΜ
  19. 111 Check 4: νϡʔτϦΞϧ໰୊ʢ߈ܸฤʣͷιʔείʔυͷऔಘ ֤νʔϜʹ഑෍͞ΕͨϦϙδτϦΛΫϩʔϯͯ͠ιʔείʔυΛ֬ೝ $ git clone /bootcamp-2024-teamx.git $

    cd bootcamp-2024-teamx/ $ ls … fortune … ໰୊໊ͱಉҰͷσΟϨΫτϦ໊ʹͦͷ໰୊ʹؔ࿈ͨ͠ϑΝΠϧ͕֨ೲ͞Ε͍ͯΔ ࠓճͷ໰୊ͷ৔߹͸ʮfortuneʯ
  20. 113 Flagʹ͍ͭͯ üFlagͷܗࣜ͸໰୊͝ͱʹࢦఆ͕ͳ͍ݶΓɺ ctfRED{[¥x20-¥x7E]+} ʢ{}಺͸ද ࣔՄೳͳ1จࣈҎ্ͷASCIIจࣈʣͰ͢ üdummy{…} ͱ͍ͬͨμϛʔͷFlag͕දࣔ͞ΕΔ͜ͱ͕͋Γ·͕͢ɺຊ෺Ͱ͸ ͳ͍͜ͱʹ஫ҙ͍ͯͩ͘͠͞ ü഑෍͞ΕͨιʔείʔυதͰ͸ɺຊ෺ͷFlag͕ϚεΫ͞Ε͍ͯ·͢

    üFlag͸ૹ৴ϑΥʔϜ͔ΒԿճૹ৴ͯ͠΋ϙΠϯτ͕ݮΔ͜ͱ͸͋Γ·ͤΜ͕ɺ ਪଌ͕ࠔ೉ͳจࣈྻʹͳ͍ͬͯ·͢ üօ͞Μͷਐ௙۩߹Λ֬ೝ͍ͨ͠ͷͰɺFlag͸ͳΔ΂͘ཷΊࠐ·ͣʹఏग़Λ͓ ئ͍͠·͢
  21. 122 Check 6: νϡʔτϦΞϧ໰୊ʢ๷ޚฤʣ: मਖ਼ͷಈ࡞֬ೝ $ cd fortune $ docker

    compose up --build ഑෍͞ΕͨϦϙδτϦதͷίʔυΛमਖ਼ޙͷಈ࡞֬ೝ ࣍ͷίϚϯυͰ%PDLFSίϯςφͷىಈͱಉ࣌ʹϏϧυΛ࣮ߦ αʔόʔ͕ىಈͯ͠ IUUQMPDBMIPTU ͔ΒΞΫηεͰ͖Δ
  22. αʔόʔ͸ɺʮͲͷϢʔβʔʹΑΔϦΫΤετ͔ʯͱ͍ͬͨηογϣϯ؅ཧΛϦΫΤετ࣌ʹ ෇Ճ͞ΕΔCookieϔομͷ஋Ͱߦ͏ ϒϥ΢βଆͰ͸ɺϦΫΤετൃੜ࣌ʹαΠτผʹอଘ͞Ε͍ͯͨCookieΛࣗಈతʹ෇༩͢Δ 124 ηογϣϯ؅ཧʢ࠶ܝʣ ϩάΠϯ Set-Cookie: sessionid=sdfhaiew ౤ߘ΁ͷ͍͍Ͷ ౤ߘͷฤू

    Cookie: sessionid=sdfhaiew Cookieͷ৘ใ͔Β Ϣʔβʔhoge͔ΒͷϦΫΤετ ͱͯ͠ॲཧ https://example.com΁ϦΫΤετ → อଘͨ͠CookieΛϦΫΤετ ϔομʹࣗಈతʹ෇༩ Ϣʔβʔhoge https://example.com ϒϥ΢βʹ CookieΛอଘ Cookie: sessionid=sdfhaiew
  23. 136 Appendix 2. curlίϚϯυͷ࢖͍ํ λʔϛφϧ͔ΒHTTPϦΫΤετΛૹ৴Ͱ͖Δπʔϧ # Cookieヘッダを設定してリクエスト $ curl -H

    ‘Cookie: user_id=1’ http://localhost:8000/ # フォームの送信 $ curl -X POST -d ‘param=1&param2=hoge’ http://example.com/ # ファイルをアップロード $ curl -X POST -F upfile=@/path/to/sample.txt http://example.com/upload
  24. 137 Appendix 2. curlίϚϯυͷ࢖͍ํ $ python3 -m pip install requests

    PythonͷHTTPΫϥΠΞϯτϥΠϒϥϦ import requests r = requests.get(‘http://example.com') print(r.text) r = requests.post(‘http://example.com', data={‘param1’: ‘value1’}, headers={‘Cookie’: ‘hoge=fuga’}) print(r.text)
  25. 138 Appendix 3. Chrome։ൃऀπʔϧͷ࢖͍ํ Option + Command + I Ͱىಈ

    ʮιʔεʯλϒ ݱࡏͷϖʔδͷදࣔʹඞཁͳ HTMLɺJSɺCSSΛӾཡͰ͖Δ JSͷ৔߹ʹ͸ߦ൪߸ΛΫϦοΫ͢ Δ͜ͱͰϒϨʔΫϙΠϯτΛઃஔ ֤ͯ͠ม਺ͷ஋ͳͲΛ֬ೝՄೳ
  26. 142