Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
知られざるSerialize
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Yuichi Sugiyama
PRO
July 31, 2019
Technology
1
500
知られざるSerialize
Yuichi Sugiyama
PRO
July 31, 2019
Tweet
Share
More Decks by Yuichi Sugiyama
See All by Yuichi Sugiyama
サイボウズ と Garoon と The PHP Foundation と 私 / Cybozu and Garoon and The PHP Foundation and me
oogfranz
PRO
1
570
可能な限り確実にmkdirを成功させるには / Make mkdir
oogfranz
PRO
0
670
サイボウズ #Garoon 開発チームの 「 完成度低いの歓迎LT大会 」 PHPerKaigi出張版 / Low quality LT in PHPerKaigi 2023
oogfranz
PRO
0
690
20年ものの巨大プロダクトをKubernetesに移行している話 後日談/Garoon on Kubernetes after talk
oogfranz
PRO
0
610
20年ものの巨大プロダクトをKubernetesに移行している話/Garoon on Kubernetes
oogfranz
PRO
0
500
PHPアプリケーションだってモニタリングしたい / Monitoring PHP application
oogfranz
PRO
1
660
効果的な静的解析の CI導入パターンを求めて / Great static analysis with CI
oogfranz
PRO
3
3.9k
Dev-meets-Ops
oogfranz
PRO
1
1k
GitHub力の低い僕でも、 OSSコントリビュートできたワケ / GitHub Power
oogfranz
PRO
1
650
Other Decks in Technology
See All in Technology
大規模な組織におけるAI Agent活用の促進と課題
lycorptech_jp
PRO
5
7.7k
クラウド時代における一時権限取得
krrrr38
1
150
AI時代にエンジニアはどう成長すれば良いのか?
recruitengineers
PRO
1
110
社内でAWS BuilderCards体験会を立ち上げ、得られた気づき / 20260225 Masaki Okuda
shift_evolve
PRO
1
160
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
4
22k
Oracle Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
5
1.1k
OSSで構築するIT基盤管理実践事例: NetBox・Snipe-IT・FreeRADIUS+PrivacyIDEA / Practical Case Studies of IT Infrastructure Management Using OSS
nttcom
0
180
Introduction to Bill One Development Engineer
sansan33
PRO
0
380
競争優位を生み出す戦略的内製開発の実践技法
masuda220
PRO
2
530
Webアクセシビリティ技術と実装の実際
tomokusaba
0
200
生成AIの利用とセキュリティ /gen-ai-and-security
mizutani
0
100
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
95k
Featured
See All Featured
Test your architecture with Archunit
thirion
1
2.2k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
290
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.1k
Chasing Engaging Ingredients in Design
codingconduct
0
130
Why Our Code Smells
bkeepers
PRO
340
58k
GraphQLとの向き合い方2022年版
quramy
50
14k
Documentation Writing (for coders)
carmenintech
77
5.3k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
970
The agentic SEO stack - context over prompts
schlessera
0
680
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Ethics towards AI in product and experience design
skipperchong
2
210
Transcript
ΒΕ͟ΔSerialize @PHP Study Cybozu Inc, Yuichi Sugiyama
Who am I • ਿࢁ ༞Ұ @oogFranz • αΠϘζ5ΤϯδχΞ •
େاۀ͚άϧʔϓΣΞ Λ࡞ͬͯΔʢPHP 7.2) • ෳۀδϟζϛϡʔδγϟϯ@MASHݭָஂ
serialize(), unserialize()ͬͯ·͔͢ʁ
serialize() όϦϕϯϦ $a = ["hoge", 3, true]; $a[] = &$a;
echo serialize($a); # a:4:{i:0;s:4:"hoge";i:1;i:3;i:2;b:1;i:3;a:4: {i:0;s:4:"hoge";i:1;i:3;i:2;b:1;i:3;R:5;}} • PHPͷΛ෮ݩՄೳͳจࣈྻʹม͢Δɻ • ΫϥεͷΠϯελϯεͰ͋ͬͯมՄೳʂ • DBʹอଘͰ͖ΔʂͬͨͶʂ
serialize() όϦϕϯϦ $a = ["hoge", 3, true]; $a[] = &$a;
echo serialize($a); # a:4:{i:0;s:4:"hoge";i:1;i:3;i:2;b:1;i:3;a:4: {i:0;s:4:"hoge";i:1;i:3;i:2;b:1;i:3;R:5;}} • PHPͷΛ෮ݩՄೳͳจࣈྻʹม͢Δɻ • ΫϥεͷΠϯελϯεͰ͋ͬͯมՄೳʂ • DBʹอଘͰ͖ΔʂͬͨͶʂ
Կ͕ʁ • serialize() ʹ࣮ͦΜͳʹͳ͍ • ٯؔͷunserialize()ʹ͍͔ͭ͘ͷ੬ऑੑ͕͋Δ
PHP Object Injection ʢPOIʣ • ҎԼͷ͕݅ຬͨ͞Ε͍ͯΔ߹ɺ։ൃऀ͕ҙਤ͍ͯ͠ͳ͍ ίʔυΛ߈ܸऀ͕࣮ߦͰ͖Δɻ • __wakeup(), __destruct()ͳͲͷϚδοΫϝιουʹ
෭࡞༻ͷ͋Δίʔυ͕ॻ͔Ε͍ͯΔ • unserialize()ͷҾʹϢʔβʔ͔Βͷೖྗ͕͞ΕΔ
ϚδοΫϝιου • ಛఆͷ݅ͰࣗಈͰൃಈ͢Δຐ๏ • serialize()ͷ࣮ߦ࣌ʹϚδοΫϝιουͷ __sleep() ͕ ͋ͬͨΒࣗಈͰ࣮ߦ͞ΕΔ • unserialize()࣌ʹɺϚδοΫϝιουͷ
__wakeup() ͕ ͋ͬͨΒࣗಈͰ࣮ߦ͞ΕΔ
αϯϓϧ class POIExample{ private $filename; public function __destruct() { unlink($this->filename);
} } unserialize('O:10:"POIExample":1:{s: 20:"POIExamplefilename";s:8:"test.php";}')
αϯϓϧ class POIExample{ private $filename; public function __destruct() { unlink($this->filename);
} } unserialize('O:10:"POIExample":1:{s: 20:"POIExamplefilename";s:8:"test.php";}') ߈ܸऀ͕ҙͷϑΝΠϧͷআ͕Մೳʂ
POIͷ͕͜͜ා͍ • ࣮ࡍʹunserializeʹ͞ΕΔ͜ͱ͕ͳ͍ΫϥεͰ͋ͬͯɺ auto_loadͷΈ͕͋Δͱ࣮ߦ͞Εͯ͠·͏ɻ • privateͷϝϯόมʹҙͷΛೖՄೳ setterΛհ͞ͳ͍ͷͰɺߟྀ͕͍͠ɻ • ԾʹsetterͰσΟϨΫτϦτϥόʔαϧΛ͍Ͱ͍ͯແҙຯ
• json_encode(), json_decode()Λ͏ɻ ˠΦϒδΣΫτΛγϦΞϥΠζɾσγϦΞϥΠζ͢ΔͷͰͳ͚Ε ेɻ • allowed_classesΦϓγϣϯΛ͏ ˠࢦఆ͞ΕͨΫϥεͷΦϒδΣΫτʹ͔͠ ɹม͞Εͳ͍͜ͱ͕อূ͞ΕΔ POIΛ͙ʹʁ
allowed_classes Φϓγϣϯ $serialized_str = 'O:10:"POIExample":1:{s:20:"POIExamplefilename";s: 8:"test.php";}'; $result = unserialize($serialized_str, ['allowed_classes'
=> false]); var_dump($result); /* object(__PHP_Incomplete_Class)#2 (2) { ["__PHP_Incomplete_Class_Name"]=> string(10) "POIExample" ["filename":"POIExample":private]=> string(8) "test.php" } */ echo serialize($result); // O:10:"POIExample":1:{s:20:"POIExamplefilename";s:8:"test.php";}
allowed_classesͰकΕΔͷ • ڐՄ͞Ε͍ͯͳ͍ΫϥεΛunserialize()͢Δͱɺ__PHP_Incomplete_Class ʹม͞ΕΔ • ͦͷΦϒδΣΫτΛ͏Ұserialize͢Δͱ ʢͳ͔ͥʣݩʹΔɻ • σϑΥϧτ true
(ΨόΨό)ͳͷͰ໌ࣔతʹࢦఆ͢Δඞཁ͕͋Δ • falseΛࢦఆ͢Εɺ͋ΒΏΔΫϥεΛڋઈ͢Δ
__PHP_Incomplete_ClassʹͳͬͨΒΤϥʔʹ͍ͨ͠ • ةͳ͍ͷ͕͖͍ͬͯͯΔͷͰΤϥʔʹ͍ͨ͠ • get_class Λͯ͠ɺ__PHP_Incomplete_Class ͔ΛௐΔ • unserialize_callback_func ݺͼग़͞Εͳ͍ͷͰҙɻ
allowed_classes͕͋Εunserializeͬ ͯྑ͍ʁ https://twitter.com/nikita_ppv/status/895571304325062656
allowed_classes͕͋Εunserializeͬ ͯྑ͍ʁ https://www.php.net/manual/ja/function.unserialize.php
unserializeͷ੬ऑੑ੬ऑੑͱΈͳ͞Εͳ͍ • ϝϞϦपΓͳͲͷෆ۩߹Ͱ͋ͬͯ੬ऑੑͱΈͳ͞Εͳ͍ Մೳੑ͕͋Δ • ΧδϡΞϧʹϝϞϦपΓͷෆ۩߹͕ใࠂ͞Ε͍ͯΔ
serializeͨ͠ΛDBʹೖΕΔ͜ͱʹ͍ͭͯ • SQL Ξϯνύλʔϯͷ 5ষ EAVʢΤϯςΟςΟɾΞτϦϏϡʔτɾόϦϡʔʣ ʹͳͬͯΔՄೳੑ͕ߴ͍ɻ
MySQLͱserialize • MySQLͷtextʹγϦΞϥΠζσʔλΛೖΕ͍ͯΔ߹ɺ จࣈ͕Φʔόʔ͢Δͱɺ్தͰΒΕͯ͠·͍ɺ ෮ݩͰ͖ͳ͘ͳΔɻʢStrict SQL Modeʹґଘʣ • MySQL 5.7͔ΒJSONܕ͕͑ΔΑ͏ʹͳͬͨͷͰɺ
ಈతεΩʔϚ͕Ͳ͏ͯ͠ඞཁͳ߹JSONܕΛߟ͑ͨํ͕ Αͦ͞͏ɻ
·ͱΊ • serialize(), unserialize()Λ͍ͬͯͳ͍ͷͳΒɺͦΕ͕Ұ൪ • ͍ͬͯ͠ΔͷͳΒɺPOIΛ͙ͨΊɺϢʔβʔೖྗσʔλ͕ೖͬͯ͜ͳ͍͜ͳ͍͜ͱΛ͔֬Ί Α͏ • ՄೳͰ͋Εjson_encode, json_decodeʹஔ͖͔͑Α͏
• ͦΕແཧͳΒɺallowed_classesΦϓγϣϯͰPOI͠ͷ͝͏ • DBʹอଘ͠ͳ͍Α͏ʹ͠·͠ΐ͏ • ϝϞϦपΓͷෆ۩߹͋ΔͷͰஔ͖͑Λݕ౼͠·͠ΐ͏ɻ