php伪协议
自定义协议就叫伪协议,格式:zzz://xxxxxxx
支持的种类有这12种
- 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:// — 处理交互式的流
我们可以利用这些php自带的协议去进行攻击,要注意的是,在php.ini中两个重要的配置会影响到fopen等等和include等等函数对于伪协议的支持
1 | allow_url_fopen:能否远程文件包含 |
通过观察这两个配置的开启与否来确定攻击方向
简单利用
php:// — (I/O streams)
1 | ?file=php://filter/convert.base64-encode/resource=xxx.php |
可以说这是最常使用的一个伪协议,一般可以利用进行任意文件读取。
php://filter是一种元封装器,设计用于”数据流打开”时的”筛选过滤”应用,对本地磁盘文件进行读写。简单来讲就是可以在执行代码前将代码换个方式读取出来,只是读取,不需要开启allow_url_include;
我们可以利用此输入来获取网页php源码
变量覆盖漏洞
extract()变量覆盖
extract()函数能将变量从数组导入当前的符号表,导出变量时,就可能发生变量覆盖
php://input
php://input 是个可以访问请求的原始数据的只读流。将post请求中的数据作为PHP代码执行。
1 | ?user=php://input |
常用post:
- <?php phpinfo(); ?> 查看phpinfo
- <?php print_r(scandir(“.”)); ?>
- <?php print_r(scandir(“E:/phpstudy/WWW”)); ?>指定目录
eval闭合漏洞
类似于sql注入的方法,将前后闭合
想知道flag.php中的内容,则可以用:1
);print_r(file("./flag.php")
或者1
);print_r(file_get_contents("./flag.php")
需要注意的是file_get_contents不能用于打印php文件
phar://
上传文件时使用,构造php代码,压缩成zip文件,然后将其后缀名改成jpg后上传(不然会被过滤掉),使用如下伪协议即可解压后执行恶意代码
1 | ?file=phar://upload/xxx.jpg/xx |
文件包含漏洞
文件包含漏洞是“代码注入”的一种。常见导致文件包含的函数如下:
PHP:include(),include_once(),require(),require_once(),fopen(),readfile()….
使用上述函数包含一个新文件时,会将该文件作为php代码执行,而且并不会在意该被包含的文件是什么类型的,可以利用这一特性实施攻击