1--TEST--
2Bug #70436: Use After Free Vulnerability in unserialize()
3--FILE--
4<?php
5
6class obj implements Serializable
7{
8    var $data;
9
10    function serialize()
11    {
12        return serialize($this->data);
13    }
14
15    function unserialize($data)
16    {
17        $this->data = unserialize($data);
18    }
19}
20
21$fakezval = ptr2str(1122334455);
22$fakezval .= ptr2str(0);
23$fakezval .= "\x00\x00\x00\x00";
24$fakezval .= "\x01";
25$fakezval .= "\x00";
26$fakezval .= "\x00\x00";
27
28$inner = 'C:3:"obj":3:{rya}';
29$exploit = 'a:4:{i:0;i:1;i:1;C:3:"obj":'.strlen($inner).':{'.$inner.'}i:2;s:'.strlen($fakezval).':"'.$fakezval.'";i:3;R:5;}';
30
31$data = unserialize($exploit);
32
33var_dump($data);
34
35function ptr2str($ptr)
36{
37    $out = '';
38
39    for ($i = 0; $i < 8; $i++) {
40        $out .= chr($ptr & 0xff);
41        $ptr >>= 8;
42    }
43
44    return $out;
45}
46?>
47DONE
48--EXPECTF--
49Deprecated: %s implements the Serializable interface, which is deprecated. Implement __serialize() and __unserialize() instead (or in addition, if support for old PHP versions is necessary) in %s on line %d
50
51Warning: unserialize(): Error at offset 0 of 3 bytes in %s on line %d
52
53Warning: unserialize(): Error at offset 93 of 94 bytes in %s on line %d
54bool(false)
55DONE
56