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

Ec3fcf78fa2ad21dcc48478df80e0dc4?s=47 Komei Nomura
September 19, 2018

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

FIT2018 第17回技術科学技術フォーラム

Ec3fcf78fa2ad21dcc48478df80e0dc4?s=128

Komei Nomura

September 19, 2018
Tweet

Transcript

  1. ໺ଜ޸໋, ྗ෢݈࣍*, দຊ྄հ / ϖύϘݚڀॴ / *ྗ෢݈ٕ࣍ज़࢜ࣄ຿ॴ 2018.09.19 FIT2018 ୈ17ճ৘ใՊֶٕज़ϑΥʔϥϜ

    WebΞϓϦέʔγϣϯςετΛ༻͍ͨ
 SQLΫΤϦͷϗϫΠτϦετࣗಈ࡞੒ख๏
  2. 1. ݚڀͷഎܠͱ໨త 2. ैདྷͷϗϫΠτϦετࣗಈ࡞੒ͷ՝୊ 3. ఏҊख๏ 4. ࣮ݧ 5. ·ͱΊͱࠓޙͷ՝୊

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

  4. • WebΞϓϦέʔγϣϯʢWebΞϓϦʣͷ੬ऑੑΛར༻ͨ͠߈ܸ͕ޙΛઈͨͳ͍ • WebαʔϏε͕อ༗͢Δػີ৘ใ͕࿙Ӯ͢Δඃ֐͕ൃੜ • WebΞϓϦ͕ར༻͢Δσʔλϕʔεʹෆਖ਼ΫΤϦΛൃߦͯ͠ߦΘΕΔ • ෆਖ਼ΫΤϦͱ͸ɼ੬ऑੑ߈ܸʹΑͬͯੜ͡Δ։ൃऀͷ૝ఆ֎ͷΫΤϦ • ෆਖ਼ΫΤϦΛݕ஌͢Δରࡦ͕ඞཁ

    4 ݚڀͷഎܠ
  5. • WebΞϓϦ͕ൃߦ͢ΔΫΤϦͷϗϫΠτϦετΛखಈͰ࡞੒ͯ͠ݕ஌ • େن໛ͳWebΞϓϦͰ͸ൃߦ͞ΕΔΫΤϦ͕๲େͰɼશͯͷΫΤϦΛ೺Ѳ ͸ࠔ೉ • WebΞϓϦͷվमʹΑͬͯൃߦ͞ΕΔΫΤϦ͕มԽ͠ɼϗϫΠτϦετͷ ߋ৽͕ඞཁ • ӡ༻ऀ΁ͷෛ୲͕େ͖͍

    5 ैདྷͷෆਖ਼ΫΤϦݕ஌ํ๏
  6. • WebΞϓϦՔಇ࣌ʹൃߦ͞ΕΔΫΤϦΛ༻͍ͯ࡞੒͢Δख๏ • WebΞϓϦՔಇޙɼଈ࣌ʹෆਖ਼ΫΤϦΛݕ஌Ͱ͖ͳ͍ • WebΞϓϦͷιʔείʔυΛղੳͯ͠࡞੒͢Δख๏ • WebΞϓϦͷ࣮૷ʹґଘ͢ΔͨΊɼ൚༻తʹར༻Ͱ͖ͳ͍ 6 ैདྷͷϗϫΠτϦετࣗಈ࡞੒ख๏

  7. • ҎԼͷཁ݅Λຬͨ͢ෆਖ਼ΫΤϦରࡦ • WebΞϓϦՔಈޙɼଈ࣌ʹෆਖ਼ΫΤϦΛݕ஌Ͱ͖Δ • WebΞϓϦͷ࣮૷ʹґଘ͠ͳ͍ • ෆਖ਼ΫΤϦରࡦಋೖ࣌ͷ։ൃ΍ӡ༻΁ͷӨڹ͕খ͍͞ 7 ݚڀͷ໨త

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

  9. • WebΞϓϦՔಈதʹൃߦ͞ΕͨΫΤϦΛऩू͠ɼΫΤϦߏ଄ʹͯ͠ొ࿥ • ΫΤϦߏ଄ͱ͸ΫΤϦͷϦςϥϧ஋ΛϓϨʔεϗϧμʔʹஔ͖׵͑ͨ΋ͷ 9 WebΞϓϦՔಈதʹൃߦ͞ΕͨΫΤϦΛ༻͍ͨख๏ σʔλϕʔε 8FCΞϓϦ ΫΤϦ ϗϫΠτϦετ

    8FCΞϓϦՔಇ࣌ 4&-&$5 '30.VTFST8)&3&JE 4&-&$5 '30.VTFST8)&3&JE Ϧςϥϧ ΫΤϦߏ଄ͷྫ
  10. • ϝϦοτ • WebΞϓϦͷ࣮૷ʹґଘͤͣϗϫΠτϦετΛ࡞੒Մೳ • σϝϦοτ • ΫΤϦΛऩू͢Δظ͕ؒඞཁͱͳΓɼظؒத͸ෆਖ਼ΫΤϦΛݕ஌Ͱ͖ͳ͍ • WebαʔϏεͷվमස౓͸ߴ͘ɼݕ஌Ͱ͖ͳ͍ظ͕ؒଟൃ

    • ϗϫΠτϦετͷ࡞੒͸WebΞϓϦՔಈલʹߦ͏ඞཁ͕͋Δ 10 WebΞϓϦՔಈதʹൃߦ͞ΕͨΫΤϦΛ༻͍ͨख๏
  11. • ιʔείʔυதͷSQLΛ૊ΈཱͯΔॲཧΛղੳ͠ɼൃߦ͞ΕΔΫΤϦύλʔϯ Λྻڍ • ྻڍ͞ΕͨΫΤϦύλʔϯΛϗϫΠτϦετʹొ࿥ 11 ιʔείʔυղੳΛ༻͍ͨख๏ ղੳث ιʔείʔυ ϗϫΠτϦετ

    8FCΞϓϦՔಈલ
  12. • ϝϦοτ • WebΞϓϦՔಈޙɼଈ࣌ʹෆਖ਼ΫΤϦͷݕ஌͕Մೳ • σϝϦοτ • ࣮૷ґଘͳํ๏ͷͨΊɼෳ਺ͷWebΞϓϦͰ൚༻తʹར༻ෆՄ • WebΞϓϦͷ࣮૷ʹ༷ʑͳݴޠ΍ORM*͕ར༻͞ΕΔ৔߹ɼղੳثͷ


    ࣮૷͕ଟذʹΘͨΔ • WebΞϓϦͷ࣮૷ʹґଘ͠ͳ͍ํ๏͕ඞཁ 12 ιʔείʔυղੳΛ༻͍ͨख๏ͷϝϦοτɾσϝϦοτ *Scott W. Ambler, Mapping objects to relational databases What you need to know and why Ronin International, July 2000
  13. 3. ఏҊख๏

  14. • WebΞϓϦέʔγϣϯςετΛ༻͍ͨΫΤϦͷϗϫΠτϦετࣗಈ࡞੒ख๏ • ࣗಈςετΛ༻͍ͨ։ൃϓϩηεʹϗϫΠτϦετ࡞੒Λ૊ΈࠐΉ • ։ൃϓϩηεͷมߋͤͣɼWebΞϓϦՔಈલʹϗϫΠτϦετ࡞੒Մೳ • σʔλϕʔεϓϩΩγͰΫΤϦΛऩू͠ɼϗϫΠτϦετ࡞੒ • WebΞϓϦͷ࣮૷ʹґଘ͠ͳ͍

    14 ఏҊख๏֓ཁ
  15. 15 ࣗಈςετΛ༻͍ͨ։ൃϓϩηε ։ൃ ςετίʔυهड़ αʔόʹ഑ஔ ࣗಈςετ /P :FT ӡ༻։࢝ ςετ੒ޭ

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

    ςετ੒ޭ w ςετ࣌ʹൃߦ͞ΕͨΫΤϦ͔ΒϗϫΠτϦετΛࣗ ಈ࡞੒ w ҎԼΛͦΕͧΕαʔόʹ഑ஔ w ৽͍͠8FCΞϓϦͷιʔείʔυ w ৽͍͠8FCΞϓϦͷΫΤϦͷϗϫΠτϦετ ։ൃϓϩηεʹ͓͚ΔఏҊख๏ͷҐஔ෇͚ w ։ൃϓϩηεͷมߋ͕ͳ͍ w ӡ༻։࢝࣌ʹ͸ෆਖ਼ΫΤϦΛݕ஌Ͱ͖Δঢ়ଶ
  17. • ΫΤϦͷϦςϥϧΛϓϨʔεϗϧμʹஔ͖׵͑ͨΫΤϦߏ଄Λొ࿥ • ΫΤϦߏ଄͕ҟͳΔ΋ͷΛݕ஌Ͱ͖Δ 17 ϗϫΠτϦετͷొ࿥಺༰ 4&-&$5 '30.VTFST8)&3&JE 4&-&$5 '30.VTFST8)&3&JE

    ϗϫΠτϦετ ςετ࣌ʹൃߦ͞ΕͨΫΤϦɿ ΫΤϦߏ଄ɿ
  18. 18 ϗϫΠτϦετͷݕ஌ಛੑ ςετ࣌ʹൃ ߦ͞Εͳ͍
 ΫΤϦ શͯͷΫΤϦ ςετ࣌ʹൃߦ͞ΕΔ
 ΫΤϦ ʢϗϫΠτϦετʹొ࿥ʣ 8FCΞϓϦέʔγϣϯ͕ൃߦ͢ΔΫΤϦ

    ςετ࣌ͷΈൃߦ͞ΕΔ ΫΤϦ ʢϗϫΠτϦετʹొ࿥ʣ ෆਖ਼ΫΤϦ • ఏҊख๏͸ςετ࣌ʹൃߦ͞ΕͨΫΤϦΛϗϫΠτϦετʹొ࿥ • ςετ࣌ʹൃߦ͞Εͳ͍ΫΤϦͱෆਖ਼ΫΤϦΛݕ஌ • ͨͩ͠ɼෆਖ਼ΫΤϦͷ಺ɼςετ࣌ͷΈൃߦ͞ΕΔΫΤϦ͸ݕ஌͞Εͳ͍ ΫΤϦͷ಺แؔ܎ਤ
  19. 19 ςετ௥ՃʹΑΔݕ஌ྖҬͷมԽ ςετΛ௥Ճ͢Δ͜ͱʹΑͬͯɼςετ͞Ε͍ͯΔΫΤϦྖҬΛ֦େͰ͖ɼ 8FCΞϓϦ͕ൃߦ͢ΔΫΤϦͷޡݕ஌Λ௿ݮͰ͖Δ ςετ ࣌ʹൃ ߦ͞Ε ͳ͍Ϋ ΤϦ શͯͷΫΤϦ

    ςετ࣌ʹൃߦ͞ΕΔ
 ΫΤϦ ʢϗϫΠτϦετʹొ࿥ʣ 8FCΞϓϦέʔγϣϯ͕ൃߦ͢ΔΫΤϦ ςετ࣌ͷΈൃߦ͞ΕΔ ΫΤϦ ʢϗϫΠτϦετʹొ࿥ʣ ෆਖ਼ΫΤϦ ςετ࣌ʹൃߦ ͞Εͳ͍
 ΫΤϦ શͯͷΫΤϦ ςετ࣌ʹൃߦ͞ΕΔ
 ΫΤϦ ʢϗϫΠτϦετʹొ࿥ʣ 8FCΞϓϦέʔγϣϯ͕ൃߦ͢ΔΫΤϦ ςετ࣌ͷΈൃߦ͞ΕΔ ΫΤϦ ʢϗϫΠτϦετʹొ࿥ʣ ෆਖ਼ΫΤϦ ֦େ
  20. 20 ఏҊख๏ͷઃܭ σʔλϕʔε σʔλϕʔε
 ϓϩΩγ 8FCΞϓϦ ϗϫΠτϦετ • σʔλϕʔεͷલஈʹσʔλϕʔεϓϩΩγΛ഑ஔ •

    ςετ࣮ߦத͸ΫΤϦΛऩूͯ͠ϗϫΠτϦετ࡞੒ • WebΞϓϦՔಈத͸ൃߦ͞ΕͨΫΤϦͱϗϫΠτϦετͷর߹͠ɼ
 ෆਖ਼ΫΤϦΛݕ஌
  21. 4. ࣮ݧ

  22. 22 ࣮ݧ؀ڥ "QQ 1SPYZ42- .Z42- w BSUJDMFςʔϒϧͷૢ࡞Λߦ͏ϝιουΛ࣮૷ w ͦΕͧΕͷϝιουͷςετΛهड़ )551

    63- ૢ࡞಺༰ (&5 BSUJDMFT શͯͷBSUJDMFΛදࣔ (&5 BSUJDMFT UJUMFlz UJUMFͰݕࡧͯ͠BSUJDMFΛදࣔ ʢ42-ΠϯδΣΫγϣϯͷ੬ऑੑ͋Γʣ 1045 BSUJDMFT BSUJDMFΛͭ࡞੒ (&5 BSUJDMFTJE ಛఆͷBSUJDMFΛදࣔ 1"5$) BSUJDMFTJE BSUJDMFΛߋ৽ %&-&5& BSUJDMFTJE BSUJDMFΛ࡟আ BSUJDMF w UJUMF w DPOUFOU w BSUJDMFςʔϒϧʹUJUMFͱDPOUFOU
  23. 23 ࣮ݧ؀ڥ "QQ 1SPYZ42- .Z42- ProxySQL: https://proxysql.com/ • σʔλϕʔεϓϩΩγʹ͸ProxySQLΛ࠾༻ •

    ProxySQL͸App͕ൃߦͨ͠ΫΤϦΛऩू͠ɼΫΤϦߏ଄ʹม׵͠อଘ • ςετதʹProxySQLͰऩूͨ͠ΫΤϦߏ଄͔ΒϗϫΠτϦετΛ࡞੒
  24. • ਖ਼ৗͳΫΤϦΛෆਖ਼ͱ൑அׂͨ͠߹ʢFalse positiveʣΛܭଌ • WebΞϓϦʹϒϥ΢β͔ΒखಈͰHTTPϦΫΤετΛૹΓɼͦͷաఔͰൃߦ ͞ΕͨΫΤϦΛऔಘʢΫΤϦछྨ਺ɿ17ʣ • ෆਖ਼ͳΫΤϦΛෆਖ਼ͱ൑அͰ͖ͳׂ͔ͬͨ߹ʢFalse negativeʣΛܭଌ •

    sqlmapΛ༻͍ͯSQLΠϯδΣΫγϣϯ߈ܸΛWebΞϓϦͷݕࡧϑΥʔϜʹ ߦ͍ɼͦͷաఔͰൃߦ͞ΕͨΫΤϦΛऔಘʢΫΤϦछྨ਺ɿ265ʣ 24 ࣮ݧ಺༰ Sqlmap: http://sqlmap.org/
  25. • False positiveɿ17.65%ɼFalse negativeɿ0% • SQLΠϯδΣΫγϣϯ߈ܸʹΑΓൃੜͨ͠ෆਖ਼ΫΤϦΛશͯݕ஌ • ਖ਼ৗͳΫΤϦͷҰ෦Λޡݕ஌ 25 ࣮ݧ݁Ռ

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

    26 False postiveͷߟ࡯
  27. • SQLΠϯδΣΫγϣϯ߈ܸʹΑͬͯൃੜͨ͠શͯͷෆਖ਼ΫΤϦΛݕ஌Ͱ͖ͨɹɹɹɹ • ϗϫΠτϦετʹ͸ςετ࣌ͷΈൃߦ͞ΕΔΫΤϦؚ͕·ΕɼFalse negative ͕ൃੜ͢ΔՄೳੑ͕͋Δ • SQLΠϯδΣΫγϣϯ͸ɼWebΞϓϦ͕ൃߦ͢ΔΫΤϦʹ೚ҙͷSQLจΛ
 ஫ೖ͢Δ •

    ߈ܸʹΑͬͯੜ͡ΔΫΤϦͱςετ࣌ͷΈൃߦ͞ΕΔΫΤϦͷߏ଄͕Ұக͢ Δ͜ͱ͸গͳ͍ 27 False negativeͷߟ࡯
  28. 5. ·ͱΊͱࠓޙͷ՝୊

  29. • WebΞϓϦέʔγϣϯςετΛ༻͍ͨΫΤϦͷϗϫΠτϦετࣗಈ࡞੒ख๏ ΛఏҊ • ఏҊख๏͸։ൃϓϩηεͷมߋͳ͘ɼWebΞϓϦՔಈલʹϗϫΠτϦετ ࡞੒Մೳ • ࣮ݧ݁Ռ͔ΒɼSQLΠϯδΣΫγϣϯ߈ܸʹΑͬͯൃߦ͞ΕΔෆਖ਼ΫΤϦΛ
 ݕ஌Ͱ͖Δ͜ͱΛ֬ೝ •

    WebΞϓϦ͕ൃߦ͢ΔΫΤϦͷҰ෦Λޡݕ஌͢Δ͜ͱΛ֬ೝ 29 ·ͱΊ
  30. • ϗϫΠτϦετʹෆ଍͍ͯ͠ΔΫΤϦΛิ׬͢Δํ๏ͷݕ౼ • False positiveͷܰݮ • ϗϫΠτϦετʹؚ·ΕΔςετ࣌ͷΈൃߦ͞ΕΔΫΤϦ΁ͷରॲํ๏ͷݕ౼ • False negativeͷՄೳੑΛഉআ

    30 ࠓޙͷ՝୊