次のコードでは、Lectureクラスをserialize()によって文字列へシリアライズした後、その文字列を出力しています。
32 |その後、シリアライズされた文字列をunserialize()によってデシリアライズしています。
33 |マジックメソッド__wakeup()の挙動や、シリアライズされた文字列を確認してください。
34 |
37 |
38 | class Lecture {
39 | public $title = '趣味と実益のための著名なOSSライブラリ起因の脆弱性の探求';
40 | public $track = 'B';
41 | public $year = 2021;
42 | public function __wakeup() {
43 | echo 'wakeup!!';
44 | }
45 | }
46 |
47 | $l = new Lecture();
48 | $serialized = serialize($l);
49 | echo htmlspecialchars($serialized);
50 | echo "<br>";
51 | echo "-------------------------------------------";
52 | echo "<br>";
53 | $unserialized = unserialize($serialized);
54 |
55 |
56 |
59 |
60 | ";
74 | echo "-------------------------------------------";
75 | echo "
";
76 | $unserialized = unserialize($serialized);
77 | ?>
78 |
79 |
80 | 次のコードでは、Settingクラスをserialize()によって文字列へシリアライズした後、その文字列を出力しています。
32 |その後、objectパラメータが存在する場合はobjectパラメータを、存在しない場合はシリアライズされた文字列をunserialize()によってデシリアライズしています。
33 |objectパラメータでシリアライズされた文字列を指定し、/etc/passwdを読み取ってください。
34 |ヒント:objectパラメータの指定の仕方 http://localhost:5000/level1.php?object=O:7:"Setting":1:{s:4:"path";s:11:"config.json";}
39 |
40 | class Setting {
41 | public $path = "config.json";
42 | public function __wakeup() {
43 | $content = file_get_contents($this->path);
44 | echo $content;
45 | }
46 | }
47 |
48 | $setting = new Setting();
49 | $serialized = serialize($setting);
50 | echo htmlspecialchars($serialized);
51 | echo "<br>";
52 | echo "-------------------------------------------";
53 | echo "<br>";
54 | if(isset($_GET["object"])){
55 | unserialize($_GET["object"]);
56 | } else {
57 | unserialize($serialized);
58 | }
59 |
60 |
61 |
64 |
65 | path);
70 | echo $content;
71 | }
72 | }
73 |
74 | $setting = new Setting();
75 | $serialized = serialize($setting);
76 | echo htmlspecialchars($serialized);
77 | echo "
";
78 | echo "-------------------------------------------";
79 | echo "
";
80 | if(isset($_GET["object"])){
81 | unserialize($_GET["object"]);
82 | } else {
83 | unserialize($serialized);
84 | }
85 | ?>
86 |
87 |
88 | 次のコードでは、Mainクラスをserialize()によって文字列へシリアライズした後、その文字列を出力しています。
32 |その後、objectパラメータが存在する場合はobjectパラメータを、存在しない場合はシリアライズされた文字列をunserialize()によってデシリアライズしています。
33 |objectパラメータでシリアライズされた文字列を指定し、/etc/passwdを読み取ってください。
34 |
37 |
38 | class Setting {
39 | public $path = "config.json";
40 | public function read() {
41 | $content = file_get_contents($this->path);
42 | echo $content;
43 | }
44 | }
45 |
46 | class Main {
47 | public $file = null;
48 | public function __destruct(){
49 | $this->file->read();
50 | }
51 | }
52 |
53 | $main = new Main();
54 | $serialized = serialize($main);
55 | echo htmlspecialchars($serialized);
56 | echo "<br>";
57 | echo "-------------------------------------------";
58 | echo "<br>";
59 | if(isset($_GET["object"])){
60 | unserialize($_GET["object"]);
61 | } else {
62 | echo "objectパラメータを設定してください";
63 | }
64 |
65 |
66 |
69 |
70 | path);
75 | echo $content;
76 | }
77 | }
78 |
79 | class Main {
80 | public $file = null;
81 | public function __destruct(){
82 | $this->file->read();
83 | }
84 | }
85 |
86 | $main = new Main();
87 | $serialized = serialize($main);
88 | echo htmlspecialchars($serialized);
89 | echo "
";
90 | echo "-------------------------------------------";
91 | echo "
";
92 | if(isset($_GET["object"])){
93 | unserialize($_GET["object"]);
94 | } else {
95 | echo "objectパラメータを設定してください";
96 | }
97 | ?>
98 |
99 |
100 | 次のコードでは、Mainクラスをserialize()によって文字列へシリアライズした後、その文字列を出力しています。
32 |その後、objectパラメータが存在する場合はobjectパラメータを、存在しない場合はシリアライズされた文字列をunserialize()によってデシリアライズしています。
33 |objectパラメータでシリアライズされた文字列を指定し、web shellを配置し任意コード実行を成功させてください。
34 |ヒント:web shellの例 <?php system($_GET["cmd"]);?>
40 |
41 | class Setting {
42 | public $path = "config.json";
43 | public function read() {
44 | system("cat " . $this->path);
45 | }
46 | }
47 |
48 | class Main {
49 | public $file = null;
50 | public function __destruct(){
51 | $this->file->read();
52 | }
53 | }
54 |
55 | $main = new Main();
56 | $serialized = serialize($main);
57 | echo htmlspecialchars($serialized);
58 | echo "<br>";
59 | echo "-------------------------------------------";
60 | echo "<br>";
61 | if(isset($_GET["object"])){
62 | unserialize($_GET["object"]);
63 | } else {
64 | echo "objectパラメータを設定してください";
65 | }
66 |
67 |
68 |
71 |
72 | path);
77 | }
78 | }
79 |
80 | class Main {
81 | public $file = null;
82 | public function __destruct(){
83 | $this->file->read();
84 | }
85 | }
86 |
87 | $main = new Main();
88 | $serialized = serialize($main);
89 | echo htmlspecialchars($serialized);
90 | echo "
";
91 | echo "-------------------------------------------";
92 | echo "
";
93 | if(isset($_GET["object"])){
94 | unserialize($_GET["object"]);
95 | } else {
96 | echo "objectパラメータを設定してください";
97 | }
98 | ?>
99 |
100 |
101 |