Upload-Labs关卡

  • 0x00 Pass11(str_ireplace复写绕过)
  • 0x01 Pass12(GET方式%00截断)
  • 0x02 Pass13(POST方式%00截断)
  • 0x03 Pass14(文件头截取判断)
  • 0x04 Pass15(getimagesize函数绕过)

0x00 Pass11(str_ireplace复写绕过)

Pass11主要考察str_ireplace函数

$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","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess","ini");$file_name = trim($_FILES['upload_file']['name']);$file_name = str_ireplace($deny_ext,"", $file_name);$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 = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}

在PHP中

str_replace() 函数
定义:使用一个字符串替换字符串中的另一些字符,对大小写敏感的搜索
语法:str_replace(find,replace,string,count)str_ireplace() 函数
定义:使用一个字符串替换字符串中的另一些字符,对大小写不敏感的搜索
语法:str_ireplace(find,replace,string,count)

可见无法通过后缀名的大小写绕过,但对于replace函数中直接替换为空的场景通常可以用复写来绕过,例如本关中的test1.pphphp即可在replace后变成test1.php

0x01 Pass12(GET方式%00截断)

本题考查%00截断,相当于复现CVE-2006-7243,所以需将php版本设置为PHP 5.3.4以下, 并关闭magic_quotes_gpc选项。
具体代码为:

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){$ext_arr = array('jpg','png','gif');$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);if(in_array($file_ext,$ext_arr)){$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = '上传出错!';}} else{$msg = "只允许上传.jpg|.png|.gif类型文件!";}
}

可见保存的路径也可以由用户所控制,GET类型的传参。因此在保存路径中修改为:

save_path=../upload/test.php%00

再上传一个正常的jpg图片即可。

这时由于受空字符%00的影响,后面所有的内容均被截断。
最终上传test.php文件。

0x02 Pass13(POST方式%00截断)

上一关中看到save_path变量是通过GET形式传参接受的,因此在url中直接使用%00截断使得后面的路径拼接不被读取。

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){$ext_arr = array('jpg','png','gif');$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);if(in_array($file_ext,$ext_arr)){$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传失败";}} else {$msg = "只允许上传.jpg|.png|.gif类型文件!";}
}

而在13关中,$_POST['save_path']以POST形式传参时,直接使用%00无法截断,因为POST的数据不会被直接解码,需要手动使用burp中的URL-decode解码。


解码后就变为了不可见字符,绕过POST形式的00截断。

0x03 Pass14(文件头截取判断)

可以看到题目的要求为:

1.保证上传后的图片马中仍然包含完整的一句话或webshell代码。
2.使用文件包含漏洞能运行图片马中的恶意代码。
3.图片马要.jpg,.png,.gif三种后缀都上传成功才算过关!

代码如下:

function getReailFileType($filename){$file = fopen($filename, "rb");$bin = fread($file, 2); //只读2字节fclose($file);$strInfo = @unpack("C2chars", $bin);    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    $fileType = '';    switch($typeCode){      case 255216:            $fileType = 'jpg';break;case 13780:            $fileType = 'png';break;        case 7173:            $fileType = 'gif';break;default:            $fileType = 'unknown';}    return $fileType;
}$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){$temp_file = $_FILES['upload_file']['tmp_name'];$file_type = getReailFileType($temp_file);if($file_type == 'unknown'){$msg = "文件未知,上传失败!";}else{$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传出错!";}}
}

可见每次上传的文件都会被读取前两个字节来判断文件类型,这里判断的也就是文件头。
这里把三种文件类型的文件头加上:

PNG文件:hex格式8950,取值输出为13780


JPG文件:hex格式FFD8,取值输出为255216。


GIF文件:GIF89a,当文件第一行为GIF头时,取值输出为7173。


在burp中,GIF文件我们只需要在要发送的数据包前面加上文件头即可。
而png和jpg文件受不可见字符的影响,建议以copy /b 1.png+test.php upload.png的命令制作图片木马。
打开后如图所示:

上传成功后使用题目中给出的链接测试文件包含是否可以执行图片木马。

0x04 Pass15(getimagesize函数绕过)

判断是否为图片的代码为:

function isImage($filename){$types = '.jpeg|.png|.gif';if(file_exists($filename)){$info = getimagesize($filename);$ext = image_type_to_extension($info[2]);if(stripos($types,$ext)>=0){return $ext;}else{return false;}}else{return false;}
}$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){$temp_file = $_FILES['upload_file']['tmp_name'];$res = isImage($temp_file);if(!$res){$msg = "文件未知,上传失败!";}else{$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传出错!";}}
}

使用 $info = getimagesize($filename);和 $ext = image_type_to_extension($info[2]);取文件后缀名。
在php中getimagesize会获取7个元素的值,分别为:

索引 0 给出的是图像宽度的像素值
索引 1 给出的是图像高度的像素值
索引 2 给出的是图像的类型,返回的是数字,其中1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM
索引 3 给出的是一个宽度和高度的字符串,可以直接用于 HTML 的<image>标签
索引 bits 给出的是图像的每种颜色的位数,二进制格式
索引 channels 给出的是图像的通道值,RGB 图像默认是 3
索引 mime 给出的是图像的 MIME 信息,此信息可以用来在 HTTP Content-type 头信息中发送正确的信息,如: header(“Content-type: image/jpeg”);

上传一张示例图片返回结果为:
可以看到info[2]的值为2,也就是JPG,与返回的相同。
在本关中,使用刚刚copy /b 1.png+test.php upload.png生成的图片马即可绕过。

文件上传漏洞靶场upload-labs学习(pass11-pass15)相关推荐

  1. 文件上传漏洞靶场--upload-labs通关过程

    文件上传漏洞靶场–upload-labs通关过程 Pass-01(前端验证) 点击提示: 提示我们该文件类型不允许上传,应该是前端对文件类型进行了验证. 对于前端验证,我们有多种方法可进行绕过:但bu ...

  2. DVWA靶机-文件上传漏洞(File Upload)

    DVWA靶机-文件上传漏洞(File Upload) 文件上传漏洞的四个等级,low,medium,high,impossible,今天我们针对于不同的等级进行基于文件上传漏洞的攻击 DVWA靶机-暴 ...

  3. java 文件上传漏洞_文件上传漏洞(File Upload)

    简介 File Upload,即文件上传漏洞,通常是由于对用户上传文件的类型.内容没有进行严格的过滤.检查,使得攻击者可以通过上传木马,病毒,恶意脚本等获取服务器的webshell权限,并进而攻击控制 ...

  4. 文件上传漏洞靶场upload-labs学习(pass1-pass5)

    Upload-Labs学习 0x00 upload-labs简介 0x01 upload-labs环境搭建 0x02 Pass1(前端判断绕过) 0x03 Pass2(content-type类型绕过 ...

  5. upload-labs-master文件上传漏洞靶场详解(1-17)

    目录 前言 pass-01 pass-02 pass-03 pass-04 pass-05 pass-06 pass-07 pass-08 pass-09 pass-10 pass-11 pass-1 ...

  6. (20)文件上传漏洞:原理、原因、常见触发点分析,vulhub、upload、公开cms上传漏洞多种方法测试

    目录 理解文件上传漏洞: 文件上传漏洞: 文件上传漏洞: WebShell: 一句话木马: 产生上传漏洞原因: 原因: 常见的问题: 危害: 触发点,并判断是否存在文件上传漏洞: 触发点: 查找方法: ...

  7. 【Web安全】中国蚁剑+DVWA(本地文件上传漏洞Upload)

    文章目录 1 中国蚁剑 2 文件上传漏洞(Upload) 2.1 准备hack.php 2.2 从DVWA上传hack.php 3 使用蚁剑来连接获得webshell 1 中国蚁剑 中国蚁剑是一款开源 ...

  8. 文件上传漏洞 (上传知识点、题型总结大全-upload靶场全解)

    文件上传漏洞 什么是文件上传漏洞 什么是webshell 一句话木马大全 产生文件上传漏洞的原因 文件上传漏洞的攻击与防御方式 1.前端限制 2.检查扩展名 1.黑名单策略, 2.白名单策略 3.检查 ...

  9. 网安基础学习之“文件上传漏洞原理与实现”

    网安基础学习之"文件上传漏洞原理与实现" 近期新闻头条上报出了"长沙市场监管局网站被上传了黄色页面",经过长沙市公安局网技支队的排查,该门户网站后台编辑器存在* ...

最新文章

  1. vue el-form鼠标事件导致页面刷新解决方案;vue 阻止多次点击提交数据通用方法...
  2. Google用更少标签生成图像,还提出一个用于训练评估GAN的库
  3. linux 中FTP服务器的架设
  4. BZOJ1449[JSOI2009]球队收益BZOJ2895球队预算——最小费用最大流
  5. 应届硕士研究生算法岗秋招总结
  6. CodeForces - 1285E Delete a Segmen(线段树+区间合并+离散化)
  7. jQuery年月日(生日)选择器
  8. mysql varchar java_关于MySQL varchar类型最大值,原来一直都理解错了
  9. 需求分析——掌握UML建模语言的用例图
  10. 计算机主机硬件详细介绍,计算机系统的硬件和系统软件详细介绍
  11. 小程序学习笔记(7)-使用小程序的组件构建UI界面
  12. php mysql含引号报错,执行sql双引号
  13. 局域网攻击之ARP网关欺骗
  14. 【Android -- 数据存储】LitePal 的基本使用
  15. python爬虫 爬取行政区划代码
  16. 几个免费IP地址查询API接口
  17. 开juǎn有益系列(一)——Binary search(二分查找/折半查找算法)
  18. 阿里巴巴JAVA代码规范三【考题】
  19. 人工智能入门:第一章 人工智能课程介绍及环境配置
  20. (纪录片)数学的故事 The Story of Maths (2008)

热门文章

  1. 点或积分区域的对称性,积分结果的对称性
  2. 软件开发中的 Kata 模型是什么,和精益有什么关系?
  3. matlab与simulink结合,code-matlab 利用SIMULINK和M函数相结合的方式仿真BFSK 调制在 联合开发网 - pudn.com...
  4. DOS下如何查看电脑硬盘分区
  5. Python 四大主流 Web 编程框架
  6. 【语义分割】2022-HRViT CVPR
  7. 笔记(待续)-动力学逆问题相关基础知识
  8. 支持居者有其屋,支持房产税出台与落地。
  9. 海康摄像头字符叠加详解
  10. 自己实现strcat函数