返回介绍

2 WriteUP

发布于 2024-09-13 00:49:22 字数 6232 浏览 0 评论 0 收藏 0

2.1 PASS - 01

<script type="text/javascript">
    function checkFile() {
        var file = document.getElementsByName('upload_file')[0].value;
        if (file == null || file == "") {
            alert("请选择要上传的文件!");
            return false;
        }
        //定义允许上传的文件类型
        var allow_ext = ".jpg|.png|.gif";
        //提取上传文件的类型
        var ext_name = file.substring(file.lastIndexOf("."));
        //判断上传文件类型是否允许上传
        if (allow_ext.indexOf(ext_name) == -1) {
            var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
            alert(errMsg);
            return false;
        }
    }
</script>

前端禁用 JS,直接上传 Webshell

2.2 PASS - 02

绕过 MIME 检测,通过 BurpSuite 修改 Content-Type 即可

2.3 PASS - 03

$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); //收尾去空

后端过滤了 .php ,通过使用 .php3php5php7phtmlpht 等后缀绕过检测

2.4 PASS - 04

重写文件解析规则绕过。上传先上传一个名为 .htaccess 文件,内容如下

<FiileMatch "04.jpg">
SetHandler application/x-httpd-php
</FiileMatch>

再上传一个 03.jpg ,访问 03.jpg,即以 PHP 文件进行解析。

2.5 PASS - 05

还是黑名单,加上了 .htaccess ,但是没有将后缀进行大小写统一,于是可以通过大小写绕过。

2.6 PASS - 06

利用 Windows 系统的文件名特性。文件名最后增加点和空格,写成 06.php[空格] ,

上传后保存在 Windows 系统上的文件名最后的一个 . 会被去掉,实际上保存的文件名就是 06.php

2.7 PASS - 07

原理同 Pass-06,文件名后加点,改成 07.php.

2.8 PASS - 08

Windows 文件流特性绕过,文件名改成 08.php::$DATA ,上传成功后保存的文件名其实是 08.php

php 在 window 环境下,如果文件名 + ::$DATA 会把 ::$DATA 之后的数据当成文件流处理,不会检测后缀名,且保持 ::$DATA 之前的文件名

2.9 PASS - 09

原理同 Pass-06,上传文件名后加上点 + 空格+ 点,改为 09.php. .

2.10 PASS - 10

双写文件名绕过,文件名改成 10.pphphp

2.11 PASS - 11

上传路径名 %00 截断绕过。上传的文件名写成 11.jpg,save_path 改成 ../upload/11.php%00 ,最后保存下来的文件就是 11.php

2.12 PASS - 12

原理同 Pass-11,上传路径 0x00 绕过。这次的 save_path 是通过 post 传进来的,还是利用 00 截断,但这次需要在二进制中进行修改,因为 post 不会像 get 对 %00 进行自动解码

利用 Burpsuite 的 Hex 功能将 save_path 改成 ../upload/12.php[二进制 00] 形式

2.13 PASS - 13

绕过文件头检查,添加 GIF 图片的文件头 GIF89a,绕过 GIF 图片检查。

2.14 PASS - 14

这里用 getimagesize 获取文件类型,还是直接就可以利用图片马就可进行绕过

2.15 PASS - 15

这里用到 php_exif 模块来判断文件类型,还是直接就可以利用图片马就可进行绕过

2.16 PASS - 16

原理:将一个正常显示的图片,上传到服务器。寻找图片被渲染后与原始图片部分对比仍然相同的数据块部分,

将 Webshell 代码插在该部分,然后上传。具体实现需要自己编写 Python 程序,人工尝试基本是不可能构造出能绕过渲染函数的图片 webshell 的。

参考:

2.17 PASS - 17

  • 利用条件竞争删除文件时间差绕过。
  • 在脚本运行的时候,访问 Webshell

2.18 PASS - 18

  • 利用上传重命名竞争 + Apache 解析漏洞,成功绕过。
  • 上传名字为 18.php.7Z 的文件,快速重复提交该数据包,会提示文件已经被上传,但没有被重命名。

2.19 PASS - 19

本关考察 CVE-2015-2348 move_uploaded_file() 00 截断,原理同 Pass-11,上传的文件名用 0x00 绕过。改成 19.php[二进制 00].1.jpg

2.20 PASS - 20

$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
if (!is_array($file)) {
    $file = explode('.', strtolower($file));
}
$ext = end($file);
$allow_suffix = array('jpg','png','gif');
if (!in_array($ext, $allow_suffix)) {
    $msg = "禁止上传该后缀文件!";
}else{
    $file_name = reset($file) . '.' . $file[count($file) - 1];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $img_path = UPLOAD_PATH . '/' .$file_name;
    if (move_uploaded_file($temp_file, $img_path)) {
        $msg = "文件上传成功!";
        $is_upload = true;
} else {
        $msg = "文件上传失败!";
}

首先 end 函数取所 post 参数数组中的最后一个值, $file_name = reset($file) . '.' . $file[count($file) - 1] 。我们可以 post 一个参数名为一个 [0]一个 [2],然后 $file[count($file) - 1] 就为空,$file_name 最终就为 reset($file) 即 $file[0],就可以绕过判断

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文