Webアプリケーションテストを用いたSQLクエリのホワイトリスト自動作成手法

Ec3fcf78fa2ad21dcc48478df80e0dc4?s=47 Komei Nomura
December 07, 2018

 Webアプリケーションテストを用いたSQLクエリのホワイトリスト自動作成手法

第11回インターネットと運用技術シンポジウム IOTS2018

Webアプリケーションの脆弱性を利用してデータベースから機密情報を窃取する攻撃が問題になっている.対策として,クエリのホワイトリストによる検知があるが,大規模なアプリケーションにおいてはクエリパターンが膨大であり,開発者によるリストの手動作成が困難なため,リストの自動作成手法が利用される.しかし,従来のホワイトリスト自動作成手法には,ユーザがWebサービスを利用することによって,発行されるクエリを収集するのに時間がかかり検知の即時性が低い課題や,アプリケーション毎に異なる実装を必要とし汎用性が低い課題がある.
本研究では,アプリケーションの動作テスト実行時の発行クエリからホワイトリストを作成する手法を提案する.提案手法はテスト時の発行クエリを使いアプリケーションの実装に依存せず作成できるため,検知の即時性や汎用性は向上する.

Ec3fcf78fa2ad21dcc48478df80e0dc4?s=128

Komei Nomura

December 07, 2018
Tweet

Transcript

  1. ໺ଜ޸໋(ϖύϘݚڀॴ), Ѩ෦ ത, ੁ໺ ఩(ίίϯגࣜձࣾ, גࣜձࣾϨϐμϜ), ྗ෢݈࣍(ྗ෢݈ٕ࣍ज़࢜ࣄ຿ॴ), দຊ྄հ(ϖύϘݚڀॴ, ͘͞ΒΠϯλʔωοτגࣜձࣾ) 2018.12.07

    IOTS2018 ୈ11ճΠϯλʔωοτͱӡ༻ٕज़γϯϙδ΢Ϝ WebΞϓϦέʔγϣϯςετΛ༻͍ͨ
 SQLΫΤϦͷϗϫΠτϦετࣗಈ࡞੒ख๏
  2. 1. ݚڀͷഎܠͱ໨త 2. ैདྷͷϗϫΠτϦετࣗಈ࡞੒ͷ՝୊ 3. ఏҊख๏ 4. ධՁ 5. ·ͱΊͱࠓޙͷ՝୊

    2 ໨࣍
  3. 1. ݚڀͷഎܠͱ໨త

  4. • WebΞϓϦέʔγϣϯʢWebΞϓϦʣͷ੬ऑੑΛར༻ͨ͠߈ܸʹΑͬͯɼσʔλ ϕʔε্ͷػີ৘ใͷ࿙Ӯ͕ൃੜ • ߈ܸऀ͸༷ʑͳ߈ܸख๏Λ༻͍ͯɼσʔλϕʔεʹෆਖ਼ΫΤϦΛൃߦ • ߈ܸͷྫɿSQLΠϯδΣΫγϣϯɼOSίϚϯυΠϯδΣΫγϣϯͳͲ • ෆਖ਼ΫΤϦͱ͸ɼ߈ܸʹΑͬͯੜ͡Δ։ൃऀͷ૝ఆ֎ͷΫΤϦ •

    ෆਖ਼ΫΤϦΛݕ஌͠σʔλϕʔεΛอޢ͢Δରࡦ͕ඞཁ 4 ݚڀͷഎܠ
  5. • ϒϥοΫϦετํࣜ • ط஌ͷෆਖ਼ͳύλʔϯΛఆٛ͢Δ • Ϧετʹఆٛͨ͠ύλʔϯͱ߹க͢ΔΫΤϦΛෆਖ਼ͱͯ͠ݕ஌͢Δ • ϗϫΠτϦετํࣜ • ਖ਼ৗͳύλʔϯΛఆٛ͢Δ

    • Ϧετʹఆٛͨ͠ύλʔϯͱ߹க͠ͳ͍ΫΤϦΛෆਖ਼ͱͯ͠ݕ஌͢Δ • ط஌ͷෆਖ਼ΫΤϦ͸ϒϥοΫϦετͰݕ஌Մೳ͕ͩɼະ஌ͷෆਖ਼ΫΤϦΛݕ஌͢Δ ʹ͸ϗϫΠτϦετ͕ඞཁ 5 ෆਖ਼ΫΤϦͷݕ஌ํ๏
  6. • WebΞϓϦ͕ൃߦ͢ΔΫΤϦΛखಈͰϗϫΠτϦετʹొ࿥ • େن໛ͳWebΞϓϦͰ͸ൃߦ͞ΕΔΫΤϦ͕๲େͳͨΊɼશͯͷΫΤϦΛ ϗϫΠτϦετʹొ࿥͢Δ͜ͱ͸ࠔ೉ • WebΞϓϦͷվमʹΑͬͯൃߦ͞ΕΔΫΤϦ͸มԽ͠ɼϗϫΠτϦετͷ ߋ৽͕ඞཁ • ӡ༻ऀ΁ͷෛ୲͕େ͖͍

    6 ϗϫΠτϦετ࡞੒ͷ՝୊
  7. • ӡ༻ऀ΁ͷෛ୲Λܰݮ͢ΔͨΊʹɼWebΞϓϦͷൃߦΫΤϦͷมԽʹࣗಈͰ ௥ैͰ͖ΔϗϫΠτϦετͷ࡞੒ํ๏ͷ࣮ݱ 7 ݚڀͷ໨త

  8. 2. ैདྷͷϗϫΠτϦετࣗಈ࡞੒ͷ՝୊

  9. 1. WebΞϓϦՔಇதͷΫΤϦΛ༻͍ͨख๏ • WebΞϓϦՔಇޙɼଈ࣌ʹෆਖ਼ΫΤϦΛݕ஌Ͱ͖ͳ͍ 2. ιʔείʔυղੳΛ༻͍ͨख๏ • WebΞϓϦͷ࣮૷ʹґଘͨ͠ํ๏ͷͨΊɼෳ਺ͷWebΞϓϦͰ൚༻తʹ
 ར༻Ͱ͖ͳ͍ 9

    ैདྷͷϗϫΠτϦετࣗಈ࡞੒ͷ՝୊
  10. • WebΞϓϦՔಈதʹൃߦ͞ΕͨΫΤϦΛऩू͠ϗϫΠτϦετΛ࡞੒ • ൃߦ͞ΕͨΫΤϦΛར༻͢ΔͷͰɼWebΞϓϦʹґଘͤͣ൚༻తʹར༻Մೳ 10 1. ैདྷͷWebΞϓϦՔಈதͷΫΤϦΛ༻͍ͨख๏ σʔλϕʔε 8FCΞϓϦ ΫΤϦ

    ϗϫΠτϦετ 8FCΞϓϦՔಇத )551ϦΫΤετ
  11. • WebΞϓϦՔಇޙɼଈ࣌ʹෆਖ਼ΫΤϦΛݕ஌Ͱ͖ͳ͍ • ΫΤϦΛऩूͯ͠ϗϫΠτϦετ͕࡞੒͞Εͨޙʹݕ஌Λߦ͏ • ΫΤϦͷऩूظؒத͸ෆਖ਼ΫΤϦͷݕ஌Λߦ͑ͳ͍ • WebαʔϏεͷվमස౓͸ߴ͘ɼෆਖ਼ΫΤϦΛݕ஌Ͱ͖ͳ͍ظ͕ؒଟൃ͢Δ • ϗϫΠτϦετͷ࡞੒͸WebΞϓϦՔಈલʹߦ͏ඞཁ͕͋Δ

    11 1. ैདྷͷWebΞϓϦՔಈதͷΫΤϦΛ༻͍ͨख๏ͷ՝୊
  12. • WebΞϓϦͷιʔείʔυதͷSQLΛ૊ΈཱͯΔॲཧͷղੳΛߦ͍ɼൃߦ͞ ΕΔΫΤϦύλʔϯΛྻڍ͠ɼϗϫΠτϦετʹొ࿥͢Δ • ιʔείʔυΛར༻͢ΔͷͰɼWebΞϓϦՔಇલʹϗϫΠτϦετΛ࡞੒Ͱ ͖Δ 12 2. ैདྷͷιʔείʔυղੳΛ༻͍ͨख๏ ղੳث

    ιʔείʔυ ϗϫΠτϦετ 8FCΞϓϦՔಈલ
  13. • ιʔείʔυͷղੳ͕࣮૷ʹґଘͨ͠ํ๏ͷͨΊɼෳ਺ͷWebΞϓϦͰ൚༻ తʹར༻Ͱ͖ͳ͍ • WebΞϓϦͷ࣮૷ʹ༷ʑͳݴޠ΍ORM͕ར༻͞ΕΔ৔߹ɼղੳثͷ
 ࣮૷͕ଟذʹΘͨΔ • WebΞϓϦͷ࣮૷ʹґଘ͠ͳ͍ํ๏͕ඞཁ 13 2.

    ैདྷͷιʔείʔυղੳΛ༻͍ͨख๏ͷ՝୊
  14. 3. ఏҊख๏

  15. • WebΞϓϦέʔγϣϯςετΛ༻͍ͨΫΤϦͷϗϫΠτϦετࣗಈ࡞੒ख๏ • ࣗಈςετΛ༻͍ͨ։ൃϓϩηεʹϗϫΠτϦετ࡞੒Λ૊ΈࠐΉ • WebΞϓϦͷൃߦΫΤϦͷมԽʹ௥ै • WebΞϓϦՔಈલʹϗϫΠτϦετ࡞੒ • σʔλϕʔεϓϩΩγͰΫΤϦΛऩू͠ɼϗϫΠτϦετ࡞੒

    • WebΞϓϦͷ࣮૷ʹґଘ͠ͳ͍ 15 ఏҊख๏֓ཁ
  16. 16 ఏҊख๏͕લఏͱ͢ΔࣗಈςετΛ༻͍ͨ։ൃϓϩηε ։ൃ ςετίʔυهड़ αʔόʹ഑ஔ ࣗಈςετ /P :FT Քಇ։࢝ ςετ੒ޭ

    w ৽ػೳͷ௥Ճ w طଘػೳͷमਖ਼ w 8FCΞϓϦͷಈ࡞खॱͱಈ࡞ͷ݁ՌΛهड़ w ςετίʔυΛݩʹࣗಈͰςετΛ࣮ߦ w 8FCΞϓϦͷಈ࡞͕࢓༷௨Γ͔Λ֬ೝ w ςετࣦഊɿ8FCΞϓϦͷιʔείʔυ΋͘͠͸ ςετίʔυʹ໰୊͋Γ w ςετ੒ޭɿ8FCΞϓϦ͕࢓༷௨Γʹಈ࡞ w 8FCΞϓϦͷιʔείʔυΛαʔόʹ഑ஔ w 8FCΞϓϦΛՔಇ
  17. 17 ։ൃ ςετίʔυهड़ αʔόʹ഑ஔ ࣗಈςετ ʴ ϗϫΠτϦετ࡞੒ /P :FT Քಇ։࢝

    ςετ੒ޭ w ςετ࣌ʹൃߦ͞ΕͨΫΤϦ͔ΒϗϫΠτϦετΛ
 ࡞੒ w ҎԼΛͦΕͧΕαʔόʹ഑ஔ w 8FCΞϓϦͷιʔείʔυ w ϗϫΠτϦετ ։ൃϓϩηεʹ͓͚ΔఏҊख๏ͷҐஔ෇͚ w 8FCΞϓϦ͕Քಇ͢ΔલʹϗϫΠτϦετΛ࡞੒Մೳ w 8FCΞϓϦͷൃߦΫΤϦͷมԽʹ௥ैͯ͠ɼϗϫΠτ ϦετΛߋ৽Ͱ͖Δ
  18. • ΫΤϦͷϦςϥϧ஋ΛϓϨʔεϗϧμʹஔ͖׵͑ͨΫΤϦߏ଄Λొ࿥ • ൃߦ͞ΕͨΫΤϦͷΫΤϦߏ଄ͷҧ͍Λݕ஌ 18 ϗϫΠτϦετͷొ࿥಺༰ ΫΤϦɿ4&-&$5 '30.VTFST8)&3&JE ΫΤϦߏ଄ɿ4&-&$5 '30.VTFST8)&3&JEʁ

    ϗϫΠτϦετ
  19. 19 ఏҊख๏ͷઃܭ • σʔλϕʔεͷલஈʹσʔλϕʔεϓϩΩγΛ഑ஔ • ςετ࣮ߦதʹൃߦ͞ΕͨΫΤϦΛऩू • WebΞϓϦͷ࣮૷ʹґଘ͠ͳ͍ ςετ࣮ߦத σʔλϕʔε

    8FCΞϓϦ σʔλϕʔεϓϩΩγ ϗϫΠτϦετ ΫΤϦΛऩू͠ΫΤϦߏ଄΁ม׵ ग़ྗ ΫΤϦ ΫΤϦ
  20. 20 ఏҊख๏ͷઃܭ • WebΞϓϦՔಇத͸ൃߦΫΤϦͱϗϫΠτϦετΛর߹͠ɼෆਖ਼ΫΤϦΛݕ஌ • র߹ॲཧʹΑͬͯɼWebΞϓϦͱσʔλϕʔεؒʹಈ࡞ͷ஗Ԇ͕ൃੜ • ΫΤϦߏ଄ΛΩʔͱͨ͠ϋογϡςʔϒϧͱͯ͠ϗϫΠτϦετΛදݱ • ϦετͷΤϯτϦ਺ʹґଘͤͣɼߴ଎ʹর߹ॲཧ͕Մೳ

    σʔλϕʔε 8FCΞϓϦ σʔλϕʔεϓϩΩγ 8FCΞϓϦՔಇத ΫΤϦ ΫΤϦ ΫΤϦͱϗϫΠτϦετΛর߹ͯ͠ݕ஌ ෆਖ਼ΫΤϦ ग़ྗ ϗϫΠτϦετ
  21. 4. ධՁ

  22. • ςετ޻ఔʹϗϫΠτϦετͷ࡞੒Λ૊ΈࠐΜͩ • ϗϫΠτϦετΛ࡞੒͢Δ͜ͱͷӡ༻ͷෛՙΛഉআ • ϗϫΠτϦετΛൃߦΫΤϦͷมԽʹ௥ैͯ͠ߋ৽͢Δ͜ͱͷӡ༻ͷෛՙΛ ഉআ 22 ӡ༻΁ͷෛՙͷධՁ

  23. • ϗϫΠτϦετͷর߹଎౓ͷධՁ • ΫΤϦߏ଄ΛΩʔͱͨ͠ϋογϡςʔϒϧͱͯ͠ϗϫΠτϦετΛදݱ͢Δ ͜ͱʹΑΓɼΤϯτϦ਺ʹґଘͤͣߴ଎ʹর߹Ͱ͖Δ • ςετ࣌ͷΫΤϦ͔Β࡞੒ͨ͠ϗϫΠτϦετͷݕ஌ਫ਼౓ͷධՁ 23 ࣮ӡ༻্ͷධՁ఺

  24. 24 ݕ஌ਫ਼౓ͷධՁɿݕ஌ਫ਼౓ͷධՁࢦඪ 'BMTFOFHBUJWF 5SVFQPTJUJWF 5SVFOFHBUJWF ෆਖ਼ͳΫΤϦΛෆਖ਼ͱ൑அͰ͖ͳׂ͔ͬͨ߹ 'BMTFQPTJUJWF ਖ਼ৗͳΫΤϦΛਖ਼ৗͱ൑அͰ͖ͳׂ͔ͬͨ߹ ਖ਼ৗͳΫΤϦΛਖ਼ৗͱ൑அׂͨ͠߹ ෆਖ਼ͳΫΤϦΛෆਖ਼ͱ൑அͰׂ͖ͨ߹

  25. 25 ݕ஌ਫ਼౓ͷධՁɿఏҊख๏ͷݕ஌ਫ਼౓ͷ༧૝ 'BMTFOFHBUJWF 5SVFQPTJUJWF 5SVFOFHBUJWF 'BMTFQPTJUJWF ςετ࣌ʹൃߦ͞ΕͨΫΤϦ ςετ࣌ʹൃߦ͞Εͳ͍ΫΤϦ ʢ8FCΞϓϦ͸ൃߦ͢Δʣ ςετ࣌ͷΈൃߦ͞ΕΔΫΤϦ

    ʢ8FCΞϓϦ͸ൃߦ͠ͳ͍ʣ ݕ஌ਫ਼౓ͷධՁͱͯ͠ɼ'BMTFQPTJUJWFͱ'BMTFOFHBUJWFΛܭଌͨ͠
  26. 26 ݕ஌ਫ਼౓ͷධՁɿ࣮ݧ؀ڥ "QQ 1SPYZ42- .Z42- BSUJDMFςʔϒϧͷૢ࡞Λߦ͏ϝιουΛ࣮૷͠ɼςετΛهड़ )551 63- ૢ࡞಺༰ (&5

    BSUJDMFT શͯͷBSUJDMFΛදࣔ (&5 BSUJDMFT UJUMFlz UJUMFͰݕࡧͯ͠BSUJDMFΛදࣔ ʢ42-ΠϯδΣΫγϣϯͷ੬ऑੑ͋Γʣ 1045 BSUJDMFT BSUJDMFΛͭ࡞੒ (&5 BSUJDMFTJE ಛఆͷBSUJDMFΛදࣔ 1"5$) BSUJDMFTJE BSUJDMFΛߋ৽ %&-&5& BSUJDMFTJE BSUJDMFΛ࡟আ UJUMFͱDPOUFOUΧϥϜΛ࣋ͬͨ
 BSUJDMFςʔϒϧΛ࡞੒ ςετ࣌ʹൃߦ͞ΕͨΫΤϦΛऩू͠ɼΫΤϦߏ଄ʹม׵ͯ͠ ϗϫΠτϦετΛ࡞੒ ProxySQL: https://proxysql.com/
  27. • ਖ਼ৗͳΫΤϦσʔλ • WebΞϓϦʹϒϥ΢β͔ΒखಈͰHTTPϦΫΤετΛૹΓɼͦͷաఔͰൃߦ ͞ΕͨΫΤϦΛऔಘʢΫΤϦ਺ɿ17ʣ • ෆਖ਼ͳΫΤϦσʔλ • sqlmapΛ༻͍ͯSQLΠϯδΣΫγϣϯ߈ܸΛWebΞϓϦͷݕࡧϑΥʔϜʹ ߦ͍ɼͦͷաఔͰൃߦ͞ΕͨΫΤϦΛऔಘʢΫΤϦ਺ɿ265ʣ

    • ͜ΕΒΛϗϫΠτϦετͱর߹ͯ͠False positiveͱFalse negativeΛࢉग़ 27 ݕ஌ਫ਼౓ͷධՁɿ࣮ݧํ๏ Sqlmap: http://sqlmap.org/
  28. • False positiveɿ17.65%ɼFalse negativeɿ0% • ਖ਼ৗͳΫΤϦͷҰ෦Λޡݕ஌ • SQLΠϯδΣΫγϣϯ߈ܸʹΑΓൃੜͨ͠ෆਖ਼ΫΤϦΛશͯݕ஌ 28 ݕ஌ਫ਼౓ͷධՁɿ࣮ݧ݁Ռ

  29. • શͯͷ࣮૷ϝιουʹରͯ͠ςετΛهड़͕ͨ͠ɼFalse positive͸ൃੜ • ςετέʔεʹΑͬͯ͸ൃߦ͞Εͳ͍ΫΤϦ͕ଘࡏ͠ɼϗϫΠτϦετʹ
 ࿙Ε͕ੜ͡Δ • େن໛ͳWebΞϓϦͰ͸ɼൃߦΫΤϦ਺͕૿Ճ͢ΔͨΊɼޡݕ஌͞ΕΔ
 ΫΤϦ਺΋૿େ •

    ϗϫΠτϦετʹෆ଍͍ͯ͠ΔΫΤϦΛิ׬͢Δํ๏͕ඞཁ 29 False postiveͷߟ࡯
  30. 5. ·ͱΊͱࠓޙͷ՝୊

  31. • WebΞϓϦέʔγϣϯςετΛ༻͍ͨΫΤϦͷϗϫΠτϦετࣗಈ࡞੒ख๏ ΛఏҊͨ͠ • WebΞϓϦͷൃߦΫΤϦͷมߋʹ௥ैͰ͖Δ • WebΞϓϦՔಇޙɼଈ࣌ʹෆਖ਼ΫΤϦΛݕ஌Ͱ͖Δ • WebΞϓϦͷ࣮૷ʹґଘͤͣɼ൚༻తʹར༻Ͱ͖Δ •

    SQLΠϯδΣΫγϣϯ߈ܸʹΑΔෆਖ਼ΫΤϦΛશͯݕ஌Ͱ͖Δ͜ͱΛ֬ೝ • ਖ਼ৗͳΫΤϦͷҰ෦Λޡݕ஌͢Δ͜ͱΛ֬ೝ 31 ·ͱΊ
  32. • False positiveͷܰݮ • ϗϫΠτϦετʹෆ଍͍ͯ͠ΔΫΤϦΛิ׬͢Δํ๏ͷݕ౼ • False negativeͷՄೳੑΛഉআ • ϗϫΠτϦετʹؚ·ΕΔςετ࣌ͷΈൃߦ͞ΕΔΫΤϦ΁ͷରॲํ๏ͷ


    ݕ౼ • େن໛ͳWebΞϓϦέʔγϣϯʹ͓͚Δݕ஌ਫ਼౓΍ɼWebΞϓϦͱσʔλ ϕʔεؒͷϨΠςϯγʔͷධՁ 32 ࠓޙͷ՝୊