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

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

Pass-11

场景分析

$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","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess","ini");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = str_ireplace($deny_ext,"", $file_name);
        $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 = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

这是一个后端校验的 PHP 代码,从上可知其中定义了文件后缀名黑名单,黑名单里几乎包含了所有可解析的后缀名、.htaccess以及.ini,当上传文件的后缀名与黑名单匹配时会自动去除后缀名,没有了后缀名文件自然也无法解析,但由于只过滤单次后缀名,因此我们可以双写后缀名绕过限制

双写后缀名

上传名为mac.pphphp的 php 文件

成功访问上传文件


Pass-12

场景分析

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else{
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

这是一个后端校验的 PHP 代码,从上可知其中定义了文件后缀名白名单,白名单中包含了jpg、png、gif,脚本会检测上传数据包的 MIME 类型是否在白名单当中,但由于文件上传路径可控,因此我们可以使用00截断的方式绕过限制。


那什么是00截断呢?

在 ASCII 码中0一般作为特殊字符保留,一般代表字符串结束。0x00、%00、/00其实都代表同一意思,当%00出现时其实就目标就会认为内容读取已经结束,从而忽略到%00后的字符串。但在 PHP 中的00截断需要注意几个前提:



1、PHP版本小于5.3.42、
PHP中的magic_quotes_gpc关闭

00截断

上传 php 文件并将文件路径修改为../upload/mac.php%00

成功访问上传文件

Pass-13

场景分析


$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传失败";
        }
    } else {
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

这是一个后端校验的 PHP 代码,从上可知其中定义了文件后缀名白名单,白名单中包含了jpg、png、gif,脚本会检测上传数据包的 MIME 类型是否在白名单当中,但由于文件上传路径可控,因此我们可以使用00截断的方式绕过限制。


那什么是00截断呢?

在 ASCII 码中0一般作为特殊字符保留,一般代表字符串结束。0x00、%00、/00其实都代表同一意思,当%00出现时其实就目标就会认为内容读取已经结束,从而忽略到%00后的字符串。但在 PHP 中的00截断需要注意几个前提:

    1、PHP版本小于5.3.42、
    PHP中的magic_quotes_gpc关闭

    00截断+URL编码

    上传php 文件并将文件路径修改为../upload/mac.php%00,本题与上题类似,只不过修改位置进行了替换,我们需要对%00进行URL编码

    成功访问上传文件

    Pass-14

    场景分析

    本题对文件内容的前两个字节进行检测,同时提示其中存在文件包含漏洞

    640.png

    function getReailFileType($filename){
        $file = fopen($filename, "rb");
        $bin = fread($file, 2); //只读2字节
        fclose($file);
        $strInfo = @unpack("C2chars", $bin);    
        $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    
        $fileType = '';    
        switch($typeCode){      
            case 255216:            
                $fileType = 'jpg';
                break;
            case 13780:            
                $fileType = 'png';
                break;        
            case 7173:            
                $fileType = 'gif';
                break;
            default:            
                $fileType = 'unknown';
            }    
            return $fileType;
    }
    $is_upload = false;
    $msg = null;
    if(isset($_POST['submit'])){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $file_type = getReailFileType($temp_file);
        if($file_type == 'unknown'){
            $msg = "文件未知,上传失败!";
        }else{
            $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
            if(move_uploaded_file($temp_file,$img_path)){
                $is_upload = true;
            } else {
                $msg = "上传出错!";
            }
        }
    }

    这是一个后端校验的 PHP 代码,从上可知其中定义了文件白名单,白名单中包含了jpg、png、gif,脚本会检查文件开头的两个字节来判断文件是否为白名单。如果判断文件不为白名单则上传失败,因此我们可以伪造图片头并在图片中插入代码,使用图片马上传的方式可绕过限制吗,然后配合文件包含完成脚本解析


    结合文件包含漏洞

    文件包含漏洞通过参数file来指定图片马可进行解析

    640.png


    文件包含+图片马

    首先我们需要制作图片马,在不同系统中制作方式也不同

    # Windows
    copy 1.png /a + 2.php /b 3.png
    # Linux
    cat 1.png 2.php > 3.png

    图片马生成后开始上传文件

    成功访问上传文件

    配合文件包含成功解析


    include.php?file=upload/4720220519155838.png


    640.png

    Pass-15

    场景分析

    查看提示信息本题使用getimagesize()进行检测,同时提示其中存在文件包含漏洞


    那什么是 getimagesize() 函数呢?

    getimagesize() 函数用于获取图像大小及相关信息,图片对象包括 GIF、JPG、PNG 等,如果获取成功会返回一个数组,失败则会返回 FALSE 并产生一条 E_WARNING 级的错误信息。

    function isImage($filename){
        $types = '.jpeg|.png|.gif';
        if(file_exists($filename)){
            $info = getimagesize($filename);
            $ext = image_type_to_extension($info[2]);
            if(stripos($types,$ext)>=0){
                return $ext;
            }else{
                return false;
            }
        }else{
            return false;
        }
    }
    $is_upload = false;
    $msg = null;
    if(isset($_POST['submit'])){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $res = isImage($temp_file);
        if(!$res){
            $msg = "文件未知,上传失败!";
        }else{
            $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;
            if(move_uploaded_file($temp_file,$img_path)){
                $is_upload = true;
            } else {
                $msg = "上传出错!";
            }
        }
    }

    这是一个后端校验的 PHP 代码,从上可知其中定义了文件后缀名白名单,白名单中只包含了图片后缀,与此同时它通过getimagesize()函数检查文件是否为图片。我们可以使用上传图片马的方式绕过限制。但它与上一题略有不同,在上一题中如果我们只修改文件前两个字节还能够上传成功,那么这题就不行了,需要实实在在构造一个图片马才行。


    结合文件包含漏洞

    由于题中本身存在文件包含漏洞,通过参数file来指定图片马可完成解析

    文件包含+图片马(首部检查)

    首先我们需要制作图片马,在不同系统中制作方式也不同

    # Windows
    copy 1.png /a + 2.php /b 3.png
    # Linux
    cat 1.png 2.php > 3.png

    图片马生成后开始上传文件

    成功访问上传文件

    配合文件包含成功解析


    include.php?file=upload/4720220519161618.png

    Pass-16

    场景分析

    本题使用exif_imagetype()进行检测,同时提示其中存在文件包含漏洞


    那什么是 exif_imagetype() 函数呢?

    exif_imagetype() 函数会读取一个图像的第一个字节并检查其签名。主要用来检查某个文件是否为图像。但它需要在php.ini中添加php_exif扩展并重启应用,否则无法调用该函数

    function isImage($filename){
        //需要开启php_exif模块
        $image_type = exif_imagetype($filename);
        switch ($image_type) {
            case IMAGETYPE_GIF:
                return "gif";
                break;
            case IMAGETYPE_JPEG:
                return "jpg";
                break;
            case IMAGETYPE_PNG:
                return "png";
                break;    
            default:
                return false;
                break;
        }
    }
    $is_upload = false;
    $msg = null;
    if(isset($_POST['submit'])){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $res = isImage($temp_file);
        if(!$res){
            $msg = "文件未知,上传失败!";
        }else{
            $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$res;
            if(move_uploaded_file($temp_file,$img_path)){
                $is_upload = true;
            } else {
                $msg = "上传出错!";
            }
        }
    }

    这是一个后端校验的 PHP 代码,从上可知其中定义了文件后缀名白名单,白名单中只包含了图片后缀,与此同时它通过exif_imagetype()函数检查文件是否为图片。我们可以使用上传图片马的方式绕过限制。


    结合文件包含漏洞

    由于题中本身存在文件包含漏洞,通过参数file来指定图片马可完成解析

    文件包含+图片马(函数检查)

    首先我们需要制作图片马,在不同系统中制作方式也不同

    # Windows
    copy 1.png /a + 2.php /b 3.png
    # Linux
    cat 1.png 2.php > 3.png

    图片马生成后开始上传文件

    成功访问上传文件

    配合文件包含成功解析


    include.php?file=upload/9220220519163603.png

    目录
    相关文章
    |
    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漏洞环境搭建