WEB常见漏洞之文件上传(靶场篇)2

本文涉及的产品
云解析 DNS,旗舰版 1个月
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
简介: WEB常见漏洞之文件上传(靶场篇)

Pass-06

场景分析

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

这是一个后端校验的 PHP 代码,从上可知其中定义了文件后缀名黑名单,黑名单里几乎包含了所有可解析的后缀名、.htaccess以及.ini。与此同时脚本还会对上传文件名进行过滤,包括删除文件名末尾的点、首尾去空、去除字符串::$DATA等。但由于定义的黑名单并不完整并且没有强制大小写转换。因此我们可通过大小写转换的方式绕过限制

大小写转换

将 php 文件后缀名修改为.Php并上传

但无法访问上传文件,界面显示500。这是由于当前的 Windows 系统对文件名中的大小写不敏感,而 Linux 系统对文件名中的大小写敏感

我们将环境通过 Docker 切换为 Linux 平台再次测试

    cd upload-labs/docker
    docker build -t upload-labs .
    docker run -d -p 80:80 upload-labs:latest

    环境搭建完成后上传文件

    成功访问上传文件

    Pass-07

    场景分析

    $is_upload = false;
    $msg = null;
    if (isset($_POST['submit'])) {
        if (file_exists(UPLOAD_PATH)) {
            $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");
            $file_name = $_FILES['upload_file']['name'];
            $file_name = deldot($file_name);//删除文件名末尾的点
            $file_ext = strrchr($file_name, '.');
            $file_ext = strtolower($file_ext); //转换为小写
            $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
            if (!in_array($file_ext, $deny_ext)) {
                $temp_file = $_FILES['upload_file']['tmp_name'];
                $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
                if (move_uploaded_file($temp_file,$img_path)) {
                    $is_upload = true;
                } else {
                    $msg = '上传出错!';
                }
            } else {
                $msg = '此文件不允许上传';
            }
        } else {
            $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
        }
    }

    这是一个后端校验的 PHP 代码,从上可知其中定义了文件后缀名黑名单,黑名单里几乎包含了所有可解析的后缀名、.htaccess以及.ini。与此同时脚本还会对上传文件名进行过滤,包括删除文件名末尾的点、去除字符串::$DATA、将字符转换为小写等。但由于没有强制首尾去空。我们可以在文件名后加空格绕过限制,利用 Windows 系统特性完成上传。

    文件名加空

    上传 php 文件并在文件后缀名后加上空格,上传后系统会自动将空格清除以完成正常解析

    成功访问上传文件

    Pass-08

    场景分析

    $is_upload = false;
    $msg = null;
    if (isset($_POST['submit'])) {
        if (file_exists(UPLOAD_PATH)) {
            $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");
            $file_name = trim($_FILES['upload_file']['name']);
            $file_ext = strrchr($file_name, '.');
            $file_ext = strtolower($file_ext); //转换为小写
            $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
            $file_ext = trim($file_ext); //首尾去空
            if (!in_array($file_ext, $deny_ext)) {
                $temp_file = $_FILES['upload_file']['tmp_name'];
                $img_path = UPLOAD_PATH.'/'.$file_name;
                if (move_uploaded_file($temp_file, $img_path)) {
                    $is_upload = true;
                } else {
                    $msg = '上传出错!';
                }
            } else {
                $msg = '此文件类型不允许上传!';
            }
        } else {
            $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
        }
    }

    这是一个后端校验的 PHP 代码,从上可知其中定义了文件后缀名黑名单,黑名单里几乎包含了所有可解析的后缀名、.htaccess以及.ini,与此同时脚本还会对上传文件名进行过滤,包括首尾去空、去除字符串::$DATA、将字符转换为小写等。但由于没有删除文件名末尾的点。我们可以在文件名后加点绕过限制,利用 Windows 系统特性完成上传。

    文件名加.

    上传 php 文件并在文件后缀名后加上符号点,上传后系统会自动将点清除以完成正常解析

    成功访问上传文件

    Pass-09

    场景分析

    $is_upload = false;
    $msg = null;
    if (isset($_POST['submit'])) {
        if (file_exists(UPLOAD_PATH)) {
            $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");
            $file_name = trim($_FILES['upload_file']['name']);
            $file_name = deldot($file_name);//删除文件名末尾的点
            $file_ext = strrchr($file_name, '.');
            $file_ext = strtolower($file_ext); //转换为小写
            $file_ext = trim($file_ext); //首尾去空
            if (!in_array($file_ext, $deny_ext)) {
                $temp_file = $_FILES['upload_file']['tmp_name'];
                $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
                if (move_uploaded_file($temp_file, $img_path)) {
                    $is_upload = true;
                } else {
                    $msg = '上传出错!';
                }
            } else {
                $msg = '此文件类型不允许上传!';
            }
        } else {
            $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
        }
    }

    这是一个后端校验的 PHP 代码,从上可知其中定义了文件后缀名黑名单,黑名单里几乎包含了所有可解析的后缀名、.htaccess以及.ini,与此同时脚本还会对上传文件名进行过滤,包括首尾去空、删除文件名末尾的点、将字符转换为小写等。但它并没有过滤::$DATA。


    那什么是::$DATA呢?

    这其实是 Windows 系统中 NTFS 文件系统的特性,::$DATA是 NTFS 存储数据流的一个属性,当我们访问mac.php::$DATA时就是请求mac.php本身,如果它还包含了其他数据流,如mac.php:mac2.php::$DATA就会请求mac2.php中的数据流。因此我们可以在文件名后加::$DATA绕过限制,利用 Windows 系统特性完成上传

    文件名加::$DATA

    上传 php 文件并在文件后缀名后加上::$DATA,上传后系统会自动将::$DATA清除以完成正常解析

    成功访问上传文件

    Pass-10

    场景分析

    查看提示信息本题只允许上传图片后缀的文件

    校验源代码如下:

    $is_upload = false;
    $msg = null;
    if (isset($_POST['submit'])) {
        if (file_exists(UPLOAD_PATH)) {
            $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");
            $file_name = trim($_FILES['upload_file']['name']);
            $file_name = deldot($file_name);//删除文件名末尾的点
            $file_ext = strrchr($file_name, '.');
            $file_ext = strtolower($file_ext); //转换为小写
            $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
            $file_ext = trim($file_ext); //首尾去空
            if (!in_array($file_ext, $deny_ext)) {
                $temp_file = $_FILES['upload_file']['tmp_name'];
                $img_path = UPLOAD_PATH.'/'.$file_name;
                if (move_uploaded_file($temp_file, $img_path)) {
                    $is_upload = true;
                } else {
                    $msg = '上传出错!';
                }
            } else {
                $msg = '此文件类型不允许上传!';
            }
        } else {
            $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
        }
    }

    这是一个后端校验的 PHP 代码,从上可知其中定义了文件后缀名黑名单,黑名单里几乎包含了所有可解析的后缀名、.htaccess以及.ini,与此同时脚本还会对上传文件名进行过滤,包括首尾去空、删除文件名末尾的点、将字符转换为小写、去除字符串::$DATA等。但由于只对点进行了单次过滤,因此如果我们上传mac.php. .最终会过滤为mac.php.,这样也就演变成了第八题。虽然以上几题都能通过这种方式绕过限制,但是这并不意味着我们要“一招鲜,吃遍天”,而学习多种绕过姿势才是我们的目的。

    文件名加. .

    上传 php 文件并在文件后缀名后加上. .,上传后脚本会去除 .,同时系统会自动将.清除以完成正常解析

    成功访问上传文件

    目录
    相关文章
    |
    3月前
    |
    开发框架 前端开发 .NET
    ASP.NET WEB——项目创建与文件上传操作
    ASP.NET WEB——项目创建与文件上传操作
    72 0
    |
    3月前
    |
    SQL 云安全 安全
    常见的web漏洞,网站漏洞该怎么办
    随着互联网的发展,网站安全成为企业和个人关注焦点,尤其网站漏洞可能导致数据泄露、系统崩溃等严重后果。本文介绍了四种常见网站漏洞:XSS、SQL注入、文件包含和CSRF,以及它们的危害。为解决这些问题,建议加强代码审查、输入验证、使用安全API和库、访问控制等措施。此外,德迅云安全的漏洞扫描VSS服务可在Web漏洞扫描、弱密码扫描和中间件扫描等场景中发挥作用,帮助企业及时发现并处理安全问题,保障网站安全。
    |
    3月前
    |
    关系型数据库 MySQL
    web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
    web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
    |
    1月前
    |
    存储 安全 JavaScript
    Web漏洞挖掘:XSS与CSRF防护策略
    【7月更文挑战第11天】XSS和CSRF作为Web应用中常见的安全漏洞,对系统安全构成了严重威胁。通过实施上述防护策略,可以有效减少这些漏洞的风险。然而,Web安全攻防是一个持续不断的过程,开发者需要持续关注应用的安全性,更新和修补安全漏洞,同时加强自身的安全意识和防范技能,以确保Web应用的安全性和稳定性。
    |
    3月前
    |
    XML 云安全 安全
    了解常见的web漏洞-XXE漏洞,日常如何做好web安全
    随着网络技术的不断发展,网站安全问题日益受到人们的关注。当前随着技术发展,网站存在一些常见的可能被攻击者利用的漏洞,而在众多网站安全漏洞中,XXE(XML External Entity)漏洞是一个不容忽视的问题。今天我们就来分享了解一下关于XXE漏洞的概念、原理以及日常上有哪些可以措施可以防护网站安全。
    |
    3月前
    |
    存储 前端开发 JavaScript
    什么是web与搭建自己的第一个pikachu靶场
    本文是关于Web基础知识和搭建Pikachu靶场的教程。首先介绍了Web的定义,强调其作为互联网信息传输方式的核心是超链接,以及HTML、CSS和JavaScript在构建网页中的作用。接着,详细讲解了如何在本地使用phpStudy搭建Pikachu靶场,包括下载相关软件、配置安装路径、启动环境和初始化数据库设置。对于使用特定Win7系统的用户,提供了因系统自带phpStudy导致安装问题的解决办法。分享了学习心得和每日一言,鼓励专注力的重要性。
    |
    3月前
    |
    缓存 前端开发 Java
    15:Servlet 3.0文件上传与下载-Java Web
    15:Servlet 3.0文件上传与下载-Java Web
    101 5
    |
    3月前
    |
    存储 数据库 Python
    Django教程第6章 | web开发实战-文件上传(导入文件、上传图片)
    web应用实战:导入文件解析到DB,上传图片【2月更文挑战第25天】
    76 0
    Django教程第6章 | web开发实战-文件上传(导入文件、上传图片)
    |
    3月前
    |
    SQL 安全 Java
    Java Web安全性:常见的漏洞及防护措施
    Java Web安全性:常见的漏洞及防护措施
    504 0
    |
    3月前
    |
    SQL 安全 关系型数据库
    01WEB漏洞环境搭建
    【1月更文挑战第4天】给单位零基础小伙伴准备的网安入门教程,本教程是基于蚁景实验室搭建,基于自建虚拟机搭建需自行准备前置环境,01WEB漏洞环境搭建