PHP代码审计 14 文件上传漏洞

本文记录 PHP 代码审计的学习过程,教程为暗月 2015 版的 PHP 代码审计课程

PHP 代码审计博客目录

1. 简介

  1. 审计函数

    move_uploaded_file()

    定义和用法:

    move_uploaded_file() 函数将上传的文件移动到新位置。
    若成功,则返回 true,否则返回 false。

    语法:
    move_uploaded_file(file,newloc)

    move_uploaded_file() 官方文档链接

  2. 超全局变量 $_FILES

    1. 后缀名是图片格式
    2. 前缀名不能是外部提交的
    3. 上传的目录不可以是获取外部提交的路径
  3. 防御

    1. 使用白名单方式检测文件后缀
    2. 上传之后按时间能算法生成文件名称
    3. 上传目录脚本文件不可执行
    4. 注意 %00 截断
    5. Content-Type 验证
  4. DVWA 中的源代码

    <?php 
        $file = $_GET['page']; //The page we wish to display  
    
        // Only allow include.php 
        if ( $file != "include.php" ) { 
            echo "ERROR: File not found!"; 
            exit; 
        } 
    ?>  
    

    DVWA 中防御方式是使用白名单机制

  5. move_uploaded_file() 函数示例:

    move_uploaded_file() 对安全模式和 open_basedir 都是敏感的。不过,限制只针对 destination 路径,因为允许移动上传的文件名 filename 可能会与这些限制产生冲突。move_uploaded_file() 仅作用于通过 PHP 上传的文件以确保这个操作的安全性。

    <html>
    <body>
        <!--上传表单,有一个上传文件域-->
        <form method="post" action="" enctype="multipart/form-data" name="form">
            <input type="file" name="up_file">
            <!-- 提交按钮-->
          <input type="submit" name="submit" value="上传">
    </form>
    </body>
    </html>
    <?php
    header("Content-Type:text/html; charset=utf-8");
    if(!empty($_FILES['up_file']['name'])){       //判断是否有文件
         $fileinfo = $_FILES['up_file'];      //将文件信息赋给变量$fileinfo
        if($fileinfo['size']<1000000 && $fileinfo['size']>0){    //判断文件大小
            move_uploaded_file($fileinfo['tmp_name'],$fileinfo['name']);  //上传文件
            echo "上传成功";
        }else{
            echo '文件太大或未知';
        }
    }
    ?>
    

    结果为

    使用 move_uploaded_file()函数上传文件,在创建 form表单时,必须设置 form 表单的 enctype=”multipart/form-data“。

猜你喜欢

转载自blog.csdn.net/kevinhanser/article/details/81146105
今日推荐