upload-labs通关
背景知识
靶机包含漏洞类型分类
如何判断上传的漏洞类型
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>
发现它不允许上传php格式的文件,所以我们可以直接抓包修改一下在Forward过去。
然后查看一下结果,结果发现已经成功的达到了目的:
Pass-02
还是首先看一下源代码:
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.'文件夹不存在,请手工创建!';
}
}
发现第二个是Content-Type
绕过,那么我们只要抓包修改Content-Type
的类型即可:
这样就已经成功了,结果是和上面的一样的,就不再重复了。
Pass-03
这一关和上面两关有点不一样,这一关是黑名单问题,直接拒绝了上传:
$deny_ext = array('.asp','.aspx','.php','.jsp');
此时我们应该怎么办呢,可以尝试phtml,php3,php4, php5, pht后缀名都可以绕过,但是我们需要去修改配置文件,加上这么一行:
AddType application/x-httpd-php .php .phtml .phps .php5 .pht
Pass—4
还会老样子,照例先看一下源代码是怎么写的:
$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");
是不是很吓人,对没错,它的过滤的格式更多了,但是还是没有过滤.htaccess
文件,可以重写文件解析规则绕过,上传一个.htaccess
,文件内容如下,就是在upload目录下匹配gg.jpg的文件并以php文件执行
<FilesMatch "gg.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
然后再上传一个名字为gg.jpg的脚本:
最终成功显示。结果如上图所示。
Pass-05
来到了第五关,首先看一下源代码:
少了下面的一行:
$file_ext = strtolower($file_ext); //转换为小写
这一关明显的增加了对.htaccess
文件的过滤,但是对比一下代码,发现少了转换为小写,所以我们可以使用大小写混合绕过:
Pass-06
第六关相对比上一关少了一行:
$file_ext = trim($file_ext); //首尾去空
后缀名+空格的形式去绕过:
Pass-07
第七关还是黑名单,没有用deldot
函数,就没有把.
去掉:
$file_name = deldot($file_name);//删除文件名末尾的点
利用windows特性,会自动去掉后缀名中最后的.
,可在后缀名中加.
绕过,Linux测试失败。
Pass-08
代码就不贴了,直接看重要的部分,和上面的区别就是少了一句替换和代码换成了取到后缀名最终的后缀名:
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
这样一看,::$DATA'
是Windows的特性,具体可以看文章https://www.waitalone.cn/php-window。