バーチー @hypermkt 2019.12.01 PHPカンファレンス https://phpcon.php.gr.jp/2019/
脆弱性から学ぶ Webセキュリティ Part1 はこちら https://speakerdeck.com/hypermkt/study-web-security-from-vulnerability1
੬ऑੑ͔ΒֶͿWebηΩϡϦςΟPart 2όʔνʔ @hypermkt2019.12.01 PHPΧϯϑΝϨϯε1
View Slide
ࣗݾհ• όʔνʔ / @hypermkt• ιϑτΣΞΤϯδχΞ• [‘PHPer’, ‘Laravel’, ‘Vue.js’]• https://blog.hypermkt.jp/2
2019/11/18ൃച Software Design 201912݄߸ʹॳدߘ͠·ͨ͠!!!3
͡Ίʹ
ຊτʔΫ͕ఏڙ͢Δ͜ͱ• ΤϯδχΞ͕WebηΩϡϦςΟΛֶͿඞཁੑ• ੬ऑੑͷ֓ཁͱରࡦ5
ຊτʔΫ͕ఏڙ͠ͳ͍͜ͱ• ֎෦੬ऑੑஅ੬ऑੑݕπʔϧʹ͍ͭͯ• ιϑτΣΞɾΠϯϑϥͷ੬ऑੑରࡦ6
ຊτʔΫͷରऀ• WebΞϓϦέʔγϣϯΤϯδχΞ(αʔόʔαΠυ)• ॳ৺ऀʙதڃऀ• WebηΩϡϦςΟʹڵຯ͕͋Δ• αʔϏεɾγεςϜΛकΓ͍ͨํ7
օ͞Μʹ࣋ͪؼͬͯཉ͍͠ͷ• ੬ऑੑͷո͍͍͠8
࣍1. ΤϯδχΞ͕WebηΩϡϦςΟΛֶͿඞཁੑ2. ੬ऑੑ͔ΒֶͿWebηΩϡϦςΟ3. ࢀߟɾҾ༻ࢿྉ4. ·ͱΊ9
Part 2…?
੬ऑੑ͔ΒֶͿWebηΩϡϦςΟ in PHPΧϯϑΝϨϯεԭೄ201911IUUQTTQFBLFSEFDLDPNIZQFSNLUTUVEZXFCTFDVSJUZGSPNWVMOFSBCJMJUZPart 1 ※ ͋ͱ͚ͮ!!
PHPΧϯϑΝϨϯεԭೄ2019Ͱ• SQLΠϯδΣΫγϣϯ• ΫϩεαΠτɾεΫϦϓςΟϯά• CSRF• ʹ͍͓ͭͯ͠·ͨ͠!12
ΤϯδχΞ͕WebηΩϡϦςΟΛֶͿඞཁੑ
զʑͷγεςϜɾαʔϏε ৗʹૂΘΕ͍ͯΔ
ۙʹXSS੬ऑੑ͕ٸ૿15ग़య*1" ใॲཧػߏ ιϑτΣΞͷ੬ऑੑؔ࿈ใʹؔ͢Δಧग़ঢ়گ<ୈ࢛ظʢ݄ʙ݄ʣ> IUUQTXXXJQBHPKQpMFTQEG
੬ऑੑͷڴҖ• ݸਓใͷӾཡ• WebαΠτͷվ͟Μ• Πϧεײછ• ผͷར༻ऀͷͳΓ͢·͠• WebαΠτΛར༻ෆՄʹ͢Δ• ϨϐϡςʔγϣϯϦεΫ(اۀʹର͢ΔϚΠφεධՁʣ• ܦࡁతଛࣦ16
੬ऑੑͱ
ιϑτΣΞγεςϜΛѱ༻Ͱ͖Δόά੬ऑੑͱ
ιϑτΣΞγεςϜΛѱ༻Ͱ͖Δόά੬ऑੑͱͭ·Γզʑ։ൃऀʹ࡞ΒΕ͍ͯΔ
ͳͥ։ൃऀ੬ऑੑΛ࡞ͬͯ͠·͏ͷ͔ʁ20
ͳͥ։ൃऀ੬ऑੑΛ࡞ͬͯ͠·͏ͷ͔ʁ• ੬ऑੑʹؔ͢Δࣝෆ• ΞϓϦέʔγϣϯઃܭෆ21
Ͳ͏ͨ͠Β ҆શͳΞϓϦέʔγϣϯͷ։ൃ͕Ͱ͖Δ͔
੬ऑੑͷ֓ཁɾڴҖɾରࡦʹ͍ͭͯΔ͜ͱ
੬ऑੑʹ͍ͭͯΔ͜ͱͰɺ҆શͳWebΞϓϦέʔγϣϯ։ൃ͕Ͱ͖ΔΑ͏ʹͳΔ
ҰॹʹWebηΩϡϦςΟΛֶΜͰ͍͖·͠ΐ͏!
੬ऑੑ͔ΒֶͿWebηΩϡϦςΟ
ੈͷதʹ༷ʑͳ੬ऑੑ͕͋Δ• SQLΠϯδΣΫγϣϯ• ΫϩεαΠτεΫϦϓςΟϯά• CSRF• σΟϨΫτϦτϥόʔαϧ• OSίϚϯυɾΠϯδΣΫγϣϯ• ηογϣϯཧͷෆඋ• HTTP/ϝʔϧϔομʔΠϯδΣΫγϣϯ• ΞΫηε੍ޚೝՄ੍ޚͷܽམ• ͳͲ27
ࠓҎԼ3Λղઆ͠·͢• SQLΠϯδΣΫγϣϯ• ΫϩεαΠτεΫϦϓςΟϯά• CSRF• σΟϨΫτϦτϥόʔαϧ• OSίϚϯυɾΠϯδΣΫγϣϯ• ηογϣϯཧͷෆඋ• HTTP/ϝʔϧϔομʔΠϯδΣΫγϣϯ• ΞΫηε੍ޚೝՄ੍ޚͷܽམ• ͳͲ28
੬ऑੑରࡦͷߏ͑
੬ऑੑͷରࡦํ๏̎௨Γ• ࠜຊతղܾ• อݥతରࡦ30
• ࠜຊతղܾ• ੬ऑੑΛ࡞Γࠐ·ͳ͍࣮Λ࣮ݱ͢Δํ๏• ੬ऑੑΛૂͬͨ߈ܸΛແޮԽ͢Δ• อݥతରࡦ• ੬ऑੑΛૂͬͨ߈ܸʹΑΔӨڹΛܰݮ͢Δํ๏• ੬ऑੑͷݪҼΛແ͘͢ͷͰͳ͍31
ͲͪΒΛબ͖͔͢ʁ
ঢ়گʹԠͯ͡அΛ͢Δ• جຊతʹࠜຊతղܾͰ੬ऑੑΛແޮԽ͢Δͷ͕ཧత• ୠ͠ӡ༻தͷΞϓϦέʔγϣϯʹ͓͍ͯɺ࣌ؒɾϦιʔεɾӨڹൣғ͔Β͙͢ʹࠜຊతղܾ͕࣮ࢪͰ͖ͳ͍߹ʹ อݥతରࡦఆରԠͱͯ͠༗ޮ33
͍͖ͬͯ·͠ΐ͏
σΟϨΫτϦɾτϥόʔαϧDirectory Traversal
σΟϨΫτϦɾτϥόʔαϧͱ• ϑΝΠϧ໊ͷࢦఆͷ࣮ʹ͕͋Δ߹ʹɺ ߈ܸऀʹҙͷϑΝΠϧ͕ࢦఆ͞Εɺ ॏཁͳϑΝΠϧ͕Ӿཡɾআ͞Εͯ͠·͏੬ऑੑ36੬ऑੑͷ͋ΔαΠτᶃෆਖ਼ϦΫΤετΛૹ৴8FCαʔόʔᶄॏཁϑΝΠϧ͕ Ӿཡ͞Εͯ͠·͏ pMFFUDQBTTXE߈ܸऀ
ڴҖ• ใ࿙͍͑• ॏཁͳϑΝΠϧ͕Ӿཡɾฤूɾআ͞ΕΔ37
ݪҼ• ϑΝΠϧ໊ͱͯ͠ઈରύεɾ૬ରύεͷܗͰ ҟͳΔσΟϨΫτϦΛࢦఆͰ͖Δ• ΈཱͯͨϑΝΠϧʹର͢ΔΞΫηεՄ൱ͷνΣοΫΛ͍ͯ͠ͳ͍38
39σΟϨΫτϦɾτϥόʔαϧྫೖྗύϥϝʔλʔΛͦͷ··͍ͯ͠Δ߈ܸྫӾཡͰ͖͍͚ͯͳ͍ϑΝΠϧ͕ ӾཡͰ͖͍ͯΔ!!
Ӿཡ͞ΕͨΒࠔΔϑΝΠϧɺͨ͘͞Μ͋Γ·͢ΑͶ….• /etc/hosts• /etc/passwd• wp-config.php• my.cnf• ϩάϑΝΠϧ• ͳͲͳͲ…40
ո͍͍͠• ֎෦ύϥϝʔλʔ͔ΒϑΝΠϧ໊Λ࣮͕͋͢Δͱո͍͠41
ࠜຊతղܾ• ֎෦͔ΒϑΝΠϧ໊Λࢦఆ͢Δ༷Λආ͚Δ• ྫʣ෦తʹϑΝΠϧ໊Λݻఆʹ͢Δ• ϑΝΠϧ໊ʹσΟϨΫτϦؚ໊͕·Εͳ͍Α͏ʹ͢Δ• ྫʣ42ϙΠϯτ!
อݥతରࡦ• ϑΝΠϧ໊Λӳࣈʹݶఆͯ͠ɺσΟϨΫτϦɾτϥόʔαϧʹ༻͍ΒΕΔه߸จࣈΛ༻ෆՄʹ͢Δ43ϙΠϯτ!
OSίϚϯυɾΠϯδΣΫγϣϯOS Command Injection
OSίϚϯυΠϯδΣΫγϣϯͱ• ֎෦͔Βͷ߈ܸʹΑΓɺαʔόʔͷOSίϚϯυ͕࣮ߦ͞Εͯ͠·͏45੬ऑੑͷ͋ΔαΠτᶃෆਖ਼ϦΫΤετΛૹ৴8FCαʔόʔᶄ04ίϚϯυ͕ ࣮ߦ͞ΕΔIPHF!IPHFDPNSNGVHBJNQPSUBOUpMF߈ܸऀ
ڴҖ• ใ࿙͍͑• ॏཁͳϑΝΠϧ͕Ӿཡɾฤूɾআ͞ΕΔ• WebαΠτΛར༻ෆՄʹ͢Δ• ผαʔόʔͷ߈ܸͷ౿Έʹ͞ΕΔ46
ݪҼ• OSͷγΣϧݺͼग़͕͠Ͱ͖Δؔʹɺෆਖ਼ͳίϚϯυ͕ೖ͞Εͯ͠·͏47
OSίϚϯυΠϯδΣΫγϣϯྫ• ݱࡏϑΝΠϧ͕༗ΔॴʹσΟϨΫτϦΛ࡞͢ΔϓϩάϥϜ͕͋Δ48ೖྗύϥϝʔλʔΛͦͷ··͍ͯ͠Δ!!
49ೖྗύϥϝʔλʔΛͦͷ··͍ͯ͠Δ!!• ෆਖ਼ͳೖྗྫɿ• ࣮ߦ͞ΕΔίϚϯυɿηϛίϩϯʮ;ʯ Λར༻ͯ͠LinuxίϚϯυΛ ࿈ଓ࣮ͯ͠ߦͤ͞ΔOFXEJSSNFUDIPTUTTZTUFN lNLEJSQWBSXXXBQQOFXEJSSNFUDIPTUTzຊʹϑΝΠϧ͕আ͞ΕΔ…
ةݥ͗͢Δ…
γΣϧݺͼग़͠ػೳ͕͋ΔPHPؔ• system• exec• passthru• shell_exec• popen51
ո͍͍͠• PHPͷγΣϧݺͼग़͕͠ՄೳͳؔΛ༻͍ͯ͠Δ52• system• exec• passthru• shell_exec• popen
ࠜຊతղܾᶃ• γΣϧݺͼग़͠ػೳͷ͋ΔPHPؔΛ༻͠ͳ͍• OSίϚϯυΛ࣮ߦ͠ͳ͍࣮ํ๏Λબ͢Δ• ྫʣOSίϚϯυͷ mail sendmail Λ༻ͤͣPHPͷmb_send_mailؔΛ༻͢Δ53
ࠜຊతղܾᶄ• OSίϚϯυʹ͢ύϥϝʔλʔΛΤεέʔϓ͢Δ͜ͱʹΑΓɺҰͭͷจࣈྻͱͯ͠ΛͤΔͷͰ҆શʹͳΔ• PHPͰɺescapeshellarg Λ༻͢Δ54
อݥతରࡦ• ύϥϝʔλʔͷݕূ• ҾΛݫີʹνΣοΫͯ͠ɺڐՄͨ͠ύϥϝʔλʔͷΈΛ௨͢55
ηογϣϯཧͷෆඋ
ηογϣϯཧͷෆඋͱ• ηογϣϯͷൃߦͱཧʹෆඋ͕͋߹ʹൃੜ͢Δ੬ऑੑ57
߈ܸྫ• ηογϣϯϋΠδϟοΫ• ηογϣϯIDͷݻఆԽ / ผ໊: Session Fixation58
ηογϣϯϋΠδϟοΫͱ• ηογϣϯIDΛԿΒ͔ͷํ๏Ͱ౪ΈɺଞਓʹͳΓ͢·͢͜ͱ59߈ܸऀ ར༻ऀ੬ऑੑͷ͋ΔαΠτᶃ߈ܸεΫϦϓτΛࠐΉᶄ੬ऑੑͷ͋ΔαΠτʹ ΞΫηε͢Δᶅηογϣϯ*%Λ౪Έग़͠ᶆΓ͢·͠ϩάΠϯ
ηογϣϯIDͷݻఆԽ߈ܸ• ߈ܸऀ͕औಘͨ͠ηογϣϯIDΛαΠτͷ੬ऑੑΛར༻ͯ͠ɺ Ϣʔβʔʹނҙʹઃఆͤ͞Δɻར༻ऀ͕ϩάΠϯ͢Δ͜ͱͰɺ ߈ܸऀͷͳΓ͢·͠Λཱͤ͞Δ60߈ܸऀ ར༻ऀ੬ऑੑͷ͋ΔαΠτᶃαΠτʹΞΫηεͯ͠ ηογϣϯ*%Λऔಘᶄηογϣϯ*%ͷૹΓࠐΈᶅαΠτʹϩάΠϯᶆͳΓ͢·ཱ͠
Ͳ͏ͬͯར༻ऀʹηογϣϯIDΛૹΓࠐΉͷ͔• ηογϣϯɾΞμϓγϣϯ / Session Adoption• ͕ࣗൃߦ͍ͯ͠ͳ͍ηογϣϯIDΛ༗ޮͳηογϣϯIDͱͯ͠ڐՄ ͯ͠͠·͏͜ͱ• ࠶ݱྫʣ1.URLʹΑΔηογϣϯID͕อ࣋Ͱ͖Δঢ়ଶͱ͢Δ2.߈ܸंʹΑΓ֎෦αΠτ͔Β http://example.jp/?PHPSESSID=hogeʹ༠ಋ͞ΕΔ3.ར༻ऀͦͷঢ়ଶͰϩάΠϯ͢Δ61ηογϣϯIDͷURLอ࣋Մઃఆ session.use_cookies: 1session.use_only_cookies: 0session.use_trans_sid: 1
ڴҖ• ใ࿙͍͑• ϩάΠϯޙʹར༻ऀͷΈ͕ӾཡՄೳͳใͷӾཡɺૢ࡞ɺѱ༻62
ݪҼ1. XSS• ෆਖ਼ͳεΫϦϓτʹΑΓηογϣϯID͕औಘ͞ΕΔ• ηογϣϯϋΠδϟοΫʹѱ༻͞ΕΔ2. ਪଌՄೳͳηογϣϯID• ηογϣϯID͕ਪଌ͞ΕΔ͜ͱʹΑΓηογϣϯID͕औಘ͞ΕΔ• ηογϣϯϋΠδϟοΫʹѱ༻͞ΕΔ3. ηογϣϯIDͷURLύϥϝʔλʔར༻• ྫ) http://example.jp/?PHPSESSID=XXX• ࠷ۙͷγεςϜͰ΄΅ແ͍ɻݹ͍ΨϥέʔγεςϜʹݟΒΕΔ• RefererϔομʔʹΑΓηογϣϯID͕࿙Ӯ͢Δ• ηογϣϯϋΠδϟοΫ/ηογϣϯIDͷݻఆԽʹѱ༻͞ΕΔ4. ೝূલޙͰηογϣϯID͕ಉ͡• ηογϣϯIDͷݻఆԽʹѱ༻͞ΕΔ63
ࠜຊతղܾ1.XSSରࡦ2.ηογϣϯIDΛਪଌࠔͳͷʹ͢Δ3.ηογϣϯIDΫοΩʔͷΈͰอ࣋͢Δ4.ೝূ͕ޭͨ͠Β৽͍͠ηογϣϯΛ։࢝͢Δ64
XSSରࡦ65w Σϒϖʔδ্ͷશͯͷग़ྗՕॴͰΤεέʔϓॲཧΛ͢Δw Ϣʔβʔ͕ೖྗͨ͠จࣈྻΛ)5.-λάͱͯ͠ղऍ͠ͳ͍Α͏ʹॲཧΛ͢Δ͜ͱw ಛघจࣈΛ)5.-ΤϯςΟςΟʹม͢Δ͜ͱͰରԠͰ͖Δ ˠ MU ˠ HUl ˠ RVPU` ˠ ˠ BNQ
ηογϣϯIDΛਪଌࠔͳͷʹ͢Δ• ҆શͳཚΛݩʹηογϣϯIDΛൃߦ͢Δ• PHP5.4Ҏ߱• ҉߸తٖࣅཚੜث(CSPRNG) Λ༻ͯ҆͠શͳηογϣϯID͕ൃߦ͞ΕΔΑ͏ʹͳ͍ͬͯΔ• PHP5.4ະຬ• php.iniʹҎԼઃఆΛՃ͑ͯ҆શͳηογϣϯཚΛݩʹηογϣϯIDΛൃߦ͢Δ66[Session]session.entropy_file = /dev/urandomsession.entroy_length = 32PHP 5.4͔ΒσϑΥϧτͰ͜ͷઃఆʹͳ͍ͬͯΔɻͦͷ··ͰOKɻ
ηογϣϯIDΫοΩʔͷΈͰอ࣋ɺURLύϥϝʔλʔͰอ࣋͠ͳ͍67໊લ σϑΥϧτ આ໌TFTTJPOVTF@DPPLJFT lzηογϣϯͷอ࣋ʹΫοΩʔΛ ར༻͢ΔTFTTJPOVTF@POMZ@DPPLJFT lzΫοΩʔͷΈʹηογϣϯΛ อ࣋͢ΔTFTTJPOVTF@USBOT@TJE lz63-ʹηογϣϯ*%อ࣋Λ ͠ͳ͍σϑΥϧτͷ··Ͱphp.iniઃఆ
ೝূ͕ޭͨ͠Β৽͍͠ηογϣϯΛ։࢝͢Δ• ʮsession_regenerate_id(true) ʯͰݹ͍ηογϣϯΛ ഁغͯ͠৽͍͠ηογϣϯIDΛൃߦ• ηογϣϯIDͷݻఆԽ߈ܸͷࢭ68
ͥͻطଘઃఆΛݟͯ͠Έ͍ͯͩ͘͞
ࢀߟɾҾ༻ࢿྉ
• ମܥతʹֶͿ ҆શͳWebΞϓϦέʔγϣϯͷ࡞Γํ ୈ2൛ ੬ऑੑ͕ੜ·ΕΔݪཧͱରࡦͷ࣮ફ / ಙؙ ߒ (ஶ)• IPA ҆શͳΣϒαΠτͷ࡞Γํ ୈ7൛ https://www.ipa.go.jp/security/vuln/websecurity.html71
·ͱΊ
·ͱΊ• զʑͷγεςϜɾαʔϏεৗʹૂΘΕ͍ͯΔ• αʔϏεͷ҆શੑΛߴΊΔͨΊʹɺΤϯδχΞࣗͷWebηΩϡϦςΟೳྗ্͕ඞཁ• ຊڞ༗ͨ͠੬ऑੑରࡦΛ͖͔͚ͬʹօ͞Μͷ αʔϏεɾγεςϜͷ҆શੑ্͕Ͱ͖ͨΒ͍Ͱ͢73
ิࢿྉ
CookieʹSecureଐੑΛՃ͑Δ• HTTPS௨৴࣌ͷΈCookie͕ϒϥβ͔Βૹ৴ͤ͞ɺ HTTP௨৴࣌ͷCookieྲྀग़Λ͙• php.ini ͷ session.cookie_secure Λ 1 ʹ͢Δ͜ͱͰରԠՄ75ग़య: https://www.php.net/manual/ja/session.configuration.php#ini.session.cookie-secure
76ग़య: http://dsas.blog.klab.org/archives/52136166.html
ཁ: PHPͷηογϣϯID҉߸తʹऑ͍ཚੜثΛ͓ͬͯΓɺηογϣϯϋΠδϟοΫͷةݥੑ͕͋Δ• PHPͷηογϣϯIDͷൃߦॲཧʹɺҎԼͷΈ߹ΘͤΛMD5ʹ௨ͯ͠ੜ͍ͯ͠ΔɻۃΊͯݶఆతͳ͕݅ͩɺηογϣϯIDͷਪଌՄೳͱ͍͏จ͕ެද͞Ε͍ͯΔɻ• ϦϞʔτIPΞυϨε• λΠϜελϯϓ• ཚʢ҉߸తٙࣅཚൃੜثͰͳ͍77ग़య: http://dsas.blog.klab.org/archives/52136166.html