文件上传漏洞靶场详解

admin 2025年2月11日14:23:37评论3 views字数 4567阅读15分13秒阅读模式

第一关(JS绕过)

1.1使用bp进行绕过

先将要上传的php文件的后缀改为png,然后在上传时抓包,将png后缀再改为php,发包,此时上传成功

1.2使用js进行绕过

打开浏览器的检查,将其中的checkFile函数直接删除,即可上传php文件

文件上传漏洞靶场详解

第二关(mime类型)

常见的MIME类型(通用型):

超文本标记语言文本 .html text/html
xml文档 .xml text/xml
XHTML文档 .xhtml application/xhtml+xml
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
PDF文档 .pdf application/pdf
Microsoft Word文件 .word application/msword
PNG图像 .png image/png
GIF图形 .gif image/gif
JPEG图形 .jpeg,.jpg image/jpeg
au声音文件 .au audio/basic
MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
任意的二进制数据 application/octet-stream

分析源代码发现这里只是将content-type做了校验,我们可以在上传时抓取数据包然后更改content-type进行绕过

选择一个php后缀的文件,然后进行抓包,更改content-type,改为image/png

文件上传漏洞靶场详解

靶场中显示这样子的界面即为上传成功

文件上传漏洞靶场详解

第三关(黑名单绕过)

查看源代码发现这里对上传文件的后缀进行了限制,php等一些文件都上传不了,我们可以尝试绕过黑名单,例如php3 php4 php5 phtml的文件进行上传:

只需将想上传的php后缀的文件改为php3 php4 php5 phtml中的任意一个即可,然后直接上传就能成功

第四关(黑名单绕过 .htaccess)

补充知识:

.htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变。例如,需要使用.config ,则可以在服务器配置文件中按以下方法配置:AccessFileName .config 。
笼统地说,.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。
.htaccess文件可以在网站目录树的任何一个目录中,只对该文件所在目录中的文件和子目录有效。
注意:
 子目录中的指令会笼盖更高级目录或者主器配置中的指令。
 .htaccess文件中的配置指令作用于.htaccess文件所在的目录及其所有子目录,即子目录中的指令会覆盖父目录或者主配置文件中的指令。

所以本关可以先上传一个.htaccess文件,文件内容如下:

SetHandler application/x-httpd-php(将所有的文件以php解析)

随后上传php文件,将后缀改为png或者jpg格式上传即可,然后会被解析为php

第五关(大小写混合绕过)

查看源码发现“file_ext = strtolower($file_ext); //转换为小写”,这一句没有了,所以可以使用大小写进行绕过,例如:1.php改为1.phP

第六关(空格和点配合绕过)

利用Windows系统的文件名特性。文件名最后增加空格和点,写成1.php .,这个需要用burpsuite抓包修改,上传后保存在Windows系统上的文件名最后的一个.会被去掉,实际上保存的文件名就是1.php

第七关(空格和点配合绕过)

跟第六关一样

第八关(基于文件流特性::$DATA来绕过)

本关少了“file_ext = str_ireplace('::DATA', '', file_ext);//去除字符串::DATA”这一句,,我们可以采用Windows文件流特性绕过,文件名改为1.php::$DATA , 上传成功后保存的文件名其实是1.php

第九关(点空格点绕过)

上传文件名后加上点+空格+点,改为

1.php. . 

第十关(双写绕过)

由于 file_name = str_ireplace(deny_ext,"", $file_name); 只对文件后缀名进行一次过滤,这样的话,双写文件名绕过,文件名改成1.pphphp

第十一关(%00截断)

这个属于白名单绕过,这是php语言自身的问题,php低版本存在的漏洞。

漏洞的利用条件:php版本<5.3.4,并且magic_quotes_gpc关闭。

分析代码,这是以时间戳的方式对上传文件进行命名,使用上传路径名%00截断绕过,不过这需要对文

件有足够的权限,比如说创建文件夹,上传的文件名写成1.jpg, save_path改成../upload/1.php%00 (1.php%00.jpg经过url转码后会变为1.php�00.jpg),最后保存下来的文件就是1.php

文件上传漏洞靶场详解

第十二关(0x00绕过)

跟11关原理相同,只是12关改为了POST传参,抓包将%00选中在对其编码即可

文件上传漏洞靶场详解

第十三关(文件头检查)

绕过文件头检查,添加GIF图片的文件头GIF89a,绕过GIF图片检查。

或者我们使用命令copy 1.jpg /b + shell.php /a webshell.jpg,将php一句话追加到jpg图片末尾,代码

不全的话,人工补充完整。形成一个包含Webshell代码的新jpg图片,然后直接上传即可。但是我们没

有办法拿到shell,应为我们上传的图片马无法被解析成php形式,通常图片马配合%00或者0x00截断上

传,或者配合解析漏洞

本关存在文件包含漏洞

文件上传漏洞靶场详解

打开此链接后可以检查图片马是否正常

第十四关(文件内容检测-getimagesize()绕过)

补充知识:

getimagesize() 函数用于获取图像尺寸 ,索引 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

image_type_to_extension() 函数用于获取图片后缀

方法与13关相同

第十五关(文件内容检测-exif_imagetype()绕过)

exif_imagetype()  此函数是php内置函数,用来获取图片类型

方法与13关相同

第十六关(二次渲染)

较难

二次渲染原理:将用户上传过来的文件数据重新读取保存到另外一个文件中,那么在读取写入的过程中,将特

殊的数据剔除掉了

为了方便大家测试,这里提供一张网上某个大佬提供的GIF图片,当时我也找了很久,大家可以保存一下

https://wwe.lanzoui.com/iFSwwn53jaf

第十七关(时间竞争)

本关是能将php文件上传到服务器中的,但是会被服务器迅速删掉,所以我们可以利用条件竞争删除文件时间差绕过。

第一步抓取上传文件的包,清除变量

文件上传漏洞靶场详解

第二步

文件上传漏洞靶场详解

第三步,这个地方的线程可以调高一点

文件上传漏洞靶场详解

随后点击开始攻击,这样页面就会不断上传1.php文件

然后我们写一个python脚本:

import requests
url = "http://xxx.xxx.xxx.xxx/upload-labs/upload/1.php"
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print("OK")
        break

这个脚本是不断请求服务器中的1.php文件,我们可以在kali中使用此脚本,访问成功会提示OK并退出脚本

第十八关(时间竞争)

本关不能再上传php文件了,需要上传图片马

且本关靶场有点问题需要自己手动修改一下:

文件上传漏洞靶场详解

后续操作和17关相同,python脚本需要改一下

import requests
url = "http://xxx.xxx.xxx.xx/upload-labs/include.php?file=upload/pass19.png"
while True:
    html = requests.get(url)
    if ( 'Warning'  not in  str(html.text)):
        print('ok')
        break

第十九关

与前面的11和12关类似

move_uploaded_file()还有这么一个特性,会忽略掉文件末尾的 /.

所以在上传的位置改为upload-19.php/.

第二十关

本关来源于ctf,比较绕,参考别的大佬的解题方法

文件命名规则:$file_name = reset($file) . '.' . $file[count($file) - 1];
reset():将内部指针指向数组中的第一个元素,并输出。
end():将内部指针指向数组中的最后一个元素,并输出。
$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : 
$_POST['save_name'];如果save_name不为空则file为save_name,否则file为filename
if (!is_array($file))判断如果file不是数组则以’.’分组
文件名命名规则$file_name = reset($file) . '.' . $file[count($file) - 1];
我们POST传入一个save_name列表:['info20.php''''jpg'],此时
empty($_POST['save_name']) 为假则file为save_name,所以由$ext = end($file);为jpg可以通
过后缀名判断(判断结束后最后一个元素jpg弹出),并且最终文件名组装为upload20.php.
文件上传漏洞靶场详解

原文始发于微信公众号(泷羽Sec-pp502的安全笔记):文件上传漏洞靶场详解

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月11日14:23:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   文件上传漏洞靶场详解https://cn-sec.com/archives/3660860.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息