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
Yuichi Sugiyama
PRO
July 31, 2019
Technology
1
470
知られざる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
500
可能な限り確実にmkdirを成功させるには / Make mkdir
oogfranz
PRO
0
510
サイボウズ #Garoon 開発チームの 「 完成度低いの歓迎LT大会 」 PHPerKaigi出張版 / Low quality LT in PHPerKaigi 2023
oogfranz
PRO
0
540
20年ものの巨大プロダクトをKubernetesに移行している話 後日談/Garoon on Kubernetes after talk
oogfranz
PRO
0
550
20年ものの巨大プロダクトをKubernetesに移行している話/Garoon on Kubernetes
oogfranz
PRO
0
430
PHPアプリケーションだってモニタリングしたい / Monitoring PHP application
oogfranz
PRO
1
610
効果的な静的解析の CI導入パターンを求めて / Great static analysis with CI
oogfranz
PRO
3
3.6k
Dev-meets-Ops
oogfranz
PRO
1
970
GitHub力の低い僕でも、 OSSコントリビュートできたワケ / GitHub Power
oogfranz
PRO
1
570
Other Decks in Technology
See All in Technology
バックエンド留学した話/Backend study abroad story
kaonavi
0
130
問題解決に役立つ数理工学
recruitengineers
PRO
8
2.4k
SaaSプロダクト開発におけるバグの早期検出のためのAcceptance testの取り組み
kworkdev
PRO
0
540
GitHub MCP Serverを使って Pull Requestを作る、レビューする
hiyokose
2
570
ペアプログラミングにQAが加わった!職能を超えたモブプログラミングの事例と学び
tonionagauzzi
1
160
「それはhowなんよ〜」のガイドライン #orestudy
77web
9
2.3k
17年のQA経験が導いたスクラムマスターへの道 / 17 Years in QA to Scrum Master
toma_sm
0
510
Startups On Rails 2025 @ Tropical on Rails
irinanazarova
0
180
20250328_RubyKaigiで出会い鯛_____RubyKaigiから始まったはじめてのOSSコントリビュート.pdf
mterada1228
0
420
Re:VIEWで書いた「Compose で Android の edge-to-edge に対応する」をRoo Codeで発表資料にしてもらった
tomoya0x00
0
240
OPENLOGI Company Profile for engineer
hr01
1
23k
マルチアカウント管理で必須!AWS Organizationsの機能とユースケース解説
nrinetcom
PRO
1
120
Featured
See All Featured
Optimizing for Happiness
mojombo
377
70k
The Cost Of JavaScript in 2023
addyosmani
48
7.6k
Music & Morning Musume
bryan
46
6.4k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
12
630
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Reflections from 52 weeks, 52 projects
jeffersonlam
349
20k
Designing for Performance
lara
606
69k
Making the Leap to Tech Lead
cromwellryan
133
9.2k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
12k
Scaling GitHub
holman
459
140k
Building an army of robots
kneath
304
45k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
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ʹอଘ͠ͳ͍Α͏ʹ͠·͠ΐ͏ • ϝϞϦपΓͷෆ۩߹͋ΔͷͰஔ͖͑Λݕ౼͠·͠ΐ͏ɻ