文件包含
定义:
开发者为了节约开发时间,可以将重复利用的代码使用文件包含的函数,如include,reuqire等进行文件包含,节约开发的时间和成本。为了灵活性,有些开发者会使用变量作为文件包含的参数.而文件包含漏洞就是利用include,require可以包含并执行php代码的特性,在开发者过滤不完全的情况下包含了攻击者上传的恶意文件从而被执行.
由于php底层的机制,在include,require时,任何类型的文件都会被当做php文件解析.攻击者常常上传合法的txt或jpg文件配合文件包含使用从而执行恶意文件.
1.php://输入输出流
PHP提供了- -些杂项输入/输出(IO) 流,允许访问PHP的输入输出流、标准输入输出和错误描述符,内存中、 磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
php://filter (本地磁盘文件进行读取)
用法: ?filenamep=php://filter/convert.base64-encode/resource=xxx.php
?filename=php://filter/read=convert.base64- encode/resource=xxx.php -样。
条件:只是读取,需要开启allow _urL fopen, 不需要开启allow_ urL jinclude;
2.file协议读取文件
file://完整路径
3.php://input
可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。enctype=" multipart/form-data” 的时候p://input是无效的。
用法: ?file=php://input 数据利用POST传过去。
4.data://伪协议
数据流封装器,和php://相似都是利用了流的概念,将原本的include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流,通过你输入payload来实现目的;
data://text/plain;base64,dGhIIHVzZXIgaXMgYWRtaW4
5.phar;//伪协议
这个参数就是php解压输包的一个函数, 不管后缓是什么,都会当做压缩包来解压
用法: ?file=phar://压缩包/内部文件 phar:/xx.png/shell.php 注意:PHP>=5.3.0 压缩包需要zip协议压缩,rar不行,木马文件压缩后改为其
他任意格式的文件都可以正常使用。
步骤: 写个一句话木马shell.php 用zip压缩为shell.zip 将后缀改为png或者其他格式
6.zip://伪协议
zip伪协议和phart议类似,但是用法不一样。
用法: ?file=zip://[压缩文件句对路径]#[压缩文件内子文件名] zip://xx.png#shell.php
条件: PHP>=5.3.0 win下要5.3.0<php<5.4才可以#在浏览器中要编码为%23,否则浏览器默认不会传输特殊字符。
本地文件包含(LFI)
- 读取文件等敏感信息
- 执行代码
常见敏感信息路径
本地文件包含(LFI)
- 有时文件包含的时候会遇到后面拼接后缀名,可以用%00截断, 如?page=1.jpg%00
利用条件: magic_quotes_gpc=off
PHP<5.3.4
- 路径长度截断文件包含
windows目录下最大路径长度256B
linux目录下最大路径长度4096B
<?php $filename=$_GET(['filename']); inclide($filename.".html"); ?>
构造链接可以是 xxx?filename=test.txt/././....././
后面的.html会被截断
- 点号截断文件包含,适用于windows系统。当点长度大于256B,使用效果同l上
远程文件包含(RFI)
<?php include($_GET['filename'."html"]); ?>
?绕过
#绕过
空格%20绕过
xxx?filename=http://.../php.txt?(这里可以是?或者#或者空格%20)