upload-labs部分wp

配置

  • php-5.2.17

  • 关闭 magic_quotes_gpc , 打开 allow _url_fopen , allow_url_include, php_exif

  • 所有关卡我都是看源码解题, 因为先要学习有那些检测方法才能学习绕过

pass-1

考点: 前端绕过

(对上传文件检测分为检测和后端检测, 前端检测就是通过 JavaScript 检测)

绕过: 在禁用浏览器 JavaScript
image

pass-2

考点: MIME 类型检测

(MIME 类型是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。就像我们看到文件后缀 .jpg 就知道他是图片文件一样, 浏览器可以通过查看 MIME 类型知道收到的文件是什么类型)

绕过: 使用 burpsuit 拦截上传请求, 修改其中 MIME 类型为允许上传的类型 (MIME 类型在 content-Type 字段)

image



黑名单绕过思路

pass-3 开始有黑名单限制了, 先总体说一下黑名单绕过思路:

  • windows 有个特性,它会对于文件的后缀名自动的修改,例如空格和点,冒号后面的内容都省略掉,可以利用window特性进行绕过。还有文件名结尾隐藏属性 ::$DATA 写不写都一样. 比如
    • a.phpa.Phpa.pHp 是一样的
    • 后缀 a.phpa.php 是一样的(第二个是 .php空格)
    • a.phpa.php.a.php... 是一样的
    • a.phpa.php::$DATA 是一样的

但是, 这些 一样 是因为 windows 对后缀已经进行处理后才 一样, 而一个网站拿到的是原始的, 没有经过处理的数据, 这些后缀对网站来说就是不一样的, 比如对网站来说 a.phpa.php::$DATA 是不一样的



pass-3

考点: 文件后缀黑名单限制

绕过: 上传黑名单中没有的后缀(.php2, .php3), 在 bp 拦截的请求中修改后缀为 php3
image

#pass-3
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $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)) {
            $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 = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

pass-4(未解决)

考点: .htaccess配置文件

绕过:上传111.htaccess配置文件, 这串代码的意思是如果文件中有一个4.png的文件,他就会被解析为php代码执行
image

接着上传 4.png 图片马,访问图片马

pass-5

绕过: 后缀加点空格点 a.php. .

代码分析: 会发现它依次去除后缀名末尾的点, ::$DATA, 空格. 如果我上传 a.php. ., 经过去除点与空格剩下 a.php., 它对于 windows 来说和 a.php一样

$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");
        $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 . '文件夹不存在,请手工创建!';
    }
}

pass-6

绕过: 大小写绕过 a.PHP

代码分析: 发现相比于 pass-5 ,这关没有过滤大小写

#pass-6部分代码
    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); //首尾去空

pass-7

绕过: 空格绕过 a.php (a.php空格)
代码分析: 限制了大小写, 点, ::$DATA,没限制大小写

    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

pass-8

绕过: 点绕过 a.php.

分析: 这关提示如图, 再看源码没有过滤空格
image

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

pass-9

绕过:后缀加 ::$DATA, 如 a.php::$DATA

pass-10

绕过: 后缀加点空格点, a.php. .

pass-11

绕过: 双写绕过, a.pphphp

代码分析: 发现本关是把黑名单的后缀替换为空, 那我后缀改为 a.pphphp, 他会把 后缀中 php 换为空, 剩下了 a.php

        $file_name = str_ireplace($deny_ext,"", $file_name);


这关开始有白名单了


pass-12

考点: 白名单和 GET%00截断

  • url%00 会编码为 0x00
  • 0x00相当于是一个注释符, 它(这行)后面代码不会执行

绕过: 上传 a.php ,在bp拦截中修改后缀和路径

代码分析:可以看到上传路径可以通过 GET 方式上传

        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

image

  • 上传成功后在新标签中打开图片发现 Not Found,这是正常的, 因为我们修改了上传路径, 只需要把路径改为我们修改的就能访问了
    image
    image

pass-13

考点: 白名单和 POST%00截断

绕过: 和pass-12 差不多, 但这关是在请求体中修改, 在请求体中添加路径 111.php%00 再对添加的路径进行 url编码 (因为post不会对上传路径进行编码), 同时也要修改文件后缀

代码分析:跟 pass-12 相似, 不过这次是 post

        $img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
  1. 先添加路径, 修改后缀
    image

  2. 选择添加的路径, 编码路径
    image

  3. 编码后的路径中 %00 看不见了, 这是正常的
    image

  4. 上传成功后在新标签中打开图片发现 Not Found, 这是正常的, 因为我们上传时候修改了上传路径, 把路径改为我们修改的路径即可访问
    image

image

pass-14

考点: 图片马制作, 文件幻数检测, 文件包含漏洞

  • 图片马制作

    1. 在同一文件夹内有一张图片, 一个 php 代码文件(php马)
    2. 在此文件夹内打开cmd
      1. 点一下文件路径image

      2. 输入 cmd image

      3. 回车, 会弹出一个命令行界面,输入

      copy 111.jpg/b + 222.php/a 333.jpg
      
      回车
      4. 当前目录下多了一个 333.jpg, 这 333.jpg 就是图片马
      image
  • 文件幻数检测
    文件幻数可以用来标记文件或者协议的格式
    查看文件类型除了看后缀还可以看他的文件幻数, 以十六进制打开一个文件, 最前面几个数字就是他的文件幻数
    image
    我们可以通过修改文件幻数绕过检测

    • 修改文件幻数的其他方法
    • 方法一: 在post上传请求的请求体中修改
      image
      方法二: 在php文件最前面添加文件幻数对应的字符串(因为文件幻数检测的是十六进制数字,而我们写的是字符), 如 GIF89aimage
  • 文件包含漏洞
    文件包含漏洞详解
    文件包含漏洞利用的前提条件:
      (1)web 应用采用 include 等文件包含函数,并且需要包含的文件路径是通过用户传输参数的方式引入;
      (2)用户能够控制包含文件的参数,被包含的文件可被当前页面访问;

绕过: 上面介绍的图片马制作就是把 php代码加到图片文件最后面, 目的是为了不破坏最前面的文件幻数,上传上面的图片马后在新标签中打开图片并不会执行 php 代码

image

想要执行代码得利用文件包含漏洞,本关告诉存在文件包含漏洞的是此页面image

在此页面路径后面接上图片马路径即可
image

pass-15

绕过: 依旧上传 pass-14 图片马绕过

分析: 本关通过函数 getimagesize()检查是否为图片文件

pass-16

绕过: 依旧上传 pass-14 图片马绕过

分析: 本关使用函数exif_imagetype()检查是否为图片文件

pass-17(未解决)

考点: 图片马,二次渲染

pass-18

考点: 条件竞争

绕过: 使用 bp 一直发送同一次请求, 用另一个浏览器访问这个上传文件

代码分析: 这关是先上传文件,再对文件后缀进行判断,二次渲染, 如果不符合上传条件就删除文件, 我们可以不停的访问这个文件,一旦访问成功,文件就被打开,就无法删除了

pass-19

绕过: 上传图片马,文件包含漏洞访问

pass-20

考点: move_uploaded_file()特性

绕过:

  • 法一: 保存文件名称后缀大小写, 点, 空格绕过,如 a.php.
  • 法二: 利用move_uploaded_file()特性,它会会忽略掉文件末尾的 /. 如 a.php/.
    代码分析:
    查看代码会发现判断的是保存文件名后缀
    image
    可以大小写,点, 空格绕过, 或者文件名末尾加 /.
    然后直接访问上传文件即可

pass-21(未解决)

网上是用数组做出来的, 我拿文件包含漏洞做出来了,明天看看数组做法

posted @ 2023-10-15 01:23  hhhhhhard  阅读(33)  评论(0)    收藏  举报